如何使用procfs来排查问题

/proc 文件系统:内核的 "实时状态面板"

/proc 是一个伪文件系统 ,里面的文件不是真存在硬盘上 ,而是内核实时生成的,用来暴露内核状态、进程信息、硬件信息、系统参数。

下面按类别给你讲清楚:有啥、干啥用、怎么看


一、进程相关(最常用)

/proc/[PID]/

每个进程一个目录,比如 /proc/1 是 init/systemd。

里面常用文件:

  • cmdline:启动命令
  • cwd:当前工作目录
  • environ:环境变量
  • fd/:打开的文件描述符(查句柄泄漏)
  • maps:内存映射(库、堆、栈)
  • status:进程状态、PID、PPID、内存、线程数
  • stat/statm:更精简的状态 / 内存信息
  • io:IO 读写统计

用途:

  • 查进程卡死、内存泄漏、句柄泄漏
  • 看进程到底在干嘛

二、系统全局信息

/proc/cpuinfo

CPU 型号、核心数、架构、特性(ARM/x86 都能用)

/proc/meminfo

内存总大小、空闲、缓存、交换分区看内存够不够最准。

/proc/loadavg

1/5/15 分钟系统负载判断系统忙不忙。

/proc/uptime

系统开机时间。

/proc/version

内核版本、gcc 版本。

/proc/cmdline

内核启动参数(bootargs)。


三、硬件与设备

/proc/interrupts

中断统计,看哪个硬件在频繁触发中断。

/proc/ioports

I/O 端口占用(x86 常用)。

/proc/dma

DMA 通道使用情况。

/proc/mounts

当前挂载的所有文件系统(比 mount 命令更原始)。

/proc/partitions

块设备分区信息(类似 lsblk)。


四、网络相关

/proc/net/dev

网卡流量统计

/proc/net/tcp/proc/net/udp

TCP/UDP 连接列表(比 netstat 底层)

/proc/net/arp

ARP 表

/proc/sys/net/...

网络参数(丢包、转发、端口范围等)


五、可读写的系统配置(sysctl)

/proc/sys/

可以直接读写内核参数,不用重启。

常见:

  • /proc/sys/net/ipv4/ip_forward开启 / 关闭 IP 转发
  • /proc/sys/fs/file-max最大打开文件数
  • /proc/sys/vm/swappiness交换分区使用倾向

用法:

复制代码
cat /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_forward

六、调试 / 内核信息

/proc/kmsg

内核日志(dmesg 就是读它)

/proc/slabinfo

内核内存池分配(查内核内存泄漏)

/proc/modules

已加载内核模块(lsmod 读的就是它)

/proc/filesystems

支持的文件系统类型

/proc/locks

文件锁


七、简单总结(最实用版)

  • 查进程/proc/[PID]
  • 查 CPU / 内存 / 负载 → cpuinfo、meminfo、loadavg
  • 查网络 → net/tcp、net/udp、net/dev
  • 查硬件 / 中断 → interrupts、partitions
  • 改内核参数/proc/sys
  • 查内核日志 → kmsg
  • 查挂载 / 模块 → mounts、modules

一句话:/proc 就是内核把自己的内脏摊开给你看,还允许你实时调参数。

/proc/PID/

直接给你列 /proc/PID/ 下最常用、调试必看的文件,按用途分类,一看就懂。

一、进程基本信息

  • **status**进程状态、PID、PPID、UID、GID、内存、线程数、信号掩码等。最常用。
  • **stat**更精简的状态信息(给程序读的)。
  • **statm**内存页信息。
  • **cmdline**启动进程的完整命令行参数。
  • **cwd**软链接 → 当前工作目录。
  • **exe**软链接 → 可执行文件真实路径。
  • **environ**进程环境变量。

二、文件与句柄(查泄漏神器)

  • fd/ 目录,里面是进程打开的所有文件描述符(0 = 标准输入,1 = 输出,2 = 错误,其他是文件 / 套接字 / 设备)。数量暴增 = 句柄泄漏
  • **fdinfo/**每个 fd 的详细信息。
  • **maps**内存映射:库、堆、栈、动态库地址。
  • **smaps**更详细的内存占用(按区域统计)。

三、线程相关

  • **task/**里面每个子目录对应一个线程(TID),结构和 PID 目录一样。

四、调度与性能

  • **sched**调度信息、运行时间、切换次数。
  • **schedstat**调度统计。
  • **oom_adj / oom_score_adj**OOM 杀死优先级。

五、IO 相关

  • **io**进程读写字节数、块 IO 次数。

六、网络 / 套接字相关(查端口归属)

  • net/tcp / udp 等在 /proc/net,但进程目录里可以通过fd/ 看到 socket 链接,配合 lsof / ls -l /proc/PID/fd 能查到端口。

七、调试专用

  • **wchan**进程当前在内核中睡眠的函数(排查 D 状态卡死非常有用)。
  • **stack**内核栈(需要 root,看内核层卡在哪)。
  • **syscall**当前阻塞在哪个系统调用。

八、最常用的 8 个(调试必背)

  1. status 看状态、内存、线程
  2. fd/ 看打开文件 / 句柄泄漏
  3. exe 看程序路径
  4. cmdline 看启动参数
  5. maps 看库、内存布局
  6. cwd 看当前目录
  7. io 看磁盘读写
  8. wchan/stack 看进程卡在哪

一句话记住

/proc/PID/ 就是把一个进程的所有状态摊开给你看,调试卡死、泄漏、异常全靠它。

常用调试手段

一、先记住一句话

/proc 是内核实时 "体检表" ,所有内容不占硬盘、开机才有、瞬间生成。调试思路就 3 条:

  1. 看系统有没有病(CPU / 内存 / 中断 / 负载)
  2. 看进程是不是疯了(卡死、泄漏、死循环)
  3. 看驱动 / 硬件有没有在干活(中断、IO、模块)

二、系统级调试(最常用)

  1. 看系统是不是卡爆了

    cat /proc/loadavg

输出:0.12 0.25 0.31分别是 1/5/15 分钟负载。

负载 > CPU 核心数 → 系统忙死了。

  1. 看 CPU 是不是被占满

    cat /proc/cpuinfo
    cat /proc/stat

看有没有核心一直 100%。

  1. 看内存是不是爆了(OOM 前兆)

    cat /proc/meminfo

重点看:

  • MemFree 空闲
  • Buffers/Cached 缓存
  • SwapUsed 交换分区使用

内存持续走低 + 卡顿 = 内存泄漏。

  1. 看内核启动参数对不对(设备树、驱动传参)

    cat /proc/cmdline

驱动 / 设备树出问题,经常是这里参数错了。

  1. 看内核日志(排查驱动挂掉)

    cat /proc/kmsg

    等价 dmesg

驱动 probe 失败、中断异常、Oops 全都在这里。


三、进程调试(查卡死、崩溃、泄漏)

  1. 找到可疑 PID

    ps aux

  2. 看这个进程到底在干嘛

    cat /proc/1234/cmdline

  3. 看进程内存映射(为什么占内存)

    cat /proc/1234/maps

  4. 看进程打开了哪些文件(句柄泄漏)

    ls /proc/1234/fd

数量几百上千 = 文件句柄泄漏。

  1. 看进程状态(是不是僵死 / 阻塞)

    cat /proc/1234/status

重点:

  • State: R(运行) S(睡眠) D(不可中断阻塞) Z(僵尸)
  • D 状态 = 驱动 / IO 卡死
  1. 看进程线程数

    cat /proc/1234/status | grep Threads

线程暴涨 = 代码 BUG。


四、驱动 / 硬件调试(你最需要的)

  1. 看硬件中断有没有触发(红外、按键、网卡)

    cat /proc/interrupts

  • 数字一直涨 = 硬件在发中断
  • 数字不动 = 硬件没工作 / 驱动没注册中断
  1. 看内核模块加载没(你的驱动在不在)

    cat /proc/modules

= lsmod 命令的来源。

  1. 看挂载是否正常(rootfs、分区)

    cat /proc/mounts

  2. 看块设备 / 分区(EMMC、SD、U 盘)

    cat /proc/partitions

  3. 看门设备被哪些驱动占用

    cat /proc/iomem
    cat /proc/ioports

寄存器地址冲突一看就知道。


五、网络调试(网卡、TCP、丢包)

  1. 看网卡流量

    cat /proc/net/dev

  2. 看 TCP 连接(是否大量异常连接)

    cat /proc/net/tcp
    cat /proc/net/udp

  3. 看 ARP 表

    cat /proc/net/arp


六、改内核参数(实时调试,不用重启)

打开 / 关闭 IP 转发

复制代码
echo 1 > /proc/sys/net/ipv4/ip_forward

调整最大打开文件数

复制代码
echo 65535 > /proc/sys/fs/file-max

调整 OOM 行为

复制代码
cat /proc/sys/vm/panic_on_oom

七、最经典的 8 条调试命令(直接背)

复制代码
cat /proc/meminfo        # 内存
cat /proc/loadavg        # 负载
cat /proc/cpuinfo        # CPU
cat /proc/interrupts     # 硬件中断(驱动调试神器)
cat /proc/modules        # 模块
cat /proc/kmsg           # 内核日志
cat /proc/[PID]/status   # 进程状态
cat /proc/cmdline        # 内核启动参数

更多待补充

相关推荐
groundhappy25 分钟前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕1 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫2 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生3 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
维基框架4 小时前
汽车座舱开发上云 Google的Arm实例解决了什么实际问题
arm开发·人工智能·汽车
imc.114 小时前
linux基础IO
linux·运维·服务器
BelongPanda6 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯6 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_777998346 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器
yunwei376 小时前
eBPF 教程:检查 exec 后真正安装的可执行镜像
linux·开源