在 Linux 系统中,/proc
是一个虚拟文件系统,它提供了大量关于系统和正在运行的进程的信息。/proc/[pid]/stat
是其中一个文件,它提供了关于指定进程 ID(PID)的详细状态信息。
/proc/{pid}/stat
/proc/[pid]/stat
文件包含了进程的许多详细信息,这些信息对于系统管理员和开发者在调试、性能分析或系统监控时非常有用。
以下是 /proc/[pid]/stat
文件中一些字段的简要说明:
- pid:进程的唯一标识符(PID)。
- comm:进程的命令名(通常是程序的基名)。
- state:进程的状态,例如
R
(运行)、S
(睡眠)、D
(不可中断的睡眠)等。 - ppid:父进程的 PID。
- pgrp:进程的进程组 ID。
- session:进程所在的会话 ID。
- tty_nr:控制进程的终端设备的编号。
- tpgid:前台进程组的 ID。
- flags:进程的标志,表示进程的状态和行为。
- minflt, majflt:进程发生的页面错误的次数(次要和主要)。
- cminflt, cmajflt:子进程发生的页面错误的次数(次要和主要)。
- utime, stime:进程在用户模式和内核模式下花费的 CPU 时间。
- cutime, cstime:子进程在用户模式和内核模式下花费的 CPU 时间。
- priority, nice:进程的优先级和 nice 值。
- num_threads:进程中的线程数。
- itrealvalue, stimerealvalue:进程的时间片长度和累积的睡眠时间。
- start_time:进程的启动时间(自系统启动以来的时钟滴答数)。
- vsize:进程的虚拟内存大小。
- rss:进程使用的驻留集大小。
- rsslim:进程的驻留集大小限制。
- start_code, end_code:进程代码段的地址范围。
- start_stack, kstkesp:进程堆栈的地址范围。
- kstkeip:进程指令指针的地址。
- signal, blocked, sigignore, sigcatch:进程的信号相关信息。
- wchan:进程在等待的通道或资源的地址。
- nswap:进程交换出的页面数。
- cnswap:子进程交换出的页面数。
- exit_signal:进程终止时的信号。
- processor:执行进程的 CPU 编号。
- rt_priority:进程的实时优先级。
- policy:进程的调度策略。
- delayacct_blkio_ticks:进程在块 I/O 上花费的延迟时间(已废弃)。
- guest_time, cguest_time:进程在虚拟机中花费的 CPU 时间。
要获取关于特定系统上 /proc/[pid]/stat
文件的详细信息,您可以查看 man 5 proc
手册页。
查询进程使用的内存大小
在 Linux 中,你可以使用多种命令来查询进程使用的内存大小。以下是一些常用的方法:
-
使用
/proc/[pid]/status
文件:
每个进程在/proc
目录下都有一个与其 PID 对应的子目录,其中包含了一个名为status
的文件。这个文件包含了进程的详细信息,包括内存使用情况。cat /proc/[pid]/status | grep Vm
这将显示一系列以
Vm
开头的行,其中VmSize
表示进程虚拟内存的总大小,VmRSS
表示进程正在使用的物理内存大小(驻留集大小),VmPeak
表示进程虚拟内存使用量的峰值等。 -
使用
ps
命令:ps
命令是一个用于报告当前系统进程状态的工具。你可以使用它来查看进程的内存使用情况。ps -o pid,user,%mem,vsz,rss,comm -p [pid]
这里:
%mem
显示进程使用的物理内存百分比。vsz
显示进程的虚拟内存大小(以 KB 为单位)。rss
显示进程使用的驻留集大小(以 KB 为单位)。comm
显示命令名(通常是程序的基名)。
-
使用
top
或htop
命令:
这两个命令都提供了实时的系统状态视图,包括进程的内存使用情况。在
top
中,你可以直接看到%MEM
列,它显示了每个进程使用的物理内存百分比。你还可以按M
键来根据内存使用量对进程进行排序。htop
是top
的一个增强版本,它提供了一个更友好的界面和更多的功能。你可以直接在界面中看到进程的内存使用情况,并可以使用鼠标或键盘进行操作。 -
使用
pmap
命令:pmap
命令用于报告进程的内存映射。它可以显示进程地址空间中的各个区域的详细信息,包括哪些区域被映射到了文件、哪些区域是私有的等。pmap -x [pid]
这将显示进程的内存映射,你可以从中计算出进程使用的总内存大小。
-
使用
/proc/[pid]/smaps
文件:
这个文件提供了进程内存映射的详细信息,包括每个映射区域的内存使用情况。这对于深入了解进程的内存布局和使用情况非常有用。cat /proc/[pid]/smaps | grep -E '^(Rss|Size):'
这将显示每个映射区域的
Rss
(驻留集大小)和Size
(总大小)。注意,这个文件包含的信息非常详细,可能需要一些时间来解析。计算进程的 CPU 时间
计算进程的 CPU 时间
在 Linux 中,你可以通过几种不同的方法来计算进程的 CPU 时间。CPU 时间是指进程在 CPU 上执行的时间,通常分为用户态时间(user CPU time)和内核态时间(system CPU time)。
-
使用
/proc/[pid]/stat
文件:/proc/[pid]/stat
文件中包含了进程的 CPU 时间信息。你可以解析这个文件来获取用户态时间和内核态时间。cat /proc/[pid]/stat | awk '{print "User CPU time:", $14, "System CPU time:", $15}'
这里,
$14
是utime
(用户态时间),$15
是stime
(内核态时间),它们都是以时钟滴答数(clock ticks)表示的。你可以通过/proc/timer_list
或使用sysconf(_SC_CLK_TCK)
来获取时钟滴答的频率,通常是 100(在较新的系统中可能是 1000),然后将其转换为秒。 -
使用
ps
命令:ps
命令可以显示进程的 CPU 时间。使用-o
选项可以定制输出格式。ps -p [pid] -o pid,tid,etime,time,%cpu,cmd
这里:
etime
表示进程的已过去运行时间(elapsed time)。time
表示进程的总 CPU 时间,格式为mm:ss.xx
或m:ss.xx
。%cpu
表示进程占用的 CPU 百分比。
注意:
ps
命令的time
字段显示的是总 CPU 时间,它是用户态时间和内核态时间的总和。 -
使用
top
或htop
命令:top
和htop
命令提供了实时的系统状态视图,它们都可以显示进程的 CPU 时间。在
top
中,你可以直接看到%CPU
列,它显示了进程占用的 CPU 百分比。TIME+
列显示了进程的总 CPU 时间。htop
提供了类似的视图,但界面更加友好。 -
计算进程的 CPU 时间百分比:
如果你想要计算进程在某个时间段内的 CPU 使用率,你可以使用ps
命令在两个时间点采样%cpu
值,并计算它们之间的差异。或者使用pidstat
工具(需要安装sysstat
包)来报告进程的 CPU 使用情况。pidstat -p [pid] 1 5 # 每秒报告一次,共报告 5 次
这将显示包括
%usr
(用户态时间百分比)和%system
(内核态时间百分比)在内的 CPU 使用情况。