/proc 文件系统:内核的 "实时状态面板"
/proc是一个伪文件系统 ,里面的文件不是真存在硬盘上 ,而是内核实时生成的,用来暴露内核状态、进程信息、硬件信息、系统参数。下面按类别给你讲清楚:有啥、干啥用、怎么看。
一、进程相关(最常用)
/proc/[PID]/每个进程一个目录,比如
/proc/1是 init/systemd。里面常用文件:
- cmdline:启动命令
- cwd:当前工作目录
- environ:环境变量
- fd/:打开的文件描述符(查句柄泄漏)
- maps:内存映射(库、堆、栈)
- status:进程状态、PID、PPID、内存、线程数
- stat/statm:更精简的状态 / 内存信息
- io:IO 读写统计
用途:
- 查进程卡死、内存泄漏、句柄泄漏
- 看进程到底在干嘛
二、系统全局信息
/proc/cpuinfoCPU 型号、核心数、架构、特性(ARM/x86 都能用)
/proc/meminfo内存总大小、空闲、缓存、交换分区看内存够不够最准。
/proc/loadavg1/5/15 分钟系统负载判断系统忙不忙。
/proc/uptime系统开机时间。
/proc/version内核版本、gcc 版本。
/proc/cmdline内核启动参数(bootargs)。
三、硬件与设备
/proc/interrupts中断统计,看哪个硬件在频繁触发中断。
/proc/ioportsI/O 端口占用(x86 常用)。
/proc/dmaDMA 通道使用情况。
/proc/mounts当前挂载的所有文件系统(比 mount 命令更原始)。
/proc/partitions块设备分区信息(类似 lsblk)。
四、网络相关
/proc/net/dev网卡流量统计
/proc/net/tcp、/proc/net/udpTCP/UDP 连接列表(比 netstat 底层)
/proc/net/arpARP 表
/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 个(调试必背)
status看状态、内存、线程fd/看打开文件 / 句柄泄漏exe看程序路径cmdline看启动参数maps看库、内存布局cwd看当前目录io看磁盘读写wchan/stack看进程卡在哪一句话记住
/proc/[PID]/ 就是把一个进程的所有状态摊开给你看,调试卡死、泄漏、异常全靠它。
常用调试手段
一、先记住一句话
/proc 是内核实时 "体检表" ,所有内容不占硬盘、开机才有、瞬间生成。调试思路就 3 条:
- 看系统有没有病(CPU / 内存 / 中断 / 负载)
- 看进程是不是疯了(卡死、泄漏、死循环)
- 看驱动 / 硬件有没有在干活(中断、IO、模块)
二、系统级调试(最常用)
看系统是不是卡爆了
cat /proc/loadavg
输出:
0.12 0.25 0.31分别是 1/5/15 分钟负载。负载 > CPU 核心数 → 系统忙死了。
看 CPU 是不是被占满
cat /proc/cpuinfo
cat /proc/stat看有没有核心一直 100%。
看内存是不是爆了(OOM 前兆)
cat /proc/meminfo
重点看:
MemFree空闲Buffers/Cached缓存SwapUsed交换分区使用内存持续走低 + 卡顿 = 内存泄漏。
看内核启动参数对不对(设备树、驱动传参)
cat /proc/cmdline
驱动 / 设备树出问题,经常是这里参数错了。
看内核日志(排查驱动挂掉)
cat /proc/kmsg
等价 dmesg
驱动 probe 失败、中断异常、Oops 全都在这里。
三、进程调试(查卡死、崩溃、泄漏)
找到可疑 PID
ps aux
看这个进程到底在干嘛
cat /proc/1234/cmdline
看进程内存映射(为什么占内存)
cat /proc/1234/maps
看进程打开了哪些文件(句柄泄漏)
ls /proc/1234/fd
数量几百上千 = 文件句柄泄漏。
看进程状态(是不是僵死 / 阻塞)
cat /proc/1234/status
重点:
- State: R(运行) S(睡眠) D(不可中断阻塞) Z(僵尸)
- D 状态 = 驱动 / IO 卡死
看进程线程数
cat /proc/1234/status | grep Threads
线程暴涨 = 代码 BUG。
四、驱动 / 硬件调试(你最需要的)
看硬件中断有没有触发(红外、按键、网卡)
cat /proc/interrupts
- 数字一直涨 = 硬件在发中断
- 数字不动 = 硬件没工作 / 驱动没注册中断
看内核模块加载没(你的驱动在不在)
cat /proc/modules
=
lsmod命令的来源。
看挂载是否正常(rootfs、分区)
cat /proc/mounts
看块设备 / 分区(EMMC、SD、U 盘)
cat /proc/partitions
看门设备被哪些驱动占用
cat /proc/iomem
cat /proc/ioports寄存器地址冲突一看就知道。
五、网络调试(网卡、TCP、丢包)
看网卡流量
cat /proc/net/dev
看 TCP 连接(是否大量异常连接)
cat /proc/net/tcp
cat /proc/net/udp看 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 # 内核启动参数
更多待补充