1 概述

/proc 文件系统(procfs, process filesystem)是 Linux 内核对外暴露内核与进程信息的一种虚拟文件系统.
它不是一个真正存在于磁盘上的文件系统,而是由内核在运行时动态生成的,用于让用户空间(用户、程序、脚本等)读取甚至控制内核状态.

目录结构.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/proc
├── 1/ # 进程号目录 (PID=1)
│ ├── cmdline # 启动命令行参数
│ ├── environ # 环境变量
│ ├── fd/ # 打开的文件描述符
│ ├── maps # 内存映射信息
│ ├── stat # 进程状态
│ ├── status # 状态信息
│ └── exe -> /sbin/init

├── cpuinfo # CPU 信息
├── meminfo # 内存信息
├── modules # 当前已加载内核模块
├── mounts # 挂载信息
├── version # 内核版本
├── uptime # 系统运行时间
├── loadavg # 系统平均负载
├── interrupts # 中断计数
├── kmsg # 内核日志缓冲区
└── sys/ # 新版系统配置接口(类似 /sys)

2 目录概述

/proc/cpuinfo 包含了当前系统的 CPU 信息,包括工作频率、缓存、地址线长度等.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
processor	: 0
vendor_id : GenuineIntel
cpu family : 6
model : 142
model name : Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz
stepping : 12
microcode : 0x100
cpu MHz : 3984.379
cache size : 6144 KB
physical id : 0
siblings : 8
core id : 0
cpu cores : 4
apicid : 0
initial apicid : 0
fpu : yes
...

/proc/meminfo 显示的是当前内存的状态信息,如物理内存总容量、已使用的内存、共享内存、交换内存大小等等.

在开发的日常过程中更偏向于通过 top 输出.

/proc/kallsyms 是一个符号表,包含了内核的所有全局变量和函数在内存中的地址.

/proc/kcore 是一个动态的内核文件,里面包含了内核在主内存中的全部内容. 可以将调试器附加到这个文件上,来查看运行中系统的当前状态.

/proc/interrupts 该文件包含了系统记录的在每个 CPU 上处理的各类中断的计数信息.

1
2
3
4
5
6
7
            CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       
1: 0 0 0 0 0 0 0 48016 IR-IO-APIC 1-edge i8042
8: 0 0 0 0 0 0 0 0 IR-IO-APIC 8-edge rtc0
9: 71800 0 0 0 0 0 0 0 IR-IO-APIC 9-fasteoi acpi
12: 0 0 0 0 0 0 2388 0 IR-IO-APIC 12-edge i8042
14: 0 369104 0 0 0 0 0 0 IR-IO-APIC 14-fasteoi INT34BB:00
...

/proc/loadavg 显示系统在过去一段时间的平均负载.

1
2
3
# 1,5,15, 分钟的系统平均负载. 运行队列的任务数目,采样时刻占用最大的线程ID.
$ cat /proc/loadavg
0.86 0.95 0.95 1/1440 67234

/proc/<PID> 下面最常用的是 maps.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 虚拟内存地址范围(启始-结束) 内存区域权限    文件映射偏移(在文件中的偏移量)    设备号  inode 编号  文件路径
# r--p:只读段
# r-xp:可执行段
# r--p:只读数据段
# rw-p:可写数据段
# 5e0fcdd8b000-5e0fce1b5000 rw-p 00000000 00:00 0 [heap] 是内存堆区(malloc/new 用的区域)
# 79724d50d000-79724d510000 rw-p 0050c000 103:05 7091561 /usr/lib/x86_64-linux-gnu/libcrypto.so.3 是动态链接库
# 7ffddc000000-7ffddc021000 rw-p 00000000 00:00 0 [stack] 堆栈区
$ sudo cat /proc/1/maps
5e0f9db45000-5e0f9db4b000 r--p 00000000 103:05 7119110 /usr/lib/systemd/systemd
5e0f9db4b000-5e0f9db56000 r-xp 00006000 103:05 7119110 /usr/lib/systemd/systemd
5e0f9db56000-5e0f9db5c000 r--p 00011000 103:05 7119110 /usr/lib/systemd/systemd
5e0f9db5c000-5e0f9db5e000 r--p 00016000 103:05 7119110 /usr/lib/systemd/systemd
5e0f9db5e000-5e0f9db5f000 rw-p 00018000 103:05 7119110 /usr/lib/systemd/systemd
5e0fcdd8b000-5e0fce1b5000 rw-p 00000000 00:00 0 [heap]
79724d000000-79724d0b3000 r--p 00000000 103:05 7091561 /usr/lib/x86_64-linux-gnu/libcrypto.so.3
79724d0b3000-79724d3e6000 r-xp 000b3000 103:05 7091561 /usr/lib/x86_64-linux-gnu/libcrypto.so.3
79724d3e6000-79724d4b1000 r--p 003e6000 103:05 7091561 /usr/lib/x86_64-linux-gnu/libcrypto.so.3
79724d4b1000-79724d50d000 r--p 004b0000 103:05 7091561 /usr/lib/x86_64-linux-gnu/libcrypto.so.3
79724d50d000-79724d510000 rw-p 0050c000 103:05 7091561 /usr/lib/x86_64-linux-gnu/libcrypto.so.3

/proc/net 提供了内核的网络数据的统计.