一个被忽视的宝藏
如果你在Linux根目录下执行 ls -l /proc,会看到一大堆数字命名的目录,还有一些奇怪的文件。很多人知道 /proc/cpuinfo 和 /proc/meminfo,但仅此而已。
实际上,/proc 是一个虚拟文件系统。它里面的文件并不存在于磁盘上,而是由内核实时生成的。当你读取这些文件时,内核会动态收集信息并返回给你;当你向某些文件写入时,你可以改变内核的行为。
这就是 /proc 的神奇之处:它像一扇窗户,让你看到内核内部的状态;也像一扇门,让你在不重启、不写代码的情况下,动态调整系统行为。
冷门但超级有用的/proc文件
1. /proc/loadavg:系统负载的详细真相
uptime 命令显示的三个平均负载值就来自这里。但这个文件还有更多信息:第4个数字是当前正在运行的进程数 / 总进程数;第5个数字是最近运行的进程PID。
2. /proc/[pid]/fd/:一个进程打开的所有文件
每个进程都有一个 fd 目录,里面是数字命名的符号链接,指向该进程打开的文件描述符。这是一个非常强大的调试工具。
举个例子:一个程序往日志文件里写东西,但你觉得它写错了文件。你可以 ls -l /proc/这个进程的PID/fd/,看到0、1、2分别是标准输入、输出、错误,后面还有指向各种文件的链接。你想知道它到底在写哪个文件?一目了然。
更妙的是,如果你误删了一个文件,但某个进程还在使用它,你可以从 /proc/[pid]/fd/ 里找到这个文件的“残余副本”,然后用 cp 把它救回来——即使它在目录中已经看不见了。
3. /proc/[pid]/mem 和 /proc/[pid]/maps:进程的内存布局
maps 文件展示了进程的虚拟地址空间分布:代码段在哪里、数据段在哪里、加载了哪些共享库、哪些内存区域是可执行的、哪些是可写的。
mem 文件则允许你直接读写进程的内存(需要一定权限)。调试器和内存取证工具就是基于这个实现的。
4. /proc/sys/:内核参数的实时调整窗口
这个目录下的文件可以读写内核参数。例如:
/proc/sys/net/ipv4/ip_forward/proc/sys/vm/swappiness:控制内核使用swap的倾向程度(0-100,默认60)。设为10可以让系统尽量少用swap。/proc/sys/kernel/pid_max:系统允许的最大PID值,超过这个值PID会循环。
你不需要重启就能让修改生效:echo 10 > /proc/sys/vm/swappiness。
但注意,这种修改是临时的,重启后恢复。要永久修改,需要写入 /etc/sysctl.conf。
5. /proc/interrupts:谁在打扰你的CPU?
这个文件显示每个CPU核心上发生的中断数量。如果某个硬件设备(比如网卡)产生了过多的中断,你可以在这里看到。结合 irqbalance 服务,你可以优化中断在多个CPU核心上的分布,提升性能。
6. /proc/self/:一个方便的快捷方式
任何时候,/proc/self/ 都指向当前正在访问它的进程自己。比如,你可以在脚本里写 cat /proc/self/status 来查看当前脚本进程的状态,而不需要先获取自己的PID。
一个实战例子:找出哪个进程在疯狂写磁盘
系统突然变慢,iostat 显示磁盘写入很高,但你不知道是哪个进程造成的。
你可以用 ls -l /proc/*/fd/ 2>/dev/null | grep /some/mount/point 来查找哪些进程打开了该挂载点下的文件。但更直接的方法是使用 lsof(它本质上就是读取 /proc 信息)。
或者,你可以监控 /proc/[pid]/io 文件,里面记录了每个进程的读写字节数。写一个简单的脚本,每隔一秒读取所有进程的 write_bytes 字段,两次的差值就是写入速率。
冷门警告:不要随意写/proc下的文件
虽然 /proc 提供了强大的动态调整能力,但有些参数非常敏感。比如 /proc/sys/kernel/panic 如果写错,可能导致内核在遇到错误时自动重启。修改前,务必查阅文档。