给开发者的底层原理课--掘金小册课程推荐/优惠
版权声明
本站非掘金小册官网,与官方无任何关系。我们不提供课程下载或详细内容,仅作为课程分享和推荐平台。我们鼓励大家支持正版,尊重创作者的劳动成果,这样不仅能帮助创作者持续产出优质内容,也能让自己获得更好的学习体验。请通过官方渠道购买和学习课程,感谢您的理解与支持。
课程详情
课程介绍
作者介绍
我是挖坑的张师傅,目前主要工作在 C 厂从事 DevOps 后端、多云架构、边缘计算等相关开发工作,深耕一线开发。下面是我的一些标签:
- Vim 爱好者;
- Java 逃兵(出版过一本 JVM 字节码的书),狂爱 Go、Rust,现在每天日常写 Go 和 Rust;
- 喜欢造一些没什么用的轮子,用 Rust 重写过 Flannel,用 Go 实现过 DDIA 中的一些算法和数据结构;
- 喜欢排查各类疑难杂症,对 Linux 内核、网络等有较多兴趣,掘金上写过 50+ 问题排查的文章,还写过一个《深入理解 TCP 协议:从原理到实战》的小册子;
- 热衷于分享,掘金优秀作者,在掘金上上架了两本小册子,销量
1W+
。「Go 夜读」、「掘金开发者大会」讲师。
为什么写这本小册
我目前的主要工作集中在基础架构、DevOps 和边缘计算等领域。在日常工作中,我经常会遇到业务方面奇奇怪怪的问题,涉及容器网络、文件 I/O、内存等方面。在解决这些问题的过程中,我意识到,要找到问题的根因,需要扎实的底层原理知识作为支撑,否则只能靠“算命”。
我在掘金上发表了近 60 篇文章,几乎全部都与底层原理和问题排查定位相关。通过解决大量疑难杂症,我开始思考其中是否存在一些共通的知识点,可以总结出来帮助我们团队的成员提高定位问题的能力。另外,我们公司的人才发展中心在策划 “底层原理与问题定位分析” 的线下系列分享课程,这个小册子的内容其实就是这个系列分享的文字版资料,后面也会根据我们内部培训的实际反馈修改完善这本小册子。
这本小册子断断续续写了好久(历时 2 年+),一开始,我对如何定位这本书感到困惑,因为底层原理浩如烟海,但顾虑太多反而寸步难行。于是,我硬着头皮把这本小册子肝出来了,也算是自己的一个阶段性的总结吧。
这本小册涉及的主题非常广泛,每个主题都可以展开写一本书。在有限的篇幅内,我无法涵盖所有内容。因此,我选择从自己实际工作中遇到并解决过的问题出发,提炼出小册的知识点,侧重于动手实践,太偏的知识我不介绍,尽量做到每个知识点都可以得到验证,尽可能每个知识点你后面工作中都有可能会遇到。
目前还有不少内容在我 Notion 笔记中,尚未整理完毕。希望以后有时间能够补全知识版图,这本小册预期还会持续更新,敬请期待。
跟过往发表的 60+ 掘金文章有什么区别
我在掘金上发表的大约 60+ 篇文章也是偏向于底层原理和问题定位的,那小册子跟我的博客文章有什么区别呢?
小册子侧重于系统全面地介绍单个知识点,帮助你把点状的知识系统化,而博客文章则侧重于实战和案例演示。
为了帮助你更好地结合小册子中的内容进行学习,我专门列出了我最近在掘金上发表的博客文章及其对应的标签。这样,你可以更清楚地看到我们在小册子中介绍的工具和原理如何在实际业务中发挥巨大的作用。
小册介绍
这本小册大概分为 五大部分
,它们彼此相对独立,你可以选择你感兴趣的章节开始阅读:
- 基础篇
- CPU 篇
- 内存篇
- IO 篇
- 容器篇
基础篇
的内容涵盖了多个核心工具和技术的使用及原理,主要包含下面这些内容:
- 了解 GDB 的基本使用方法,包括如何启动调试、设置断点、查看变量和单步执行等;
- 揭开 GDB 的神秘面纱,深入探讨 GDB 的工作机制,了解其如何通过 ptrace 系统调用实现对被调试程序的控制和调试;
- 讲解如何使用 QEMU 和 GDB 调试 Linux 内核;
- 简单了解汇编语言的基本概念,能结合搜索引擎和大模型看懂理解汇编代码,从汇编的角度理解 C/C++、Go 的诸多细节;
- 探讨同步机制和锁的实现原理,介绍计算机先驱们是如何优化锁的;
- 带你深入理解线程本地存储 TLS 的实现原理;
- 介绍 Linux 系统中的时钟源和高性能计时方法,以及 vdso 系统调用的实现和应用;
- 介绍零拷贝技术的原理和实现,了解如何通过零拷贝提高数据传输效率;
- 介绍
LD_PRELOAD
的使用方法和应用场景,介绍在审计、故障注入、性能分析上的应用; - 深入分析系统调用的实现原理,如何传参,系统调用涉及的上下文切换等;
- 介绍 ftrace 和 trace-cmd 工具的使用方法,方便你追踪内核调用过程,理解业务的调用会触发那些内核函数;
- 手写 tcpdump。
CPU 篇
包含下面这些内容:
- 进程线程的本质,详细讲解 Linux 内核中 task_struct 结构;
- 介绍进程的各种状态及其转换条件,帮助你理解进程的生命周期,尤其是 D 状态等;
- 讲解孤儿进程和僵尸进程的概念及其处理方法;
- 探讨 Kubernetes 中的 pause 容器和僵尸进程问题;
- 介绍 D 状态进程的含义及其对系统负载的影响,如何构造 D 状态的进程;
- 详细讲解进程上下文切换的本质,让你了解上下文切换发生什么,了解其对系统性能的影响;
- 介绍完全公平调度(CFS)算法的原理和实现,理解线程是如何分配到 CPU 时间的;
- 介绍实时进程调度算法的原理和实现,很多内核线程都是以实时调度策略运行的,我们需要搞懂实时调度算法到底意味着什么;
- 介绍火焰图的概念和使用方法,帮助你分析和优化 CPU 性能;
- 讲解 CPU 亲和性和超线程技术的原理和应用,了解在多核处理器中我们应该注意什么;
- 通过实际代码示例,讲解如何手写协程,帮你了解协程的本质。
内存篇
包含下面这些内容:
- 理解虚拟内存和物理内存的概念;
- 比较 brk 和 mmap 两种内存分配系统调用的原理和应用场景,了解内存是如何分配的;
- 介绍进程内存分布的基本概念和结构,这在我们分析进程的内存占用时十分有用;
- 了解什么是缺页中断 PageFault;
- 深入分析 Linux OOM 机制,了解 overcommit、oom_score_adj 等概念;
- 讲解 malloc 和 free 函数的底层实现原理,理解 ptmalloc、jemalloc 等内存分配器的角色。
IO 篇
主要包含下面这些内容:
- 介绍虚拟文件系统(VFS)的概念和四大数据结构,理解 Linux 一切皆文件的精妙设计;
- 了解文件描述符(fd)分配的最低未使用原则;
- 重点理解文件描述符表(进程级)、打开文件列表(系统级)、i-node 表(系统级)这三者之间的关系;
- 剖析 epoll 源码,理解等待队列、epoll 数据结构、事件回调等知识。
容器篇
主要介绍容器原理以及网络相关的知识:
- 支撑容器实现的实现原理:cgroup、namespace、rootfs 等概念;
- 容器网络基石:veth、bridge、tun/tap 等;
- 剖析内核层 conntrack 的实现;
- 理解 iptables 的基础概念与自定义规则链;
- 详细介绍 DNS 的实现原理以及在各大语言中的注意事项;
- 介绍 ARP 的基础知识以及 GC 的注意事项;
- 通过源码走读,介绍 socket 编程中的核心函数的内核层实现。
为了方便你全面的概览小册子的内容,我列了一个这本小册的思维导图
:
最近发表的掘金博客文章及标签
为了方便你更好地结合我在掘金上公开发表的博客文章来学习小册子中的内容,我特意列出了过往博客的链接并添加了相应的标签。希望这些内容能帮助你更好地理解和掌握相关技术。
- 一次 MINIO+NFS 联合作妖导致的性能故障分析实录:
linux 内核
、NFS
、ftrace/trace-cmd
、strace
、tcpdump
、D 状态的线程
- DNS 故障竟是 ARP 的锅?一次网络故障排障实录:
网络
、DNS
、ARP
- 基于 Rust 的高性能 RocketMQ Proxy 在希沃多云的实践:
rust
、rocketmq协议
、内存分析
- 一次 Rancher 内存占用过高问题排查:
Go
、内存分析
- 一次从源码角度分析 jvm 类加载死锁问题:
GDB
、源码分析
- 一次 k3s 容器无法访问外网分析:
网络协议
、tcpdump
、iptables
icmp
、容器网络
- 一次 Dubbo 线程上下文类加载器的疑难杂症分析:
JVM
、源码分析
- 你一定不知道的一个类加载问题(JVM 源码分析篇):
GDB
、源码分析
、JVM
- 希沃 API 网关架构演进之路:
架构设计
- 一次疑似 JVM native 内存泄漏的排查实录:
GDB
、源码分析
、JVM
- 一次 Netty 不健壮导致的无限重连分析:
源码分析
、JVM
- 一次 Netty 代码不健壮导致的大量 CLOSE_WAIT 连接原因分析:
源码分析
、JVM
- 一次想不到的 Bootstrap 类加载器带来的 Native 内存泄露分析:
GDB
、源码分析
、JVM
、内存分析
- 一次有趣的 DNS 导致 Node 服务故障问题分析实录:
网络
、DNS
、libc 阻塞 DNS
、Node.js
、libuv
- 如何修改 Nginx 源码实现 worker 进程隔离:
源码分析
、性能优化
- 一些可以显著提高大型 Java 项目启动速度的尝试:
源码分析
、性能优化
、JVM
- Java 17 升级指南(持续更新):
JVM
- 一次 Kafka 导致的 Sentry 无法处理 MiniDump 问题分析:
网络协议
- 给 Netty 提交了一个 PR(CPU 缓存篇):
CPU
、cache
、性能优化
- 一次 APISIX 网关 503 的曲折排查(DNS 篇):
网络协议
、DNS
、源码修改
- 一次 Spring 无法启动的原因排查(字节码篇):
源码分析
、性能优化
、JVM
- 一次大量 JVM Native 内存泄露的排查分析(64M 问题):
GDB
、内存分析
- 一起 FastJSON 和 Spring-Mongo联合作妖的类卸载事故排查:
源码分析
、性能优化
、JVM
- 一次 HTTP2 通信失败的原因分析:
网络协议
、源码分析
- 一次有趣的 Docker 网络问题排查经历:
linux 内核
、netfilter
、iptables
、容器网络
- 一种探究 InnoDB 的存储格式的新方式:
源码分析
- 记一次 Kotlin Ktor 库的 PR 提交记录(TCP 自连接):
网络协议
、TCP
、源码分析
- 内存问题探微:
内存分析
、GDB
- 一次 ES-APM 导致的概率性大量线程阻塞问题排查:
源码分析
、性能优化
、JVM
、线程分析
- 一次 Java 进程 OOM 的排查分析(glibc 篇):
GDB
、内存分析
、ptmalloc
- 一次 JVM 进程退出的原因分析:
进程
、内存分析
- 程序员的自我修养之线程与栈:
线程与栈
、内存分析
、GDB
- 一次线上服务高 CPU 占用优化实践:
CPU
、火焰图
、性能优化
- Linux 中 D 状态的进程与平均负载:
进程状态
、内核
- RocketMQ 在使用上的一些排坑和优化:
源码分析
、性能优化
- 关于 /dev/null 差点直播吃鞋的一个小问题:
容器
、管道
、重定向
- 一次百万长连接压测 Nginx OOM 的问题排查分析:
GDB
、内存分析
、源码分析
、性能优化
- 给 wireshark 写一个 RocketMQ 协议解析的 lua 插件:
网络协议
- 再聊 TCP backlog:
Linux 内核
、三次握手
、源码分析
、网络协议
- 一次 Node.js http 连接池无法复用的问题排查:
网络协议
、源码分析
- ESTABLISHED 状态的连接收到 SYN 会回复什么?:
Linux 内核
、TCP
- 从源码分析 MySQL 死锁问题入门:
GDB
- Javac 源码调试教程:
源码分析
- 一次 Docker 容器内大量僵尸进程排查分析:
进程状态
、僵尸进程
、Docker
- 由 JVM Attach API 看跨进程通信中的信号和 Unix 域套接字:
进程与信号
、JVM
- Go 语言汇编入门 —— 从输出 HelloWorld 说起:
汇编
、Go
- 大招落地:MySQL 插入更新死锁的根因分析:
GDB
、源码分析
- 零拷贝你需要知道的事:
性能优化
- MySQL 死锁套路:一次诡异的批量插入死锁问题分析:
GDB
、源码分析
- 通过调试 Nginx 源码来定位有趣 Nginx 转发合并斜杠和编码问题:
GDB
、源码分析
- MySQL 死锁套路:再来看一例走不同索引更新的例子:
GDB
、源码分析
- MySQL 死锁套路:三个事务插入有一个回滚:
GDB
、源码分析
- MySQL 死锁套路:唯一索引下批量插入顺序不一致:
GDB
、源码分析
- 彻底弄懂 Nginx location 匹配:
GDB
、源码分析
- 如何在 Mac 下用 Clion 调试 MySQL 源码:
源码分析
- MySQL 死锁套路:走不同的索引更新:
GDB
、源码分析
- MySQL 死锁套路:唯一索引 S 锁与 X 锁的爱恨情仇:
GDB
、源码分析
适宜人群
这本小册覆盖的主题是比较广泛的,适用于下面这些人群:
-
开发工程师:无论是前端、后端、全栈还是移动端开发,深入理解 Linux 内核原理和系统编程,有助于写出更高质量、性能更好的代码。比如,通过学习内存管理原理,可以优化内存使用、分析内存泄露等问题。
-
运维/DevOps 工程师:运维工作与 Linux 系统密不可分。学习 Linux 内核,可以从根本上理解系统的方方面面,快速定位和解决各种疑难杂症。比如,GDB 和 ftrace 等调试工具的原理和使用,可以帮助更高效地排查故障。
-
测试开发工程师:学习 Linux 系统编程,更高效地排查问题根因、开发更强大的测试工具。
-
技术爱好者:对于热爱技术、喜欢探索的人来说,Linux 内核一直是一个神秘而有吸引力的领域。这本小册可以满足你的好奇心,让你对操作系统和计算机体系结构有更深刻的认识。
课程目录
- 初探进程的内存分布
- 虚拟内存与物理内存
- GDB 使用入门
- brk vs mmap 内存分配系统调用
- malloc 和 free 的底层原理
- CPU 与 CGroup
- 进程的上下文切换
- 探究系统调用的实现细节
- On CPU 和 Off CPU 火焰图
- CPU 亲和性、超线程介绍
- D 状态的进程与 load average
- 进程实时进程调度算法
- 进程线程的本质 task_struct
- CFS 调度算法
- 孤儿进程与僵尸进程
- 进程的状态
- 再说进程与线程
- 聊聊 page fault
- 深入探究线程本地存储(TLS)
- 深入剖析 Linux OOM
- 从汇编角度看原子操作
- GDB 的底层实现原理
- 详解 inode
- 深入探究 fd
- epoll 源码分析
- 协程的基本概念、手写汇编实现协程切换
- VFS 以及它的四大数据结构
- 容器网络之 veth
- 给用户态一个机会 tun/tap 设备
- 聊聊 Linux 的时钟源、高性能计时与 vDSO 系统调用
- 小册食用指南
- 剖析 conntrack 的底层实现
- iptable 的基石:netfilter 原理与实战
- k8s pause 容器与僵尸进程
- 实战使用 qemu + gdb 调试 Linux 内核以及网络配置
- 深入理解 DNS 的实现细节
- 容器网络基础之 Bridge
- 网络协议栈部分源码走读
- 汇编入门
- 同步和锁的本质
- 网络报文的导航地图-路由
- ARP 原理及实现
- iptables 的使用
- 分析内核调用的神器 ftrace 与 trace-cmd
- 容器技术基础
- 从汇编角度理解 Go 语言
- 在运行时修改程序行为的强大工具:LD_PRELOAD
- 200 行代码硬核读取 ext4 磁盘文件
- 手写一个迷你 tcpdump
- fork 炸弹与进程上限
- Linux进程内存占用的四种计算方式
- 综合应用:Service Mesh 透明代理 TPROXY 的技术原理