Linux 内核学习
Linux 内核基础知识与系统化学习路线,面向运维工程师。
💡 1. 内核基础概念
1.1. 内核概述
Linux 内核是操作系统的核心程序,向下管理硬件(CPU、内存、磁盘、网卡),向上为应用程序提供运行环境、系统调用、资源隔离与调度。
- 所有软硬件交互、资源竞争、权限管控,都由内核统一处理。
- 运维视角:应用性能问题、系统卡顿、宕机、网络/IO异常,最终都能追溯到内核行为。
1.2. 核心概念速览
内核基础概念是运维排障的认知地基,以下为主要知识点:
- 用户态 & 内核态:应用程序运行在用户态(权限受限),内核代码运行在内核态(最高权限)。应用通过系统调用(如
read()、write()、socket())主动陷入内核态完成硬件操作。 - 上下文切换:进程/线程切换或中断触发时,CPU 保存/恢复执行现场。切换频繁 = 性能损耗,是 CPU 利用率虚高、业务延迟增加的常见原因。
- 虚拟内存:每个进程拥有独立的虚拟地址空间,由内核映射到物理内存,实现进程隔离和内存扩容。
- 进程状态:
R(运行)、S(睡眠)、D(不可中断睡眠)、Z(僵尸)。D状态是 IO 问题典型信号,Z状态通常需排查父进程逻辑。
1.3. 运维关注点
- 观察
top/mpstat中us(用户态)、sy(内核态)、id(空闲)占比,判断瓶颈在应用还是内核。 - 上下文切换指标
cs、中断指标in通过vmstat 1查看,频繁切换会导致业务响应变慢。 strace跟踪进程系统调用,是定位应用卡顿、文件/网络异常的日常高频工具。
📌 2. 内核版本
2.1. 版本查看
uname -r
示例:3.10.0-1160.el7.x86_64
- 主版本.次版本.修订版本-发行版标识
- 次版本偶数:稳定版(生产首选);奇数:开发测试版(不上线)
2.2. 企业主流版本
- CentOS7:
3.10(经典长支持版,存量最多) - CentOS8/龙蜥/欧拉:
4.19 - 云服务器、新业务:
5.4/5.15(新特性多,性能、容器、网络优化更强)
2.3. 版本差异关注点
不同内核在内存管理、TCP协议栈、IO调度、Cgroup、容器特性上行为不同,同一份调优参数在不同版本效果可能有差异。
🔄 3. 用户态 & 内核态
这是 Linux 内核最核心的概念,也是运维排障的认知基础。
3.1. 运行模式概述
3.1.1. 用户态(User Mode)
- 普通应用运行的环境(Java、Nginx、MySQL、Shell 等)。
- 权限受限:不能直接操作硬件、不能访问内核内存。
- 应用所有代码默认跑在用户态。
3.1.2. 内核态(Kernel Mode)
- 内核代码运行环境,拥有最高权限,可直接操作所有硬件、全量内存、寄存器。
- 负责资源调度、中断处理、硬件交互。
3.2. 系统调用(切换入口)
应用需要读写文件、收发网络包、申请内存、创建进程时,必须通过系统调用主动从用户态陷入内核态。
- 举例:
read()、write()、socket()、fork()都是系统调用。 - 查看工具:
strace跟踪进程所有系统调用,排障神器。
3.3. 上下文切换(Context Switch)
3.3.1. 定义
CPU 从执行一个任务,切换到执行另一个任务,需要保存/恢复寄存器、栈、程序计数器等现场,这个过程就是上下文切换。
3.3.2. 两类切换
- 进程/线程上下文切换:多任务抢占CPU导致,开销较大;切换频繁 → CPU 使用率虚高、业务延迟增加。
- 中断上下文切换:网卡、磁盘等硬件触发中断,CPU 立刻暂停当前任务去处理中断,优先级最高。
3.3.3. 运维观测
vmstat 1 # 字段 cs 就是每秒上下文切换次数,in 是中断次数
🧠 4. 地址空间与内存管理
内存是 Linux 性能调优的核心战场,涉及虚拟内存、页缓存、Swap、OOM 等关键机制。
4.1. 物理内存与虚拟内存
服务器真实硬件内存条,是物理存储介质,所有数据最终都存在这里。
内核为每一个进程分配独立的虚拟地址空间,进程只操作虚拟地址,由内核映射到真实物理内存。
- 内存隔离:进程之间互不干扰,一个进程崩溃不会影响其他进程。
- 内存扩容:结合 Swap 分区,把磁盘当作“临时内存”,缓解物理内存不足。
- 屏蔽硬件差异:应用无需关心物理内存布局。
每个进程虚拟地址分为两大部分:
- 用户空间:进程私有,存放代码、堆、栈、库文件;不同进程互不共享。
- 内核空间:所有进程共享同一份,存放内核代码、页表、内核数据。
Linux 内存最小管理单位,默认 4KB。
- 页表:内核维护虚拟页 → 物理页的映射关系;页表过多会增加内核开销。
- 扩展:大页内存(HugePage),放大页尺寸,减少页表数量,常用于 MySQL、Redis、高负载Java服务优化。
4.2. 缓存体系与脏页
Linux 会把空闲物理内存,大量用作文件/块设备缓存。
- 读取磁盘文件时,内核会缓存到内存,下次读取直接走内存,大幅提速。
- 命令
free -h中cached就是页缓存。 - 误区:内存使用率高 ≠ 内存泄漏,Linux 设计就是尽量利用内存做缓存。
应用修改了页缓存中的数据,但还没有同步刷写到磁盘,这类缓存页称为脏页。
- 内核会根据阈值,后台自动刷盘;脏页过多会引发批量IO卡顿。
- 核心调优参数:
vm.dirty_ratio、vm.dirty_background_ratio。
早期区分:Buffer 面向块设备(磁盘),Cache 面向文件;新版内核已合并展示,日常统一看待即可。
4.3. Swap 交换分区
物理内存不足时,内核把长期不活跃的内存数据写入磁盘分区(Swap),腾出物理内存给活跃进程。
磁盘读写速度远低于内存,Swap 频繁使用 = 系统性能雪崩。
- 观测:
vmstat中si(换入)、so(换出),非0代表正在使用Swap。 - 核心参数
swappiness:取值 0~100,数值越大,内核越倾向使用Swap;生产服务器建议设为 0 或 10,尽量禁用Swap。
4.4. OOM Killer(内存溢出杀手)
整机物理内存 + Swap 全部耗尽,内核无法分配新内存,为保证系统存活,主动触发 OOM Killer 杀死进程释放内存。
内核给每个进程计算 oom_score 分数,优先杀死分数高、内存占用大、优先级低的进程。
dmesg -T | grep -i "out of memory"
容器、Java 应用被意外杀死,绝大多数根源都是 OOM Killer。
4.5. 内存管理核心机制与调优
- 核心概念
- 物理内存:服务器真实硬件内存。
- 虚拟内存:内核为每个进程分配独立虚拟地址空间,隔离进程、解决内存碎片化。
- 页(Page):内存最小管理单位,默认 4KB,大页内存(HugePage)优化数据库/Java 场景。
- 内存区域划分 & 缓存体系
- 页缓存(Page Cache)
磁盘文件、目录、块设备数据都会缓存到内存,加速读写。free命令中cached/buffers就是页缓存。
- 特点:Linux 会尽量利用空闲内存做缓存,内存使用率高≠内存泄漏。
- 手动回收缓存:
echo 3 > /proc/sys/vm/drop_caches(生产慎用,临时排查用)。
- 缓冲区 Buffer:针对块设备(磁盘);Cache:针对文件。新版内核已合并展示。
- 匿名页:进程堆、栈内存,无对应磁盘文件,是应用运行内存主体。
📊 5. 进程、线程与调度
进程管理是 CPU 性能排障的核心领域。
5.1. 基本定义
- 进程:操作系统资源分配的最小单位(独立内存、文件句柄、网络连接)。
- 线程:CPU 调度执行的最小单位,共享所属进程的资源。
- Linux 实现:线程本质是轻量级进程(LWP),内核层面不严格区分进程与线程。
5.2. 进程状态(运维必背,排障基础)
通过 ps / top 查看状态标识:
- R 运行/可运行
正在CPU上执行,或在就绪队列等待CPU调度。 - S 可中断睡眠
进程等待事件(网络数据、磁盘IO、信号),可被信号唤醒,业务进程常态。 - D 不可中断睡眠(Disk Sleep)
进程卡在内核态IO(磁盘、存储、NFS),无法被kill -9终止。
✅ 典型故障:存储故障、磁盘卡死,大量D状态进程需优先查存储/磁盘。 - Z 僵尸进程
子进程已退出,但父进程未回收进程描述符(PCB)。
少量无影响;大量会占满进程表,导致无法创建新进程。 - T 停止态
进程被暂停(调试、手动暂停)。
5.3. 进程优先级
nice值:范围-20 ~ 19,数值越小,优先级越高。
命令:nice启动进程、renice动态调整优先级。- 实时优先级:针对系统底层服务,优先级高于普通业务进程。
5.4. 进程调度深入
- 进程、线程、轻量级进程(LWP)
- 进程:资源分配最小单位;线程:调度执行最小单位。
- Linux 下线程本质是共享地址空间的轻量级进程。
- 查看命令:
ps -efL、pstree、top -H查看线程。 - 进程状态(必背,排障基础) Linux 经典进程状态:
- R (运行/可运行):正在CPU执行 或 等待调度
- S (可中断睡眠):等待事件(网络、IO、信号),绝大部分业务进程常态
- D (不可中断睡眠):关键故障状态,进程卡在内核态IO(磁盘/存储卡死),无法被信号杀死,
kill -9无效 - Z (僵尸进程):子进程退出,父进程未回收PCB,资源轻微泄漏,大量僵尸会占用进程表
- T (停止):暂停/被调试
- 进程调度器
- 调度分类
- CFS 完全公平调度器(Linux 2.6.23+ 默认,主流):面向普通分时进程,公平分配CPU时间片。
- 实时调度(SCHED_FIFO/SCHED_RR):用于底层服务、内核组件、低延迟程序。
- 调度优先级
nice值:-20 ~ 19,值越小优先级越高,nice/renice调整进程优先级。- 实时优先级:范围 0~99,优先级高于普通进程。
- 进程上下文切换:不同进程切换,保存/恢复寄存器、栈,开销大。
- 中断上下文切换:硬件触发中断(网卡、磁盘),优先级最高,抢占进程执行。
- 指标查看:
vmstat中cs(上下文切换)、in(中断数)。 - 运维高频问题&排查
- 大量 D 状态进程:磁盘IO卡死、存储阵列故障、NFS挂载超时。
排查:iostat看磁盘使用率、dmesg看存储报错,不要反复 kill 进程。 - 大量 Z 僵尸进程:定位父进程,修复代码或重启父进程。
- CPU 高、上下文切换暴涨:线程数过多、锁竞争激烈、频繁系统调用。
- 调整进程优先级:对核心业务调高优先级,非核心任务降低。
⚡ 6. 中断、软中断与内核线程
中断是内核处理硬件事件的机制,理解中断对网络和磁盘 IO 排障至关重要。
6.1. 硬中断(IRQ)
由硬件(网卡、磁盘、键盘)触发,用来通知内核“硬件有事件发生”。
- 特点:优先级极高,处理逻辑必须极简、快速,不能阻塞。
6.2. 软中断(SoftIRQ)
硬中断仅做快速响应,复杂逻辑(如网卡收包、磁盘数据处理)交给软中断异步处理。
- 运维观测:
top中%si代表软中断CPU占比。 - 场景:高并发服务器、流量网关,软中断占比高属于正常;突增则排查网卡、队列、网络风暴。
6.3. 内核线程
内核后台守护线程(如 kswapd 内存回收、flush 脏页刷盘),由内核创建,用户无法杀死,常驻后台工作。
6.4. 软中断深入与性能影响
硬件(网卡、磁盘)触发,优先级最高,处理极简任务,耗时必须极短。 硬中断拆分出的后续复杂逻辑,网络收发包、磁盘IO 绝大部分耗时在软中断。
- 指标:
top中%si(软中断),高并发服务器si占比高属于正常,异常飙升则需排查网卡、队列。 - 内核线程
内核后台线程(如
kthreadd、kswapd、flush刷盘线程),用户无法kill,负责内存回收、脏页刷盘、硬件管理。
💾 7. 磁盘、文件系统与 IO 子系统
IO 瓶颈是运维排障的高频场景,理解 IO 栈模型和文件系统机制是必备技能。
7.1. IO 栈模型
- 同步IO / 异步IO、阻塞/非阻塞IO,理解应用读写磁盘时内核的行为。
- 块设备队列:磁盘请求队列,队列过长会导致IO延迟飙升。
- IO 调度器
- xfs:CentOS8+ 默认,大磁盘、高并发IO性能更强,云服务器主流。
- 了解:日志机制、挂载参数(
noatime关闭访问时间,优化IO)、inode 与 block。 脏页过多会导致批量IO卡顿,数据库、高IO服务需要调优。
blockdev工具调整磁盘预读、队列深度。
iowait过高:CPU 等待磁盘IO完成,瓶颈在存储。- 磁盘使用率100%但吞吐量低:IO队列拥堵、调度器不合理、单盘热点。
- 优化方案:挂载加
noatime、调整脏页参数、切换IO调度器、拆分热点文件。
7.2. 文件系统
主流文件系统特性(运维必懂差异):
- ext4:CentOS7 默认,稳定、通用,日志文件系统。
- 了解:日志机制、挂载参数(
noatime关闭访问时间,优化IO)、inode 与 block。 - inode 耗尽:小文件过多(日志、缓存文件),
df -i排查。
🌐 8. 网络子系统
网络栈是云原生环境下最频繁涉及的内核子系统。
- 内核TCP/IP协议栈 理解数据包走向:网卡 → 内核软中断 → 网络协议栈 → 应用Socket。
- Socket 基础 & 连接状态 熟记 TCP 三次握手、四次挥手,以及 TCP 11种状态,重点关注:
- LISTEN:监听端口
- ESTABLISHED:正常活跃连接
- TIME_WAIT:连接主动关闭后停留状态(默认60s),高并发短连接场景会大量堆积。
- CLOSE_WAIT:被动关闭,应用未调用close释放fd,连接泄漏经典状态。
- 内核网络队列(性能关键)
- 接收队列 rx、发送队列 tx:网卡硬件队列 + 内核软件队列,队列溢出会丢包。
- 半连接队列 (syn queue):存放三次握手第一步连接,防SYN洪水攻击。
- 全连接队列 (accept queue):完成握手、等待应用
accept取走的连接,队列满直接丢新连接。
- 核心网络内核参数(
sysctl.conf日常调优)
- 端口范围,扩大可用临时端口
net.ipv4.ip_local_port_range
- 调整TIME_WAIT复用、快速回收
net.ipv4.tcp_tw_reuse
net.ipv4.tcp_tw_recycle
- 全连接/半连接队列大小
net.core.somaxconn
net.ipv4.tcp_syncookies
- TCP 读写缓冲区
net.core.rmem_max
net.core.wmem_max
- Keepalive 保活参数,检测僵死连接
net.ipv4.tcp_keepalive_*
- 运维排查&优化
- 大量
TIME_WAIT:短连接高并发,开启端口复用、调整回收参数。 - 大量
CLOSE_WAIT:应用连接泄漏,检查代码/中间件连接池。 - 端口耗尽:扩大端口范围、优化连接池。
- 接口丢包、连接超时:检查队列大小、防火墙、网卡、TCP队列溢出。
- 工具:
ss、netstat、tcpdump、nstat。
📁 9. /proc 文件系统
/proc 是内核运行状态的窗口,运维排障第一入口。 不是真实磁盘文件,是内核运行状态的虚拟文件系统,挂载在
/proc。
- 作用:查看内核参数、进程状态、硬件信息、统计数据;临时修改内核运行参数。
- 常用目录/文件:
/proc/cpuinfo:CPU信息/proc/meminfo:内存详情/proc/[pid]/:对应进程的所有信息/proc/sys/:内核可动态调优参数(sysctl命令本质就是读写这里)
📦 10. 容器相关内核基础
云原生时代运维核心,全部基于内核能力实现。 Docker/K8s 完全基于 Linux 内核两大特性实现:
- Namespace:资源隔离
隔离 PID、网络、挂载、用户、主机名等,让容器看起来是独立虚拟机。 - Cgroup:资源限制
限制容器 CPU、内存、磁盘IO、网络带宽,防止单个容器耗尽整机资源。 关键:容器共享宿主机内核,没有独立内核,宿主机内核参数、内核故障会影响所有容器。
10.1. 容器专属坑点(运维高频)
云原生时代运维核心,全部基于内核能力实现:
- Namespace(资源隔离) 实现容器PID、网络、挂载、用户、IPC、主机名隔离,容器看起来是独立系统。
- Cgroup(资源限制) 限制容器 CPU、内存、IO、网络使用率,对应内核子系统:
- cpu:CPU 配额、权重
- memory:内存上限、OOM 规则
- blkio:磁盘IO限速
- net_cls:网络限流
- Capabilities Linux 权限细分,替代传统 root 超级权限,实现容器最小权限安全管控。
- 容器专属坑点(运维高频)
- JVM 不识别 Cgroup 内存限制(老版本JDK),被系统OOM杀死。
- 容器内进程D状态、网络队列、文件描述符限制。
- 宿主机内核参数全局生效,容器共享内核,无独立内核。
🔍 11. 内核日志与异常排查
11.1. 日志入口
dmesg # 内核环形日志,排障第一优先级
cat /var/log/messages # CentOS 持久化内核日志
11.2. 常见内核异常
-
Oops:内核轻微错误,程序异常,系统一般不重启。
-
Kernel Panic:内核严重故障,系统卡死/自动重启。
-
Hard/Soft Lockup:内核死锁、CPU挂死。
-
日志查看
-
dmesg:内核环形日志,硬件报错、OOM、IO错误、网络异常、panic 第一查询入口。 -
/var/log/messages//var/log/kern.log:持久化内核日志。 -
常见内核异常
- Oops:内核段错误,轻微异常,记录出错位置。
- Kernel Panic:内核严重错误,系统直接挂起/重启。
- Hard Lockup / Soft Lockup:内核死锁、CPU 挂死。
- 调试工具(选学,资深运维/问题复盘用)
crash+vmcore:分析内核崩溃转储文件。strace:跟踪进程系统调用,定位应用卡顿、文件/网络异常(运维日常高频工具)。perf:Linux 性能分析神器,采样CPU、内存、调用栈,定位内核/应用热点。
📋 12. 概念速记(面试/复盘精简版)
- 用户态:应用运行,权限受限;内核态:硬件管理,最高权限,通过系统调用切换。
- 虚拟内存:进程独立地址空间,隔离进程、结合Swap扩容内存。
- 进程:资源单位;线程:调度单位;Linux 线程是轻量级进程。
- D状态进程:内核IO阻塞,杀不掉;僵尸进程Z:子进程未被父进程回收。
- 中断/软中断:硬件事件处理,
%si过高需排查网络/磁盘。 - 页缓存:Linux 利用空闲内存加速IO,内存高不一定是泄漏。
- Swap:内存救急,但严重影响性能,生产尽量关闭。
- OOM Killer:内存耗尽时内核杀进程保系统,
dmesg定位被杀进程。 - /proc:虚拟文件系统,查看、修改内核运行参数。
- Namespace+Cgroup:容器两大内核基石。
🛠️ 13. 必备工具清单
日常运维高频工具分类整理。
| 类别 | 工具 | 用途 |
|---|---|---|
| 综合监控 | top、htop、vmstat、mpstat、pidstat | CPU、内存、进程整体监控 |
| 磁盘 IO | iostat、iotop、blockdev | 磁盘性能与 IO 瓶颈定位 |
| 网络 | ss、netstat、tcpdump、route、nstat | 连接状态、抓包、路由、网络统计 |
| 内存 | free、slabtop | 内存使用、内核 slab 分配器 |
| 进程/调用跟踪 | strace、gdb、perf | 系统调用跟踪、调试、性能采样 |
| 内核参数 | sysctl、sysctl -p | 运行时查看/修改内核参数 |
| 内核日志 | dmesg | 内核环形日志,硬件/驱动/OOM 报错第一入口 |
📈 14. 学习路线与进阶
按「基础认知 → 核心子系统 → 工具实操 → 故障排查 → 调优参数」分层梳理,区分必学和选学,贴合运维工作场景。
14.1. 整体学习路线(由浅入深)
- 内核基础概念:版本、运行模式、用户态/内核态
- 进程管理与调度(重中之重,CPU 瓶颈根源):进程状态、上下文切换、调度器
- 内存管理:物理内存、虚拟内存、PageCache、Swap、OOM Killer
- 文件系统与磁盘 IO(磁盘瓶颈核心):IO 栈模型、文件系统、inode、IO 调度器
- 网络子系统:TCP/IP 协议栈、连接状态、队列、内核网络参数
- 中断、软中断、内核线程:理解 IRQ/SoftIRQ 对网络和磁盘性能的影响
- 内核日志与崩溃排查:panic、oops、死锁、vmcore
- 容器相关内核特性:Namespace、Cgroup、Capabilities(Docker/K8s 必备)
- 内核监控与调试工具实战:perf、strace、crash
- 系统全局调优:
/proc与sysctl参数体系
14.2. 运维学习分级(按岗位区分)
初级运维(必掌握)
- 用户态/内核态、进程状态、僵尸进程、D 状态
- 内存组成、Cache/Buffer、Swap、OOM Killer
- TCP 连接状态、TIME_WAIT/CLOSE_WAIT 问题排查
- 基础内核日志
dmesg解读 - 常用监控指标解读(us/sy/id、%si、iowait、cs)
- 基础
sysctl网络、内存参数调优
中级运维(生产主力,必须吃透)
- 进程调度、上下文切换、中断/软中断原理
- 页缓存、脏页刷盘、内存调优全套参数
- IO 调度器、文件系统、inode/block、IO 瓶颈定位
- TCP 队列、连接池管理、网络高阶调优
- Docker/K8s 对应的 Namespace/Cgroup 原理与坑点
strace、perf基础使用
高级运维/架构师(选学)
- 调度器源码思想、内存碎片、HugePage
- 内核崩溃 Oops/Panic 分析、vmcore 解析
- 网络协议栈深层原理、网卡多队列、RSS
- 内核编译、补丁、定制内核
14.3. 学习建议与避坑
- 拒绝一上来读内核源码:运维先「会用、会看、会调、会排障」,源码是底层开发工作
- 结合故障学:遇到 OOM、D 进程、网络超时、IO 高、CPU 软中断高,顺着问题追溯内核机制,记忆最深
- 吃透 /proc 文件系统:内核所有运行状态、参数、统计数据都在这里,是理解内核的窗口
- 先理论,再实操:每学一个模块,就用对应命令查看指标、修改参数验证效果
🔗 15. 关联文档
关联文档
- Linux 调试与追踪工具 — 内核调试工具
- perf 命令详解 — 性能分析
- Linux 磁盘管理 — 存储与文件系统
- PageCache 原理 — 缓存机制
- 用户态与内核态 — 运行模式