/proc、/sys 与内核接口
以目录和文件形式提供内核接口,观察进程状态、设备模型和资源控制。
判断依据
- /proc:进程现场、系统运行信息、部分内核参数;通常挂载 proc 文件系统。
- /sys:设备、驱动、内核对象及其属性关系;通常挂载 sysfs。
- 先用常用命令定位,再查原始接口;工具也可能通过 netlink / ioctl 与内核交互。
注意事项
- 多数内容在读取时生成,不是普通磁盘数据文件。
- /proc 并非只存进程,也并非全部只读;/sys 包含物理设备、虚拟设备及其他内核对象。
01 /proc/PID:进程现场
先用 ps / top 找到实际 PID,排查进程为什么异常。
命令
cat /proc/PID/limits
ls -l /proc/PID/fd
readlink -f /proc/PID/exe
tr '\0' ' ' < /proc/PID/cmdline
判断依据
- status → State、PPid、Threads、VmRSS 等状态
- limits → 当前进程已生效的资源软限制 / 硬限制
- fd/ → FD 到文件、pipe、socket 等对象的链接
- exe / cwd / cmdline → 程序位置、工作目录、启动参数
注意事项
01 /sys/class/net:网卡属性
先用 ip -br link 找接口名,检查网卡属性和累计统计。
命令
ip -br link
cat /sys/class/net/IFACE/operstate
ip -s link show dev IFACE
ethtool -S IFACE
判断依据
- operstate / carrier → 接口运行状态 / 链路载波状态
- statistics/ → rx_bytes、tx_bytes、rx_dropped 等累计值
- device → 设备关联(并非所有虚拟接口都有)
注意事项
- 接口 MTU 不等于整条路径的 MTU。
- IFACE 须替换为实际接口名。
02 /proc:系统运行统计
把指标读回含义:CPU 时间、可用内存、I/O 累计值、资源等待。
命令
mpstat -P ALL 1 5
free -h
iostat -xz -y 1 5
判断依据
- /proc/stat、/proc/loadavg → CPU 时间计数 / 负载
- /proc/meminfo、/proc/vmstat → 内存概况 / 虚拟内存统计
- /proc/diskstats → 块设备累计 I/O 统计
- /proc/pressure/{cpu,memory,io} → 资源压力 PSI(需内核支持)
注意事项
- 累计值应采样求差:速率 =(本次计数 − 上次计数)÷ 间隔秒数。
- PSI 需内核支持。
02 /sys/class/block:块设备
检查磁盘类型、排队方式以及设备层次。
命令
cat /sys/class/block/DEV/queue/scheduler
readlink -f /sys/class/block/DEV
lsblk -o NAME,TYPE,SIZE,ROTA
判断依据
- queue/scheduler → 可用 I/O 调度器;方括号标出当前项
- queue/rotational → 设备上报的旋转属性,不能直接判断性能
- stat → 块设备累计 I/O 计数
- 目录链接 → 可追溯到 /sys/devices 下的设备层次
注意事项
- DEV 选整盘设备,例如 sda / nvme0n1;分区不一定有 queue。
03 /proc/sys 与命名空间
核查参数和视图是否一致;/proc/sys 和 /sys 是两套不同接口。
命令
sysctl -n net.core.somaxconn
cat /proc/sys/net/core/somaxconn
findmnt -T /proc
判断依据
- /proc/sys/ → 支持 sysctl 的运行时内核参数
- /proc/sys/net/core/somaxconn ↔ net.core.somaxconn
- /proc/net/ → 当前进程所在网络命名空间的信息
- /proc/self/mountinfo → 当前进程的挂载视图
注意事项
- /proc/sys 是 /proc 的子目录。
- /proc/self 始终指向正在读取它的进程。
03 /sys:设备与驱动关系
同一设备可从不同入口查到;class 中的许多项是符号链接。
命令
readlink -f /sys/class/net/IFACE
cat /sys/devices/system/cpu/online
findmnt -T /sys
判断依据
- /sys/devices/、/sys/class/ → 设备层次 / 按功能分类的入口
- /sys/bus/ → 总线、设备和驱动的关系
- /sys/devices/system/cpu/online → 在线 CPU 列表,不是容器配额
- /sys/module/MODULE/parameters/ → 模块暴露的参数(按需)
注意事项
从进程定位 cgroup v2
从进程找到目标资源组,查看限额、计数增量与业务表现。
命令
findmnt -T /sys/fs/cgroup
cat /proc/PID/cgroup
systemctl show SERVICE -p ControlGroup --value
判断依据
- FSTYPE 为 cgroup2 时,再按图中 cgroup v2 文件排查;结合宿主机挂载点找目标组。
- CPU:cpu.max:配额 / 周期(微秒);max 表示本级不限。 cpu.stat:nr_throttled、throttled_usec 看增量。 200000 100000 ≈ 2 核时间预算,并非绑核。
- 内存:memory.current / memory.max:用量 / 上限。 memory.events:关注 max、oom、oom_kill。 结合内核日志与容器事件确认 OOM 来源。
- I/O:io.stat:按设备查看累计 I/O。 io.max:查看本组配置的 I/O 限制。 配合 iostat、I/O PSI 和业务时延判断。
注意事项
- /sys/fs/cgroup 通常另行挂载 cgroup 文件系统。
- 同时核查父级限制;容器内 PID、cgroup 路径与可见挂载可能不同。控制器未启用或权限受限时,部分文件可能不可见。
案例 A:Too many open files
找到 Nginx 报错的 worker PID,核对句柄数量和已生效限制。
命令
cat /proc/PID/limits
ls -1 /proc/PID/fd | wc -l
ls -l /proc/PID/fd
判断依据
- ls -l /proc/PID/fd 看对象类型。
- 判断:句柄数、软限制与错误时间是否对应?
注意事项
案例 B:网站慢与网卡丢包
找到请求实际经过的接口,核对网卡错误与业务异常时间。
命令
ip -s link show dev IFACE
判断依据
- 查看 statistics/rx_dropped 等字段;按固定间隔再采样,对比增量。
- 判断:错误增量是否与业务异常同时发生?
注意事项
案例 C:主机空闲但容器受限
找到宿主机 PID 与目标组路径 CG,检查容器变慢或重启。
命令
cat CG/cpu.max
cat CG/cpu.stat
cat CG/memory.events
判断依据
- 核对父级限制、内核日志与 Pod 事件。
- 判断:节流 / OOM 是否落在故障时间窗?
注意事项
- 通过 systemd / 容器部署配置修复并验证。
- CG 须替换为目标资源组的实际路径。
30 秒复述与现场练习
进程与运行信息查 /proc;设备属性查 /sys;资源限额查目标 cgroup。
判断依据
- 现场练习:老师示范查一个 PID → 共同核对网卡 → 遮图独立查句柄 → 换成容器场景,解释为何主机空闲仍可能受限。
- 复习落点:每卡说出一条证据;课末遮图复述;阶段排障重做;后续 Docker / K8s 再查。每个命令独立执行,中文分号用于分隔。
注意事项