摘要
本文部分内容来源于网络,个人收集整理,请勿传播
Linux系统下/proc/
目录详解
/proc/
下部分文件目录详解
本文仅挑几个可能用的上的记录
1 | . |
/proc/net子目录
1 | arp #转储每个网络接口的arp表中dev包的统计 |
/proc/<pid>/
1 | . |
statm
/proc/[pid]/statm
显示进程所占用内存大小的统计信息,包含七个值,度量单位是page(page大小可通过getconf PAGESIZE得到)。举例如下:
1 | # cat /proc/2948/statm |
- 进程占用的总的内存
- 进程当前时刻占用的物理内存
- 同其它进程共享的内存
- 进程的代码段
- 共享库(从2.6版本起,这个值为0)
- 进程的堆栈
- dirty pages(从2.6版本起,这个值为0)。
/proc/6873/stat
1 | 19211 (docker-proxy) S 18582 18582 18582 0 -1 1077936384 400 0 24 0 385 870 0 0 20 0 5 0 1476270373 111624192 397 18446744073709551615 94908437864448 94908439349548 140733819451920 140733819451256 94908438772659 0 2079996453 0 2143420159 0 0 0 17 0 0 0 16 0 0 94908441446824 94908442361816 94908444303360 140733819457191 140733819457307 140733819457307 140733819457506 0 |
每个参数意思为:
1 | 参数 解释 |
/proc/pid/status
1 | Name: dockerd # 进程名 |
通过stat计算cpu使用率
- ps命令算出来的cpu使用率相对于进程启动时的平均值,随着进程运行时间的增大,该值会趋向于平缓。
- 某一个线程在其运行期间其所使用的cpu可能会发生变化。
- 在多核的情况下top命令输出的cpu使用率实质是按cpu个数*100%计算的。
/proc/cpuinfo
通过该文件根据processor出现的次数统计cpu的逻辑个数(包括多核、超线程)。
/proc/stat
1 | cpu 16382797 158616 10937579 2903612556 18440580 0 465274 0 0 0 |
第一行的数值表示的是CPU总的使用情况,所以我们只要用第一行的数字计算就可以了。下表解析第一行各数值的含义:
jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在linux中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同linux内核可能值有不同,通常在1ms到10ms之间
参数 | 解析(单位:jiffies) |
---|---|
user (16382797) | 从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程 |
nice (158616) | 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间 |
system (10937579) | 从系统启动开始累计到当前时刻,处于核心态的运行时间 |
idle (2903612556) | 从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间iowait (18440580) 从系统启动开始累计到当前时刻,IO等待时间(since 2.5.41) |
irq (0) | 从系统启动开始累计到当前时刻,硬中断时间(since 2.6.0-test4) |
softirq (465274) | 从系统启动开始累计到当前时刻,软中断时间stealstolen(0),guest(0) |
总的cpu时间:totalCpuTime = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest
/proc/<pid>/stat
以下只解释对我们计算Cpu使用率有用相关参数
参数 | 解释 |
---|---|
pid=6873 | 进程号 |
utime=1587 | 该任务在用户态运行的时间,单位为jiffies |
stime=41958 | 该任务在核心态运行的时间,单位为jiffies |
cutime=0 | 所有已死线程在用户态运行的时间,单位为jiffies |
cstime=0 | 所有已死在核心态运行的时间,单位为jiffies |
进程的总Cpu时间: processCpuTime = utime + stime + cutime + cstime
,该值包括其所有线程的cpu时间。
/proc/<pid>/task/<tid>/stat
该文件的内容格式以及各字段的含义同/proc/<pid>/stat
文件。
注意,该文件中的tid字段表示的不再是进程号,而是linux中的轻量级进程(lwp),即我们通常所说的线程。
线程Cpu时间: threadCpuTime = utime + stime
总的Cpu使用率计算
- 需要采样两个足够短的时间间隔的cpu快照与进程快照分别记作t1,t2
user、nice、system、idle、iowait、irq、softirq、stealstolen、guest
- 计算总的Cpu时间片
totalCpuTime
- 把第一次的所有cpu使用情况求和,得到s1
- 把第二次的所有cpu使用情况求和,得到s2
s2 - s1
得到这个时间间隔内的所有时间片,即totalCpuTime = s2 - s1
- 计算空闲时间idle
idle
(第四列的数据)=用第二次的第四列 - 第一次的第四列即可
- 计算cpu使用率
pcpu =100* (total-idle)/total
某一进程Cpu使用率的计算
- 采样两个足够短的时间间隔的cpu快照与进程快照
- 每一个进程快照均为 (utime、stime、cutime、cstime)的4元组
- 计算总cpu时间片 totalCpuTime1、totalCpuTime2
- 计算总进程cpu时间片 processCpuTime1、processCpuTime2
- 计算该进程的cpu使用率
pcpu = 100*( processCpuTime2 – processCpuTime1) / (totalCpuTime2 – totalCpuTime1)
- 如果是多核情况下还需乘以cpu的个数;
某一线程Cpu使用率的计算
- 采样两个足够短的时间隔的cpu快照与线程快照
- 每一个线程快照均为 (utime、stime)的2元组
- 计算总cpu时间片 totalCpuTime1、totalCpuTime2
- 计算总进程cpu时间片 threadCpuTime1、threadCpuTime2
- 计算该线程的cpu使用
pcpu = 100*( threadCpuTime2 – threadCpuTime1) / (totalCpuTime2 – totalCpuTime1)
- 如果是多核情况下还需乘以cpu的个数