当前位置:首页>Linux>90%的 Linux 工程师都没真正搞懂的 /proc 目录,原来这么强大

90%的 Linux 工程师都没真正搞懂的 /proc 目录,原来这么强大

  • 2026-10-10 20:18:17
90%的 Linux 工程师都没真正搞懂的 /proc 目录,原来这么强大
大家好!我是大虫子🐛!
文章字数偏长,咱们直接进入正题~
/proc 是 Linux 内核提供的一个 虚拟文件系统(procfs),它把内核内部的数据结构以普通文件的形式暴露给用户空间。
与传统的磁盘文件系统不同,/proc 中的文件并不真正存放在磁盘上,而是由内核在读取时动态生成——所以它们被称为“伪文件”。
通过阅读或写入这些文件,系统管理员、运维人员、调试工具以及普通用户可以实时获取或修改内核、进程、网络、硬件等信息。
🎯挂载方式
方式
典型命令
说明
默认挂载
在大多数发行版的启动脚本里已经执行 mount -t proc proc /proc
系统启动后 /proc 始终存在。
手动挂载mount -t proc proc /proc
如果你把 /proc 挂在别的挂载点(如容器)时使用。
卸载umount /proc
(不推荐,会导致很多系统工具失效)
只能临时使用,卸载后很多工具(如 ps, top, free)将失效。
☝️注意:从 systemd 以后,很多发行版把 /proc 作为 根文件系统的一部分,不再单独挂载;但 mount 仍然可以看到它的类型为 proc。
🎯/proc 目录的整体结构
/proc│├─ 1/                # init (PID 1) 进程的目录├─ self/             # 符号链接 → 当前进程的 /proc/<pid>├─ thread-self/      # 符号链接 → 当前进程的 /proc/<pid>/task/<tid>├─ <pid>/            # 每个运行中的进程都有对应的目录│   ├─ cmdline│   ├─ environ│   ├─ fd/│   ├─ maps│   ├─ status│   ├─ wchan│   └─ …├─ <tid>/            # 线程(如果内核支持)对应的目录(/proc/<pid>/task/<tid>)├─ sys/              # 内核运行时参数(可写)│   ├─ net/│   ├─ vm/│   ├─ kernel/│   └─ …├─ acpi/             # ACPI 信息(有的发行版已经迁移到 /sys/firmware/acpi)├─ bus/              # 总线信息(已逐步迁移到 /sys/bus)├─ driver/           # 某些驱动的状态文件(已迁移到 /sys)├─ fs/               # 文件系统相关参数(如 nfs、ext4 等)├─ irq/              # 中断请求信息(已迁移到 /sys/irq)├─ tty/              # 终端相关信息├─ self/             # 同上├─ loadavg├─ uptime├─ meminfo├─ cpuinfo├─ devices├─ partitions├─ mounts├─ net/├─ stat├─ version└── …
📌小技巧:使用 ls -la /proc 可以看到文件类型。大多数是 -(普通文件)或 l(符号链接),也有 d(目录)。
🎯常用 系统级 伪文件(不涉及进程)
路径
内容
常用查看方式
/proc/cpuinfo
CPU 型号、核心数、频率、缓存、flags 等
cat /proc/cpuinfo
、lscpu
/proc/meminfo
物理内存、swap、内存分配情况
cat /proc/meminfo
、free -h
/proc/uptime
系统运行时间(秒)以及空闲时间
cat /proc/uptime
 → 解析第二列得到 idle
/proc/loadavg
过去 1/5/15 分钟的平均负载、运行/总进程数
cat /proc/loadavg
/proc/stat
系统整体 CPU、上下文切换、磁盘 I/O、进程创建等统计
cat /proc/stat
/proc/diskstats
每个块设备的 I/O 统计(读/写扇区、请求次数)
cat /proc/diskstats
、iostat
/proc/partitions
块设备分区表(主设备号、次设备号、分区大小)
cat /proc/partitions
、lsblk
/proc/filesystems
内核支持的文件系统列表(nodev 表示不依赖块设备)
cat /proc/filesystems
/proc/mounts
当前挂载点(包含 bind、mount namespaces)
cat /proc/mounts
、mount
/proc/cmdline
启动内核时传递的命令行参数
cat /proc/cmdline
/proc/bootconfig
内核启动配置(如果启用了 boot config)
cat /proc/bootconfig
/proc/version
内核版本、编译主机、gcc 版本
cat /proc/version
、uname -a
/proc/sysvipc/
System V IPC(共享内存、信号量、消息队列)信息
ls /proc/sysvipc
/proc/kcore
物理内存的 core dump(大小 = 物理内存 + 4KB)
cat /proc/kcore
(需要 root)
/proc/kmsg
内核日志缓冲区的原始输出(常用于调试)
dmesg
 实际上读取此文件
/proc/modules
当前加载的内核模块列表
cat /proc/modules
、lsmod
/proc/softirqs
软中断统计
cat /proc/softirqs
/proc/interrupts
硬件中断统计
cat /proc/interrupts
/proc/pressure/Linux 5.14+
 的 Pressure Stall Information(CPU、IO、Memory)
cat /proc/pressure/cpu
/proc/slabinfo
内核 slab 分配器信息(需要 CONFIG_SLABINFO)
cat /proc/slabinfo
/proc/vmstat
虚拟机统计(页换入/换出、缺页中断等)
cat /proc/vmstat
、vmstat 1
/proc/zoneinfo
内存域(NUMA)信息
cat /proc/zoneinfo
🔨进阶:/proc/net、/proc/sys 下面还有非常丰富的子目录,下面章节会分别展开。
🎯进程级别的目录 /proc/<pid>
每个运行中的进程在 /proc 下都有一个以 PID 为名的目录(只有拥有对应进程的用户才能读取全部信息,普通用户只能看到自己的进程或已授权的进程)。下面是常用的子文件/目录:
路径
内容
示例(cat 或 ls)
/proc/<pid>/cmdline
进程启动时的完整命令行(以 \0 分隔)
cat /proc/$$/cmdline
/proc/<pid>/environ
进程的环境变量(同样以 \0 分隔)
cat /proc/$$/environ
/proc/<pid>/status
进程的基本状态(PID、PPID、UID、GID、状态、内存、CPU、线程数等)
cat /proc/$$/status
/proc/<pid>/stat
进程的多维度系统统计(mostly for ps)
cat /proc/$$/stat
/proc/<pid>/statm
进程的内存使用情况(resident, shared, code, data)
cat /proc/$$/statm
/proc/<pid>/maps
进程的内存映射(共享库、匿名映射、文件映射)
cat /proc/$$/maps
/proc/<pid>/smaps
进一步的映射信息(每段映射的脏页、RSS 等)
cat /proc/$$/smaps
/proc/<pid>/fd/
进程打开的文件描述符列表(每项是指向实际文件的符号链接)
ls -l /proc/$$/fd
/proc/<pid>/fdinfo/
每个文件描述符的详细信息(flags、position)
cat /proc/$$/fdinfo/0
/proc/<pid>/task/
线程子目录(每个线程对应 <tid>)
ls /proc/$$/task
/proc/<pid>/wchan
进程当前所在的内核函数(等待的通道)
cat /proc/$$/wchan
/proc/<pid>/stack
内核态栈回溯(需要 CONFIG_STACKTRACE)
cat /proc/$$/stack
/proc/<pid>/syscall
当前正在执行的系统调用号及参数
cat /proc/$$/syscall
/proc/<pid>/cwd
 → 符号链接
进程的当前工作目录
ls -l /proc/$$/cwd
/proc/<pid>/root
 → 符号链接
进程的根目录(容器场景)
ls -l /proc/$$/root
/proc/<pid>/exe
 → 符号链接
可执行文件的路径
ls -l /proc/$$/exe
/proc/<pid>/ns/
进程所在的命名空间(ipc、net、pid、user、uts 等)
ls -l /proc/$$/ns
示例:查看当前 shell 进程(bash)的内存使用
$ cat /proc/$$/status | grep -E "^(VmRSS|VmSize):"VmRSS:   12340 kBVmSize:  45678 kB
🎯/proc/sys —— 内核参数的“动态调节器”
/proc/sys 下的文件(多数是 可写)对应 内核运行时参数,我们通常通过 sysctl 命令或直接 echo 来修改它们。修改后 立即生效,但系统重启后会丢失;若想永久保存,需要写入 /etc/sysctl.conf(或 /etc/sysctl.d/*.conf)。
1. 常见子目录及参数
目录
作用
常用参数(示例)
/proc/sys/kernel/
通用内核行为
hostname
, osrelease, sysrq(启用 SysRq)
/proc/sys/net/
网络子系统
ip_forward
(路由转发),tcp_timestamps,tcp_sack
/proc/sys/vm/
虚拟内存管理
overcommit_memory
(内存分配策略),swappiness,drop_caches
/proc/sys/fs/
文件系统相关
file-max
(系统级文件句柄上限),inode-max
/proc/sys/fs/file-nr
当前已分配/已使用/最大文件句柄数
只读
/proc/sys/user/
用户资源限制
max_user_namespaces
/proc/sys/dev/
设备驱动参数
cdrom/autoeject
/proc/sys/debug/
内核调试开关(默认不启用)
verbose
(需要 CONFIG_DEBUG_KERNEL)
/proc/sys/kernel/random/entropy_avail
当前熵池大小(随机数)
只读
常用操作
  • 查看:sysctl net.ipv4.ip_forward,cat /proc/sys/net/ipv4/ip_forward临时
  • 修改:echo 1 > /proc/sys/net/ipv4/ip_forward(或 sysctl -w net.ipv4.ip_forward=1)
  • 永久修改:在 /etc/sysctl.conf 中写入 net.ipv4.ip_forward = 1,随后 sysctl -p 生效。
2. 常用的调优示例
场景
参数
推荐值
说明
开启 IPv4 转发net.ipv4.ip_forward
1
路由器/Docker 主机需要
降低 swap 使用倾向vm.swappiness
10~30
对 SSD/大内存机器可以设低,降低磁盘 I/O
关闭 ICMP 重定向net.ipv4.conf.all.accept_redirects
 / send_redirects
0
安全性/网络加固
限制文件句柄fs.file-max
 / fs.nr_open
2000000
高并发服务器
开启 TCP BBRnet.ipv4.tcp_congestion_control
bbr
需要内核支持
打开 Nagle
(关闭)
net.ipv4.tcp_nodelay
1
低延迟交互式应用
允许核心转储kernel.core_pattern/tmp/core-%e-%p
生成 core dump
注意:很多参数只能在 root 或具备 CAP_SYS_ADMIN 的容器/进程中修改;在容器内部往往只能读取。
🎯网络信息 /proc/net/*
/proc/net 包含大量网络协议栈的统计信息。常见的文件有:
文件
内容
常用工具
/proc/net/dev
网卡的收发字节数、错误、丢包、冲突等
cat /proc/net/dev
 → ifconfig / ip -s link
/proc/net/tcp
TCP 连接表(十六进制状态)
cat /proc/net/tcp
 → netstat -tn
/proc/net/udp
UDP 套接字表
cat /proc/net/udp
 → netstat -un
/proc/net/raw
原始套接字表
/proc/net/unix
Unix 域套接字表
cat /proc/net/unix
/proc/net/snmp
SNMP 统计(IP, ICMP, TCP, UDP)
cat /proc/net/snmp
 → snmpwalk
/proc/net/netstat
网络层统计(IP, TCP, etc.)
cat /proc/net/netstat
/proc/net/arp
ARP 表(IPv4)
cat /proc/net/arp
 → arp -a
/proc/net/nf_conntrack
连接跟踪表(如果启用了 nf_conntrack)
cat /proc/net/nf_conntrack
进阶:/proc/net/netfilter/ 下还有 nf_conntrack、nf_log 等文件,用于查看 iptables/nftables 的内部状态。
🎯特殊路径与快捷方式
路径
作用
备注
/proc/self
符号链接 → 当前进程对应的 /proc/<pid>
对所有进程都指向自己的目录,常用于脚本读取自身进程信息
/proc/thread-self
符号链接 → 当前进程的主线程对应的 /proc/<pid>/task/<tid>
多线程程序获取自身线程信息
/proc/1
PID 1 (init/systemd) 进程信息
容器内部可看到 init 进程
/proc/[pid]/ns/
命名空间信息,配合 nsenter、unshare 使用
容器化/安全隔离必备
/proc/kmsg
内核日志(实时)
dmesg
 底层读取它;只能被一个进程打开
/proc/bootconfig
启动时内核参数(如果启用)
与 /proc/cmdline 类似但更结构化
/proc/pressure/*5.14+
 Pressure 信息
cat /proc/pressure/cpu
 → CPU 压力
/proc/sysrq-trigger
触发 SysRq 功能的入口(写入字符触发)
如 echo "c" > /proc/sysrq-trigger 触发内核崩溃 (慎用)
🎯常见工具背后依赖 /proc
工具
读取的 /proc 项
ps, top, htop/proc/<pid>/stat, /proc/<pid>/status, /proc/<pid>/cmdline, /proc/<pid>/fd
free, vmstat/proc/meminfo, /proc/vmstat
uptime, w/proc/uptime, /proc/loadavg
lsof/proc/<pid>/fd, /proc/net/*
netstat, ss/proc/net/tcp, /proc/net/unix, /proc/net/snmp
iostat/proc/diskstats, /proc/partitions
pidstat/proc/<pid>/stat
systemd-cgtop/proc/<pid>/cgroup(在 systemd 管理的层级)
crictl, crictl inspect/proc/<pid>/status, /proc/<pid>/ns/*(容器运行时)
很多监控脚本会直接 cat /proc/... 而不是依赖外部工具,这也是最直接、最快的获取方式。
🎯常见坑点 & 安全注意事项
坑点
解释
防范
只读/可写权限/proc/sys
 下多数文件只有 root 能写,普通用户只能读。
使用 sudo 或具备相应 capability 的进程。
信息泄露/proc/<pid>/environ
、/proc/<pid>/cmdline、/proc/<pid>/fd/* 常暴露敏感信息(如密码、环境变量)。
容器或高安全环境使用 proc_trap(如 gvisor)或 sysctl kernel.deny_other_userns=1 限制非特权用户访问。
/proc/sys/kernel/sysrq
打开 SysRq 可以让任何人通过键盘组合直接触发内核操作(重启、OOM 等)。
在生产环境关闭:echo 0 > /proc/sys/kernel/sysrq 或在 sysctl.conf 中设 kernel.sysrq = 0。
大量读取 /proc
某些监控脚本每个周期 cat /proc/*/status 会导致 /proc 大量遍历,增加 CPU 开销。
使用 pidfd_open + readlink /proc/self/fd/ 或 cgroup 统计,避免全遍历。
/proc/kmsg
 竞争
多个进程打开 /proc/kmsg 时只能有一个成功读取。
使用 dmesg(它内部实现了 O_NONBLOCK + select)或 journalctl -k。
NUMA 信息/proc/zoneinfo
 输出的页面数与 numactl --hardware 不一致时,说明系统没有正确配置 NUMA。
通过 numactl --interleave=all 或 sysctl vm.zone_reclaim_mode=0 调整。
容器内 /proc 只读
很多容器运行时把 /proc 以 只读 方式挂载,防止进程修改内核参数。
需在容器运行参数中加入 --privileged(不推荐)或使用 security-opt 重新挂载。
🎯与 /proc 类似的虚拟文件系统
文件系统
挂载点
用途
sysfs/sys
设备、驱动、电源、块设备、sysfs 节点等结构化信息(比 /proc 更规范)
cgroup/sys/fs/cgroup
(在 systemd 体系里是 /sys/fs/cgroup/systemd)
资源控制、容器层级
debugfs/sys/kernel/debug
内核调试信息(需要 CONFIG_DEBUG_FS)
tracefs/sys/kernel/tracing
ftrace、perf、BPF 追踪点
configfs/config
用户空间配置内核子系统(如 LIO iSCSI target)
常见误区:/proc 用来调优,/sys 用来管理硬件和驱动。现代内核逐步把 设备信息 从 /proc 迁移到 /sys,所以很多旧文档里出现的 /proc/pci、/proc/ide 已经消失。
🎯小结
  • /proc 是 Linux 系统的信息中枢,几乎所有系统监控、调试、调优工具都直接或间接依赖它。
  • 系统级(如 CPU、内存、负载、网络) → 直接读取 /proc/{cpuinfo,meminfo,loadavg,net,…}
  • 进程级(每个进程的资源、文件描述符、线程) → /proc/<pid> 下的文件。
  • 内核参数 → /proc/sys(可写) + sysctl,是实现 运行时调优 的关键。
  • 了解每个文件的结构与含义,能帮助 快速定位性能瓶颈、排查故障、进行安全加固,并且在容器化、自动化监控脚本中发挥重要作用。
往期回顾
Linux 必学目录:/sys/power
Linux 必学目录:/sys/module
Linux 必学目录:/sys/hypervisor
Linux 必学目录:/sys/firmware
Linux 必学目录:/sys/kernel
Linux 必学目录:/sys/fs
Linux 必学目录:/sys/bus
Linux 必学目录:/sys/block
Linux 必学目录:/sys/class
Linux 必学目录:/sys 入门看这篇就够了

最新文章

随机文章