如何使用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        # 内核启动参数

更多待补充

相关推荐
帕里亚2 小时前
ubuntu18.04 APT升级 glibc2.28 (Jetson)
linux·运维·windows
好运的阿财2 小时前
“锟斤拷”问题——程序中用powershell执行命令出现中文乱码的解决办法
linux·前端·人工智能·机器学习·架构·编辑器·vim
cyber_两只龙宝2 小时前
【Nginx】Nginx实现FastCGI详解
linux·运维·nginx·云原生·php·memcached·fastcgi
砖头拍死你2 小时前
Powershell使用vim修改文件保存后文件名自动全变小写
linux·编辑器·vim
wang09072 小时前
linux的中断分析(硬中断和软中断)
linux·运维·服务器
赵优秀一一3 小时前
Python 工程化基础1:环境(conda)、pip、requirements.txt
linux·开发语言·python
风酥糖3 小时前
chroot的Linux服务配置-当云服务器真正用起来
linux·运维·服务器
木鱼布3 小时前
安装arm虚机启动失败
linux·运维·arm开发
Deitymoon3 小时前
linux——网络基础
linux·网络