proc文件系统工具-procps
procps全称为:procps-ng: System and process monitoring utilities(/proc 文件系统工具),该软件包提供了命令行和全屏实用程序用于浏览 procfs 这个"伪"文件系统中的信息,该伪文件系统由内核动态生成,以提供进程表中条目状态的相关信息(例如进程是否在运行、停止或僵死)。它包含了 free, kill, pkill, pgrep, pmap, ps, pwdx, skill, slabtop,snice, sysctl, tload, top, uptime, vmstat, w, watch 等指令,有些可能要用root用户才能执行。与'gnu coreutils'类似,系一系列系统核心工具包的统称。
procps is the package that has a bunch of small useful utilities that give information about processes using the /proc filesystem. The package includes the programs ps, top, vmstat, w, kill, free, slabtop, and skill.
procps is a set of command line and full-screen utilities that provide information out of the pseudo-filesystem most commonly located at /proc.This filesystem provides a simple interface to the kernel data structures.The programs of procps generally concentrate on the structures that describe the processess running on the system.
它包含了 free, kill, pkill, pgrep, pmap, ps, pwdx, skill, slabtop,snice, sysctl, tload, top, uptime, vmstat, w, 和 watch.
简要说明
free:显示系统中可用的和已经使用的物理内存和交换空间,以及内核使用的共享内存和缓冲区。
kill:向进程发信号。
pgrep:按照名字或者其他属性查找进程。
pkill:按照名字或者其他属性结束进程。
pmap:报告指定进程的内存图。
ps:显示一个当前进程的快照。
skill:向符合某个条件的进程发出信号。
snice:改变符合某个条件进程的调度优先级。
sysctl:系统运行时改变内核的参数。
tload:在指定的tty终端上显示系统当前平均负载的示意。
top:实时观察进程的活动情况。
uptime:显示系统运行了多长时间,有多少用户登陆,系统的负载情况。
vmstat:报告虚拟内存状态。包括进程、内存、分页、块设备的读写、中断和CPU的活动。
w:显示当前登录的用户信息,以及他们的进程。
watch:重复运行某个命令,满屏显示其输出。
libproc:包含本软件包中大多数程序都要使用的函数库。
procps 依赖关系
其依赖于:bash, binutils, coreutils, gcc, glibc, make, ncurses.
/proc 目录简介
/proc 目录在 Linux 系统中是一个虚拟文件系统,它不是存储在硬盘上的常规文件系统,而是由内核在内存中动态生成的。主要用于提供系统和进程的运行时信息。
一、系统信息
1. CPU信息
/proc/cpuinfo
包含有关 CPU 的详细信息,如型号、制造商、速度和核数等。
2. 内存信息
/proc/meminfo
提供关于系统内存使用情况的详细信息,包括总内存、空闲内存、缓冲区和缓存的大小等。
3. 系统运行时间
/proc/uptime
显示系统自上次启动以来的运行时间和空闲时间。
4. 系统版本
/proc/version
显示当前运行的 Linux 内核版本和编译器版本的信息。
二、进程信息
每个正在运行的进程在 /proc 目录下都有一个对应的子目录,目录名就是进程的 PID(进程标识符)。例如,PID 为 123 的进程会有一个 /proc/123 目录。
1. 进程命令参数
/proc/[pid]/cmdline
包含启动进程时的命令行参数。
2. 进程工作目录
/proc/[pid]/cwd
一个符号链接,指向进程的当前工作目录。
3. 进程环境变量
/proc/[pid]/environ
包含进程的环境变量。
4. 进程符号链接
/proc/[pid]/fd
包含指向进程打开的文件描述符的符号链接。
5. 进程状态信息
/proc/[pid]/status
提供进程的状态信息,包括 PID、PPID(父进程 ID)、内存使用情况等。
三、硬件信息
1. 设备信息
/proc/devices
显示系统中当前已注册的字符设备和块设备。
2. interrupts信息
/proc/interrupts
列出系统中断(interrupts)的使用情况和统计信息。
3. I/O端口
/proc/ioports
显示系统 I/O 端口的使用情况。
四、文件系统信息
1. 文件挂载信息
/proc/mounts
显示当前挂载的文件系统及其挂载点。
2. 分区信息
/proc/partitions
显示系统中所有分区的信息。
/proc 目录是一个强大的工具,可以让系统管理员、开发人员和用户深入了解系统和进程的详细信息。由于其动态和内存驻留的特性,访问 /proc 目录中的信息通常是高效且即时的。
proc 伪文件系统
1、为何需要 /proc:设计初衷
在早期 Unix/Linux 系统中,内核状态和进程信息的获取依赖于专用工具(如 ps、top)或复杂的系统调用(如 ioctl)。这种方式存在以下问题:
1.接口碎片化
不同功能需要不同的工具或调用,缺乏统一接口。
2.实时性差
工具通常通过解析静态文件(如 /etc/passwd)或缓存数据,无法反映动态变化。
3.开发复杂度高
开发者需要深入理解内核结构和系统调用,调试困难。
/proc 的核心理念:将内核和进程的运行时状态抽象为虚拟文件,用户通过标准文件操作(cat、echo、read)即可与内核交互,实现“一切皆文件”的哲学。
2、历史脉络:从雏形到标准化
1984年:8th Edition Unix 首次引入 /proc,用于调试进程(每个进程对应一个目录),但功能有限。
1992年:Linux v0.96 借鉴并扩展了 /proc,不仅包含进程信息,还暴露硬件状态(CPU、内存、设备)和内核参数。
2000年后:随着 Linux 在服务器和嵌入式领域的普及,/proc 成为系统监控和调优的核心工具,并被 POSIX 标准部分采纳。
/proc 文件系统的设计源于早期 Unix 系统对动态内核数据访问的需求。传统文件系统仅用于存储静态数据,而操作系统内核的状态(如进程信息、硬件配置等)需要一种更灵活的交互方式。1984 年,Tom J. Killian 在 Unix 第八版中首次提出 /proc 的概念,将其作为进程信息伪文件系统,用于调试和监控进程。Linux 继承了这一理念,并在 1990 年代初期将其扩展为内核与用户空间的动态接口。随着 Linux 内核的演进,/proc 的功能逐渐丰富,不仅涵盖进程信息,还纳入了系统硬件状态、内核参数调整等能力。
2.1 核心特性与功能
/proc 是一个伪文件系统(Pseudo Filesystem),其文件和目录并非真实存储在磁盘上,而是由内核实时生成,仅存在于内存中。其核心功能包括:
系统信息暴露:如 CPU 信息(/proc/cpuinfo)、内存状态(/proc/meminfo)。
进程管理:每个进程对应 /proc/[pid]/ 目录,包含命令行参数(cmdline)、环境变量(environ)等实时数据。
内核参数调整:通过 /proc/sys/ 目录动态修改网络、内存管理等参数(如 sysctl 命令的底层实现)。
硬件设备监控:如中断统计(/proc/interrupts)、设备挂载信息(/proc/mounts)。
2.2. 应用场景示例
性能监控:通过 /proc/stat 计算 CPU 利用率,或分析 /proc/net/dev 获取网络流量。
调试工具依赖:top、ps 等工具基于 /proc 数据实现进程状态展示。
动态调优:修改 /proc/sys/net/ipv4/tcp_syncookies 可防御 SYN 洪水攻击。
2.3. 用户与内核的桥梁
/proc 以文件系统形式提供标准化访问接口,简化了用户态工具与内核的交互。
实时性与动态性:数据实时生成,无需重启即可生效,适合动态系统调试和优化。
生态系统依赖:大量系统工具(如 lsof、htop)和容器技术(如 Docker)依赖 /proc 获取底层信息。
3、核心功能与应用场景
1. 进程信息抽象
路径格式:/proc/[PID]/,例如 /proc/1/ 对应 init 进程。
关键文件
status:进程状态(内存、信号、用户ID)。
cmdline:启动命令参数。
fd/:进程打开的文件描述符。
maps:内存映射区域(如共享库)。
应用示例:
# 查看进程1的启动命令
cat /proc/1/cmdline
# 统计当前系统进程数
ls -d /proc/[0-9]* | wc -l
2. 硬件与内核状态
系统级信息:
/proc/cpuinfo:CPU型号、核心数、频率。
/proc/meminfo:内存总量、使用情况、缓存。
/proc/interrupts:中断分配统计。
/proc/net/dev:网络接口流量。
内核参数动态调整:
/proc/sys/
目录下的文件(如 net/ipv4/ip_forward)允许运行时修改内核参数。
# 启用IP转发(临时生效)
echo 1 > /proc/sys/net/ipv4/ip_forward
调试与性能分析
# 监控系统内存变化(每秒刷新)
watch -n 1 "cat /proc/meminfo | grep -i 'free\|available'"
分析进程资源
# 查看进程12345的内存映射(检测内存泄漏)
cat /proc/12345/maps
与其他伪文件系统的对比
虽然 Linux 后续引入了 sysfs(设备驱动模型)、cgroupfs(资源控制)等伪文件系统,但 /proc 仍是最核心的动态信息源。例如 sysfs 聚焦硬件设备层次结构,而 /proc 更侧重进程和内核状态。
4、Linux生态的“神经中枢”
统一接口:开发者无需依赖特定工具库,通过文件读写即可获取信息。
动态性:数据实时生成,反映系统瞬时状态(如 uptime 文件每秒变化)。
可扩展性:内核模块可通过 /proc 暴露自定义接口(需调用 proc_create())。
安全性:权限模型与普通文件一致(如 stat 文件仅 root 可读)。
5、局限性与发展
性能开销:频繁读取大文件(如 /proc/kallsyms)可能影响性能。
替代方案:Linux 4.0+ 引入 sysfs(/sys)和 debugfs,将设备驱动和调试信息从 /proc 剥离,保持其简洁性。
未来趋势:容器化场景下,/proc 需隔离(如 Kubernetes 中每个 Pod 看到独立的 /proc)。
6、proc 核心思维
“透明化”内核:通过文件系统抽象,降低系统管理的技术门槛。
“自省”能力:为开发者提供一把窥探内核的“瑞士军刀”。
“动态配置”典范:无需重启即可调整系统行为,奠定了 Linux 作为服务器操作系统的统治地位。
7、相关指令集
free
Report the amount of free and used memory in the system
报告系统中空闲和使用的内存容量(包括物理和交换内存)
kill
Send a signal to a process based on PID
根据名称和其它属性给进程发送信号
pgrep
List processes based on name or other attributes
根据名称和其它属性查找进程
pkill
Send a signal to a process based on name or other attributes
根据名称和其它属性给进程发送信号
pmap
Report memory map of a process
报告指定进程的内存映射情况
ps
Report information of processes
列出正在运行的进程
pwdx
Report current directory of a process
报告进程的当前工作目录
slabtop
Display kernel slab cache information in real time
实时显示内核 slab 缓存信息
snice
Renice a process
调整进程运行的运行优先级
sysctl
Read or Write kernel parameters at run-time
运行时修改内核参数
tload
Graphical representation of system load average
打印当前系统平均负载曲线图
top
Dynamic real-time view of running processes
显示最 CPU 密集型进程列表,它可以实时地连续查看处理器活动
uptime
Display how long the system has been running
报告系统运行时长、登录用户数目以及系统平均负载
vmstat
Report virtual memory statistics
报告虚拟内存统计信息、给出关于进程、内存、分页、块输入/输出(IO)、中断陷阱以及 CPU 活动的信息
w
Report logged in users and what they are doing
显示当前登录的用户、以及登录地点和时间
watch
Execute a program periodically, showing output fullscreen
重复运行指定命令,显示输出的第一个整屏;这允许用户查看随着时间的输出变化
libprocps
包含该软件包大部分程序使用的函数
站内链接:
proc文件系统入门
Linux虚拟文件系统vfs及proc详解
从/proc/stat文件中取得系统运行信息
竞品之sysfs文件系统
Linux内核提供的这个虚拟文件系统(procfs)把内核内部的数据结构以普通文件的形式暴露给用户空间。与传统的磁盘文件系统不同,/proc 中的文件并不真正存放在磁盘上,而是由内核在读取时动态生成——因此它们被称为“伪文件”。通过读书这些文件,系统管理员、运维人员、调试工具以及普通用户可以实时获取或修改内核、进程、网络、硬件等信息。下面从各个方面对其进行解析与说明。
1、挂载方式
| 方式 | 典型命令 | 说明 |
| 默认挂载 | 在大多数发行版的启动脚本里已经执行 mount -t proc proc /proc | 系统启动后 /proc 始终存在。 |
| 手动挂载 | mount -t proc proc /proc | 如果你把 /proc 挂在别的挂载点(如容器)时使用。 |
| 卸载 | umount /proc(不推荐,会导致很多系统工具失效) | 只能临时使用,卸载后很多工具(如 ps, top, free)将失效。 |
注意:从 systemd 以后,很多发行版把 /proc 作为根文件系统的一部分,不再单独挂载;但仍然可以看到它的类型为 proc。
2、/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(目录)。
3、常用系统级伪文件(不涉及进程)
| 路径 | 内容 | 常用查看方式 |
| /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/stat 下面还有非常丰富的子目录,需要另外展开讲解。
4、进程级别的目录 /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):"
5、/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 BBR | net.ipv4.tcp_congestion_control | bbr | 需要内核支持 |
| 打开 Nagle(关闭) | net.ipv4.tcp_nodelay | 1 | 低延迟交互式应用 |
| 允许核心转储 | kernel.core_pattern | /tmp/core-%e-%p | 生成 core dump |
注意:很多参数只能在 root 或具备 CAP_SYS_ADMIN 的容器/进程中修改;在容器内部往往只能读取。
6、网络信息 /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 的内部状态。
7、特殊路径与快捷方式
| 路径 | 作用 | 备注 |
| /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 触发内核崩溃 (慎用) |
8、常见工具背后依赖 /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/... 而不是依赖外部工具,这也是最直接、最快的获取方式。
9、常见难点与注意事项
| 难点 | 解释 | 防范 |
| 只读/可写权限 | /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,是实现 运行时调优 的关键。
了解每个文件的结构与含义,能帮助快速定位性能瓶颈、排查故障、进行安全加固,并且在自动化监控脚本中发挥重要作用。
最新版本:3.2
version 3 includes NPTL thread support, a rewritten top, many bug fixes, performance improvements, and new features.
项目主页:https://gitlab.com/procps-ng/procps