Linux

Linux 内核学习

·26 分钟阅读·10069 字

Linux 内核学习路线与基础概念——用户态/内核态、进程管理、内存管理、文件系统、网络协议栈

📋 目录

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 / mpstatus(用户态)、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. 两类切换

  1. 进程/线程上下文切换:多任务抢占CPU导致,开销较大;切换频繁 → CPU 使用率虚高、业务延迟增加。
  2. 中断上下文切换:网卡、磁盘等硬件触发中断,CPU 立刻暂停当前任务去处理中断,优先级最高。

3.3.3. 运维观测

vmstat 1   # 字段 cs 就是每秒上下文切换次数,in 是中断次数

🧠 4. 地址空间与内存管理

内存是 Linux 性能调优的核心战场,涉及虚拟内存、页缓存、Swap、OOM 等关键机制。

4.1. 物理内存与虚拟内存

服务器真实硬件内存条,是物理存储介质,所有数据最终都存在这里。

内核为每一个进程分配独立的虚拟地址空间,进程只操作虚拟地址,由内核映射到真实物理内存。

  1. 内存隔离:进程之间互不干扰,一个进程崩溃不会影响其他进程。
  2. 内存扩容:结合 Swap 分区,把磁盘当作“临时内存”,缓解物理内存不足。
  3. 屏蔽硬件差异:应用无需关心物理内存布局。

每个进程虚拟地址分为两大部分:

  • 用户空间:进程私有,存放代码、堆、栈、库文件;不同进程互不共享。
  • 内核空间所有进程共享同一份,存放内核代码、页表、内核数据。

Linux 内存最小管理单位,默认 4KB

  • 页表:内核维护虚拟页 → 物理页的映射关系;页表过多会增加内核开销。
  • 扩展:大页内存(HugePage),放大页尺寸,减少页表数量,常用于 MySQL、Redis、高负载Java服务优化。

4.2. 缓存体系与脏页

Linux 会把空闲物理内存,大量用作文件/块设备缓存

  • 读取磁盘文件时,内核会缓存到内存,下次读取直接走内存,大幅提速。
  • 命令 free -hcached 就是页缓存。
  • 误区:内存使用率高 ≠ 内存泄漏,Linux 设计就是尽量利用内存做缓存。

应用修改了页缓存中的数据,但还没有同步刷写到磁盘,这类缓存页称为脏页。

  • 内核会根据阈值,后台自动刷盘;脏页过多会引发批量IO卡顿。
  • 核心调优参数:vm.dirty_ratiovm.dirty_background_ratio

早期区分:Buffer 面向块设备(磁盘),Cache 面向文件;新版内核已合并展示,日常统一看待即可。

4.3. Swap 交换分区

物理内存不足时,内核把长期不活跃的内存数据写入磁盘分区(Swap),腾出物理内存给活跃进程。

磁盘读写速度远低于内存,Swap 频繁使用 = 系统性能雪崩

  • 观测:vmstatsi(换入)、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 场景。
  • 内存区域划分 & 缓存体系
  1. 页缓存(Page Cache)
    磁盘文件、目录、块设备数据都会缓存到内存,加速读写。free 命令中 cached/buffers 就是页缓存。
  • 特点:Linux 会尽量利用空闲内存做缓存,内存使用率高≠内存泄漏。
  • 手动回收缓存:echo 3 > /proc/sys/vm/drop_caches(生产慎用,临时排查用)。
  1. 缓冲区 Buffer:针对块设备(磁盘);Cache:针对文件。新版内核已合并展示。
  2. 匿名页:进程堆、栈内存,无对应磁盘文件,是应用运行内存主体。

📊 5. 进程、线程与调度

进程管理是 CPU 性能排障的核心领域。

5.1. 基本定义

  • 进程:操作系统资源分配的最小单位(独立内存、文件句柄、网络连接)。
  • 线程:CPU 调度执行的最小单位,共享所属进程的资源。
  • Linux 实现:线程本质是轻量级进程(LWP),内核层面不严格区分进程与线程。

5.2. 进程状态(运维必背,排障基础)

通过 ps / top 查看状态标识:

  1. R 运行/可运行
    正在CPU上执行,或在就绪队列等待CPU调度。
  2. S 可中断睡眠
    进程等待事件(网络数据、磁盘IO、信号),可被信号唤醒,业务进程常态
  3. D 不可中断睡眠(Disk Sleep)
    进程卡在内核态IO(磁盘、存储、NFS),无法被 kill -9 终止。
    ✅ 典型故障:存储故障、磁盘卡死,大量D状态进程需优先查存储/磁盘。
  4. Z 僵尸进程
    子进程已退出,但父进程未回收进程描述符(PCB)。
    少量无影响;大量会占满进程表,导致无法创建新进程。
  5. T 停止态
    进程被暂停(调试、手动暂停)。

5.3. 进程优先级

  • nice 值:范围 -20 ~ 19数值越小,优先级越高
    命令:nice 启动进程、renice 动态调整优先级。
  • 实时优先级:针对系统底层服务,优先级高于普通业务进程。

5.4. 进程调度深入

  • 进程、线程、轻量级进程(LWP)
  • 进程:资源分配最小单位;线程:调度执行最小单位。
  • Linux 下线程本质是共享地址空间的轻量级进程
  • 查看命令:ps -efLpstreetop -H 查看线程。
  • 进程状态(必背,排障基础) Linux 经典进程状态:
  • R (运行/可运行):正在CPU执行 或 等待调度
  • S (可中断睡眠):等待事件(网络、IO、信号),绝大部分业务进程常态
  • D (不可中断睡眠)关键故障状态,进程卡在内核态IO(磁盘/存储卡死),无法被信号杀死,kill -9 无效
  • Z (僵尸进程):子进程退出,父进程未回收PCB,资源轻微泄漏,大量僵尸会占用进程表
  • T (停止):暂停/被调试
  • 进程调度器
  1. 调度分类
  • CFS 完全公平调度器(Linux 2.6.23+ 默认,主流):面向普通分时进程,公平分配CPU时间片。
  • 实时调度(SCHED_FIFO/SCHED_RR):用于底层服务、内核组件、低延迟程序。
  1. 调度优先级
  • nice 值:-20 ~ 19,值越小优先级越高,nice/renice 调整进程优先级。
  • 实时优先级:范围 0~99,优先级高于普通进程。
  • 进程上下文切换:不同进程切换,保存/恢复寄存器、栈,开销大。
  • 中断上下文切换:硬件触发中断(网卡、磁盘),优先级最高,抢占进程执行。
  • 指标查看:vmstatcs(上下文切换)、in(中断数)。
  • 运维高频问题&排查
  1. 大量 D 状态进程:磁盘IO卡死、存储阵列故障、NFS挂载超时。
    排查:iostat 看磁盘使用率、dmesg 看存储报错,不要反复 kill 进程。
  2. 大量 Z 僵尸进程:定位父进程,修复代码或重启父进程。
  3. CPU 高、上下文切换暴涨:线程数过多、锁竞争激烈、频繁系统调用。
  4. 调整进程优先级:对核心业务调高优先级,非核心任务降低。

⚡ 6. 中断、软中断与内核线程

中断是内核处理硬件事件的机制,理解中断对网络和磁盘 IO 排障至关重要。

6.1. 硬中断(IRQ)

由硬件(网卡、磁盘、键盘)触发,用来通知内核“硬件有事件发生”。

  • 特点:优先级极高,处理逻辑必须极简、快速,不能阻塞。

6.2. 软中断(SoftIRQ)

硬中断仅做快速响应,复杂逻辑(如网卡收包、磁盘数据处理)交给软中断异步处理。

  • 运维观测:top%si 代表软中断CPU占比。
  • 场景:高并发服务器、流量网关,软中断占比高属于正常;突增则排查网卡、队列、网络风暴。

6.3. 内核线程

内核后台守护线程(如 kswapd 内存回收、flush 脏页刷盘),由内核创建,用户无法杀死,常驻后台工作。

6.4. 软中断深入与性能影响

硬件(网卡、磁盘)触发,优先级最高,处理极简任务,耗时必须极短。 硬中断拆分出的后续复杂逻辑,网络收发包、磁盘IO 绝大部分耗时在软中断

  • 指标:top%si(软中断),高并发服务器 si 占比高属于正常,异常飙升则需排查网卡、队列。
  • 内核线程 内核后台线程(如 kthreaddkswapdflush 刷盘线程),用户无法kill,负责内存回收、脏页刷盘、硬件管理。

💾 7. 磁盘、文件系统与 IO 子系统

IO 瓶颈是运维排障的高频场景,理解 IO 栈模型和文件系统机制是必备技能。

7.1. IO 栈模型

  • 同步IO / 异步IO、阻塞/非阻塞IO,理解应用读写磁盘时内核的行为。
  • 块设备队列:磁盘请求队列,队列过长会导致IO延迟飙升。
  • IO 调度器
  1. xfs:CentOS8+ 默认,大磁盘、高并发IO性能更强,云服务器主流。
  2. 了解:日志机制、挂载参数(noatime 关闭访问时间,优化IO)、inode 与 block。 脏页过多会导致批量IO卡顿,数据库、高IO服务需要调优。
  • blockdev 工具调整磁盘预读、队列深度。
  1. iowait 过高:CPU 等待磁盘IO完成,瓶颈在存储。
  2. 磁盘使用率100%但吞吐量低:IO队列拥堵、调度器不合理、单盘热点。
  3. 优化方案:挂载加 noatime、调整脏页参数、切换IO调度器、拆分热点文件。

7.2. 文件系统

主流文件系统特性(运维必懂差异):

  1. ext4:CentOS7 默认,稳定、通用,日志文件系统。
  2. 了解:日志机制、挂载参数(noatime 关闭访问时间,优化IO)、inode 与 block。
  3. inode 耗尽:小文件过多(日志、缓存文件),df -i 排查。

🌐 8. 网络子系统

网络栈是云原生环境下最频繁涉及的内核子系统。

  • 内核TCP/IP协议栈 理解数据包走向:网卡 → 内核软中断 → 网络协议栈 → 应用Socket。
  • Socket 基础 & 连接状态 熟记 TCP 三次握手、四次挥手,以及 TCP 11种状态,重点关注:
  • LISTEN:监听端口
  • ESTABLISHED:正常活跃连接
  • TIME_WAIT:连接主动关闭后停留状态(默认60s),高并发短连接场景会大量堆积。
  • CLOSE_WAIT:被动关闭,应用未调用close释放fd,连接泄漏经典状态。
  • 内核网络队列(性能关键)
  1. 接收队列 rx发送队列 tx:网卡硬件队列 + 内核软件队列,队列溢出会丢包。
  2. 半连接队列 (syn queue):存放三次握手第一步连接,防SYN洪水攻击。
  3. 全连接队列 (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_*
  • 运维排查&优化
  1. 大量 TIME_WAIT:短连接高并发,开启端口复用、调整回收参数。
  2. 大量 CLOSE_WAIT:应用连接泄漏,检查代码/中间件连接池。
  3. 端口耗尽:扩大端口范围、优化连接池。
  4. 接口丢包、连接超时:检查队列大小、防火墙、网卡、TCP队列溢出。
  5. 工具:ssnetstattcpdumpnstat

📁 9. /proc 文件系统

/proc 是内核运行状态的窗口,运维排障第一入口。 不是真实磁盘文件,是内核运行状态的虚拟文件系统,挂载在 /proc

  • 作用:查看内核参数、进程状态、硬件信息、统计数据;临时修改内核运行参数。
  • 常用目录/文件:
  • /proc/cpuinfo:CPU信息
  • /proc/meminfo:内存详情
  • /proc/[pid]/:对应进程的所有信息
  • /proc/sys/:内核可动态调优参数(sysctl 命令本质就是读写这里)

📦 10. 容器相关内核基础

云原生时代运维核心,全部基于内核能力实现。 Docker/K8s 完全基于 Linux 内核两大特性实现:

  1. Namespace:资源隔离
    隔离 PID、网络、挂载、用户、主机名等,让容器看起来是独立虚拟机。
  2. Cgroup:资源限制
    限制容器 CPU、内存、磁盘IO、网络带宽,防止单个容器耗尽整机资源。 关键:容器共享宿主机内核,没有独立内核,宿主机内核参数、内核故障会影响所有容器。

10.1. 容器专属坑点(运维高频)

云原生时代运维核心,全部基于内核能力实现:

  • Namespace(资源隔离) 实现容器PID、网络、挂载、用户、IPC、主机名隔离,容器看起来是独立系统。
  • Cgroup(资源限制) 限制容器 CPU、内存、IO、网络使用率,对应内核子系统:
  • cpu:CPU 配额、权重
  • memory:内存上限、OOM 规则
  • blkio:磁盘IO限速
  • net_cls:网络限流
  • Capabilities Linux 权限细分,替代传统 root 超级权限,实现容器最小权限安全管控。
  • 容器专属坑点(运维高频)
  1. JVM 不识别 Cgroup 内存限制(老版本JDK),被系统OOM杀死。
  2. 容器内进程D状态、网络队列、文件描述符限制。
  3. 宿主机内核参数全局生效,容器共享内核,无独立内核

🔍 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:持久化内核日志。

  • 常见内核异常

  1. Oops:内核段错误,轻微异常,记录出错位置。
  2. Kernel Panic:内核严重错误,系统直接挂起/重启。
  3. Hard Lockup / Soft Lockup:内核死锁、CPU 挂死。
  • 调试工具(选学,资深运维/问题复盘用)
  • crash + vmcore:分析内核崩溃转储文件。
  • strace:跟踪进程系统调用,定位应用卡顿、文件/网络异常(运维日常高频工具)。
  • perf:Linux 性能分析神器,采样CPU、内存、调用栈,定位内核/应用热点。

📋 12. 概念速记(面试/复盘精简版)

  1. 用户态:应用运行,权限受限;内核态:硬件管理,最高权限,通过系统调用切换。
  2. 虚拟内存:进程独立地址空间,隔离进程、结合Swap扩容内存。
  3. 进程:资源单位;线程:调度单位;Linux 线程是轻量级进程。
  4. D状态进程:内核IO阻塞,杀不掉;僵尸进程Z:子进程未被父进程回收。
  5. 中断/软中断:硬件事件处理,%si 过高需排查网络/磁盘。
  6. 页缓存:Linux 利用空闲内存加速IO,内存高不一定是泄漏。
  7. Swap:内存救急,但严重影响性能,生产尽量关闭。
  8. OOM Killer:内存耗尽时内核杀进程保系统,dmesg 定位被杀进程。
  9. /proc:虚拟文件系统,查看、修改内核运行参数。
  10. Namespace+Cgroup:容器两大内核基石。

🛠️ 13. 必备工具清单

日常运维高频工具分类整理。

类别工具用途
综合监控tophtopvmstatmpstatpidstatCPU、内存、进程整体监控
磁盘 IOiostatiotopblockdev磁盘性能与 IO 瓶颈定位
网络ssnetstattcpdumproutenstat连接状态、抓包、路由、网络统计
内存freeslabtop内存使用、内核 slab 分配器
进程/调用跟踪stracegdbperf系统调用跟踪、调试、性能采样
内核参数sysctlsysctl -p运行时查看/修改内核参数
内核日志dmesg内核环形日志,硬件/驱动/OOM 报错第一入口

📈 14. 学习路线与进阶

按「基础认知 → 核心子系统 → 工具实操 → 故障排查 → 调优参数」分层梳理,区分必学选学,贴合运维工作场景。

14.1. 整体学习路线(由浅入深)

  1. 内核基础概念:版本、运行模式、用户态/内核态
  2. 进程管理与调度(重中之重,CPU 瓶颈根源):进程状态、上下文切换、调度器
  3. 内存管理:物理内存、虚拟内存、PageCache、Swap、OOM Killer
  4. 文件系统与磁盘 IO(磁盘瓶颈核心):IO 栈模型、文件系统、inode、IO 调度器
  5. 网络子系统:TCP/IP 协议栈、连接状态、队列、内核网络参数
  6. 中断、软中断、内核线程:理解 IRQ/SoftIRQ 对网络和磁盘性能的影响
  7. 内核日志与崩溃排查:panic、oops、死锁、vmcore
  8. 容器相关内核特性:Namespace、Cgroup、Capabilities(Docker/K8s 必备)
  9. 内核监控与调试工具实战:perf、strace、crash
  10. 系统全局调优/procsysctl 参数体系

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 原理与坑点
  • straceperf 基础使用

高级运维/架构师(选学)

  • 调度器源码思想、内存碎片、HugePage
  • 内核崩溃 Oops/Panic 分析、vmcore 解析
  • 网络协议栈深层原理、网卡多队列、RSS
  • 内核编译、补丁、定制内核

14.3. 学习建议与避坑

  1. 拒绝一上来读内核源码:运维先「会用、会看、会调、会排障」,源码是底层开发工作
  2. 结合故障学:遇到 OOM、D 进程、网络超时、IO 高、CPU 软中断高,顺着问题追溯内核机制,记忆最深
  3. 吃透 /proc 文件系统:内核所有运行状态、参数、统计数据都在这里,是理解内核的窗口
  4. 先理论,再实操:每学一个模块,就用对应命令查看指标、修改参数验证效果

🔗 15. 关联文档

关联文档