在Linux系统中,每个运行中的进程在/proc/{pid}/目录下都有一些虚拟文件,用于提供进程的各种信息。
cmdline
包含启动该进程的命令行参数,参数之间用空字符(\0)分隔,类似/proc/cmdline,不同的是/proc/cmdline记录的是内核的启动参数。如下是一个java进程示例:
/usr/bin/java -server-Xms3800m-Xmx3800m-Xmn1500m-Xss512k-XX:MetaspaceSize=340m-XX:MaxMetaspaceSize=340m
environ
描述:包含进程的环境变量,每个变量以空字符(\0)分隔。使用该文件可以查看进程的环境配置信息,如路径设置、用户变量等。
cwd
这是一个符号链接,指向进程的当前工作目录(Current Working Directory)
exe
一个符号链接,指向进程执行的二进制可执行文件。例如java进程指向的可能是:/usr/bin/java。**comm**文件这里仅包含进程的名称,对应的就是java。
fd/
这是一个目录,包含了该进程打开的所有文件描述符。每个文件描述符(如 0, 1, 2, …)都是一个指向相应文件或设备的符号链接。用于监控进程打开的文件、网络连接、管道等资源。
fdinfo/
子目录,提供每个文件描述符的详细信息,如偏移量、访问模式等。可以获取更详细的文件描述符状态信息,用于调试和深入分析。
maps
基本内存映射信息:maps文件提供进程的内存区域的简要信息,包括每个内存段的起始和结束地址、权限(读、写、执行)、偏移量、设备号、inode号以及关联的文件路径(如果有的话)。
address perms offset dev inode pathname
00400000-0040b000 r-xp 00000000 08:01 123456 /usr/bin/bash
0060a000-0060b000 r--p 0000a000 08:01 123456 /usr/bin/bash
...
用途:适用于需要快速了解进程内存布局的场景,如调试、简单的内存分析等。例如pmap命令是基于该文件的信息来生成输出的、async-profiler也是使用该文件去load 对应java进程的lib。
smaps
详细内存映射信息:smaps文件在maps提供的信息基础上,增加了每个内存区域的详细使用统计,包括但不限于:
- Size:内存区域的总大小。
- Rss(Resident Set Size):常驻集大小,表示当前驻留在物理内存中的字节数。
- Pss(Proportional Set Size):比例集大小,用于更准确地计算共享内存的使用。
- Shared_Clean/Shared_Dirty:共享且干净/脏的数据量。
- Private_Clean/Private_Dirty:私有且干净/脏的数据量。
其他如Referenced、Anonymous等字段,提供更多内存使用细节。
$ cat smaps
MemRegion: 00400000-0040b000 r-xp 00000000 08:01 123456 /usr/bin/bash
Size: 44 kB
Rss: 44 kB
Pss: 22 kB
Shared_Clean: 44 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
...
用途:适用于需要深入分析内存使用情况的场景,如内存调优、性能分析、安全检查等。通过smaps,可以更精确地了解每个内存区域的实际使用情况,尤其是在涉及共享内存时。由于smaps包含的信息非常详细,读取和解析smaps文件可能会比maps文件耗时更多,并且占用更多的系统资源。因此,在进行大规模或频繁的内存分析时,需要考虑其性能影响.
stat
包含进程的状态信息,字段按照固定格式排列,包含如PID、状态、优先级、CPU时间等。可以快速获取进程的基本状态和资源使用情况。stat文件内容示例。
$ cat stat
3031 (java) S 1 2267 2232 0 -1 1077936128 23809160 325 1029240 6 2801932 609120 4 0 20 0 474 0 14289 6803951616 614235 18446744073709551615 4194304 4196452 140733153204976 0 0 0 0 2 16800973 0 0 0 17 7 0 0 0 0 0 6293608 6294272 12935168 140733153211461 140733153214501 140733153214501 140733153226718 0
字段说明:
3031- 进程ID(java)- 进程名称S- 进程状态(睡眠)1- 父进程ID- 之后的字段依次代表进程的各种统计信息,如用户时间、系统时间、虚拟内存大小
status
提供比 stat 更人类可读的进程状态信息,采用键值对格式,包括名称、状态、优先级、内存使用、线程数等。
limits
显示进程的资源限制,如最大打开文件数、最大堆栈大小等。
io
提供进程的I/O统计信息,如读写字节数、次数等。监控进程的I/O行为和性能。
$ cat io
rchar: 638753215
wchar: 1973438974
syscr: 1911680
syscw: 4592044
read_bytes: 58630144
write_bytes: 7692730368
cancelled_write_bytes: 114688
task/
子目录,包含该进程所有线程的目录。每个线程有一个以线程ID(TID)命名的子目录,结构类似于 /proc/{pid}/。可以提供每个线程的状态和资源使用分析。

753

被折叠的 条评论
为什么被折叠?



