文章目录
1、研究目的
根据各个方向对于应用监控系统资源的使用情况。
2、关于proc
2.1、关于/proc/[pid]/status
经过研究,top命令也是主要使用了proc的接口进行读取各个进程的信息,所以对proc虚拟文件系统进行了研究。
我们重点关注/proc/[pid]/status中为我们提供的信息。这些信息可以对进程的状态进行监控。
主要信息有:
Name:该进程的名称
State:当前进程的状态,包括R(running),S(sleeping),D(disk sleep),T(stopped),Z (zombie),X (dead)
Tgid:进程组ID
Pid:进程IO
Ppid:父进程的PID
TracerPid:追踪该进程的PID
Uid,Gid: 进程所有者的用户id
FDSize:当前分配的文件描述符
Groups:补充的组列表
VmPeak:最高虚拟内存占用大小
VmSize:虚拟内存大小
VmLck:锁住的内存大小(see mlock(3))
VmPin:压住的内存,这些页不能移动,因为一些东西需要直接使用物理内存
VmHWM:最大的RSS
VmRSS:虚拟内存驻留集合大小。这是驻留在物理内存的一部分。它没有交换到硬盘。它包括代码,数据和栈。
VmData, VmStk, VmExe:数据、堆、文本段大小
VmLib:共享库的大小
VmPTE:入口页表大小
VmPMD:二级页表大小
VmSwap:共享内存的大小
Threads:线程数量
SigQ:该属性有两个数据,第一个数据指当前的消息队列,第二个是消息队列的资源限制。
SigPnd,ShdPnd:为线程和进程固定的signals。
SigBlk, SigIgn, SigCgt:关于堵塞、忽略、捕捉的信号掩码。
CapInh, CapPrm, CapEff: 性能使能掩码
CapBnd:性能绑定设置
CapAmb:环境性能设置
Seccomp:Seccomp模式
Cpus_allowed:运行该进程的CPU上的掩码
Cpus_allowed_list:
Mems_allowed:被允许的内存节点的掩码
Mems_allowed_list:
voluntary_ctxt_switches, nonvoluntary_ctxt_switches:自发和非自发的上下文切换次数。
2.2、关于/proc/[pid]/stat
[root@localhost ~]# cat /proc/6873/stat
6873 (a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 0 41958 31 0 0 25 0 3 0 5882654 1409024 56 4294967295 134512640 134513720 3215579040 0 2097798 0 0 0 0 0 0 0 17 0 0 0
每个参数意思为:
参数解释
pid=6873 进程(包括轻量级进程,即线程)号
comm=a.out 应用程序或命令的名字
task_state=R 任务的状态,R:runnign, S:sleeping (TASK_INTERRUPTIBLE), D:disk sleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop,Z:zombie, X:dead
ppid=6723 父进程ID
pgid=6873 线程组号
sid=6723 c该任务所在的会话组ID
tty_nr=34819(pts/3) 该任务的tty终端的设备号,INT(34817/256)=主设备号,(34817-主设备号)=次设备号
tty_pgrp=6873 终端的进程组号,当前运行在该任务所在终端的前台任务(包括shell 应用程序)的PID。
task->flags=8388608 进程标志位,查看该任务的特性
min_flt=77 该任务不需要从硬盘拷数据而发生的缺页(次缺页)的次数
cmin_flt=0 累计的该任务的所有的waited-for进程曾经发生的次缺页的次数目
maj_flt=0 该任务需要从硬盘拷数据而发生的缺页(主缺页)的次数
cmaj_flt=0 累计的该任务的所有的waited-for进程曾经发生的主缺页的次数目
utime=1587 该任务在用户态运行的时间,单位为jiffies
stime=1 该任务在核心态运行的时间,单位为jiffies
cutime=0 累计的该任务的所有的waited-for进程曾经在用户态运行的时间,单位为jiffies
cstime=0 累计的该任务的所有的waited-for进程曾经在核心态运行的时间,单位为jiffies
priority=25 任务的动态优先级
nice=0 任务的静态优先级
num_threads=3 该任务所在的线程组里线程的个数
it_real_value=0 由于计时间隔导致的下一个 SIGALRM 发送进程的时延,以 jiffy 为单位.
start_time=5882654 该任务启动的时间,单位为jiffies
vsize=1409024(page) 该任务的虚拟地址空间大小
rss=56(page) 该任务当前驻留物理地址空间的大小
Number of pages the process has in real memory,minu 3 for administrative purpose.
这些页可能用于代码,数据和栈。
rlim=4294967295(bytes) 该任务能驻留物理地址空间的最大值
start_code=134512640 该任务在虚拟地址空间的代码段的起始地址
end_code=134513720 该任务在虚拟地址空间的代码段的结束地址
start_stack=3215579040 该任务在虚拟地址空间的栈的结束地址
kstkesp=0 esp(32 位堆栈指针) 的当前值, 与在进程的内核堆栈页得到的一致.
kstkeip=2097798 指向将要执行的指令的指针, EIP(32 位指令指针)的当前值.
pendingsig=0 待处理信号的位图,记录发送给进程的普通信号
block_sig=0 阻塞信号的位图
sigign=0 忽略的信号的位图
sigcatch=082985 被俘获的信号的位图
wchan=0 如果该进程是睡眠状态,该值给出调度的调用点
nswap 被swapped的页数,当前没用
cnswap 所有子进程被swapped的页数的和,当前没用
exit_signal=17 该进程结束时,向父进程所发送的信号
task_cpu(task)=0 运行在哪个CPU上
task_rt_priority=0 实时进程的相对优先级别
task_policy=0 进程的调度策略,0=非实时进程,1=FIFO实时进程;2=RR实时进程
3、top命令关于cpu占用率的实现
static void get_jiffy_counts(void)
{
···
while (1) {
cpu_jif = xrealloc_vector(cpu_jif, 1, num_cpus)