linux基础-proc详解

栏目: 后端 · 发布时间: 5年前

内容简介:Linux系统下本文仅挑几个可能用的上的记录

Linux系统下 /proc/ 目录详解

/proc/ 下部分文件目录详解

本文仅挑几个可能用的上的记录

.
|-- cgroups	# 资源隔离
|-- cmdline	# 这个文件给出了内核启动的命令行。它和用于进程的cmdline项非常相似。
|-- cpuinfo	# 这个文件提供了有关系统CPU的多种信息。这些信息是从内核里对CPU的测试代码中得到的。
|-- devices	# 这个文件列出字符和块设备的主设备号,以及分配到这些设备号的设备名称。
|-- filesystems	# 这个文件列出可供使用的文件系统类型,一种类型一行。虽然它们通常是编入内核的文件系统类型,但该文件还可以包含可加载的内核模块加入的其它文件系统类型。
|-- kcore	# 这个文件是系统的物理内存以core文件格式保存的文件。例如,GDB能用它考察内核的数据结构。它不是纯文本,而是/proc目录下为数不多的几个二进制格式的项之一。
|-- loadavg	# 这个文件给出以几个不同的时间间隔计算的系统平均负载,这就如同uptime命令显示的结果那样。前三个数字是平均负载。这是通过计算过去1分钟,5分钟,15分钟里运行队列中的平均任务数得到的。随后是正在运行的任务数和总任务数。最后是上次使用的进程号。
|-- meminfo	# 这个文件给出了内存状态的信息。它显示出系统中空闲内存,已用物理内存和交换内存的总量。它还显示出内核使用的共享内存和缓冲区总量。这些信息的格式和free命令显示的结果类似。
|-- modules	# 这个文件给出可加载内核模块的信息。lsmod程序用这些信息显示有关模块的名称,大小,使用数目方面的信息。
|-- mounts -> self/mounts	# 这个文件以/etc/mtab文件的格式给出当前系统所安装的文件系统信息。这个文件也能反映出任何手工安装从而在/etc/mtab文件中没有包含的文件系统。
|-- net -> self/net	# 此目录下的文件描述或修改了联网代码的行为。可以通过使用arp,netstat,route和ipfwadm命令设置或查询这些特殊文件中的许多文件。
|-- stat	# 这个文件包含的信息有CPU利用率,磁盘,内存页,内存对换,全部中断,接触开关以及赏赐自举时间(自1970年1月1日起的秒数)。
|-- swaps
|-- sys	# 内核参数相关
|-- sysvipc
|-- uptime	# 这个文件给出自从上次系统自举以来的秒数,以及其中有多少秒处于空闲。这主要供uptime程序使用。比较这两个数字能够告诉你长期来看CPU周期浪费的比例。
|-- version	# 这个文件只有一行内容,说明正在运行的内核版本。可以用标准的编程方法进行分析获得所需的系统信息。
|-- vmstat	# vmstat 命令信息来源之一 https://www.cnblogs.com/ftl1012/p/vmstat.html
`-- zoneinfo

/proc/net子目录

arp	#转储每个网络接口的arp表中dev包的统计
dev	#来自网络设备的统计
dev_mcast	#列出二层(数据链路层)多播组
igmp	#加入的IGMP多播组
netlink	#netlink套接口的信息
netstat	#网络流量的多种统计。第一行是信息头,带有每个变量的名称。接下来的一行保存相应变量的值
raw	#原始套接口的套接口表
route	#静态路由表
rpc	#包含RPC信息的目录
rt_cache	#路由缓冲
snmp	#snmp agent的ip/icmp/tcp/udp协议统计;各行交替给出字段名和值
sockstat	#列出使用的tcp/udp/raw/pac/syc_cookies的数量
tcp	#TCP连接的套接口
udp	#UDP连接的套接口表
unix	#UNIX域套接口的套接口表

/proc/<pid>/

.
|-- cgroup	# 资源隔离
|-- cmdline	# 包含进程的完整命令行信息。如果这个进程是zombie进程,则这个文件没有任何内容。
|-- cwd -> /home/work/opbin/domain-router	# 当前工作目录的软链接
|-- comm	# 进程名
|-- environ	# 进程的环境变量
|-- exe -> /home/work/opbin/domain-router/sbin/nginx	# 实际运行程序的软链接
|-- fd	# 包含进程打开文件的情况
|-- fdinfo
|-- io	# 进程的io信息
|-- limits	# 进程的资源限制
|-- maps	# 进程的内存区域映射信息
|-- mountinfo
|-- mounts
|-- mountstats
|-- net	# 进程使用的网络内核参数
|-- root -> /	# 是进程根目录的软链接
|-- sched
|-- smaps
|-- stack	# 显示当前进程的内核调用栈信息,只有内核编译时打开了CONFIG_STACKTRACE编译选项,才会生成这个文件
|-- stat	# 包含了所有CPU活跃的信息,该文件中的所有值都是从系统启动开始累计到当前时刻
|-- statm	# 显示进程所占用内存大小的统计信息,包含七个值,度量单位是page(page大小可通过getconf PAGESIZE得到)
|-- status	# 进程内存信息
|-- syscall	# 显示当前进程正在执行的系统调用
|-- task	# 进程包含的的线程信息
`-- wchan	# 显示当进程sleep时,kernel当前运行的函数

statm

/proc/[pid]/statm 显示进程所占用内存大小的统计信息,包含七个值,度量单位是page(page大小可通过getconf PAGESIZE得到)。举例如下:

# cat /proc/2948/statm  
72362 12945 4876 569 0 24665 0
  • 进程占用的总的内存
  • 进程当前时刻占用的物理内存
  • 同其它进程共享的内存
  • 进程的代码段
  • 共享库(从2.6版本起,这个值为0)
  • 进程的堆栈
  • dirty pages(从2.6版本起,这个值为0)。

/proc/6873/stat

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

每个参数意思为:

参数 解释
pid=19211 进程(包括轻量级进程,即线程)号
comm=docker-proxy 应用程序或命令的名字
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实时进程

/proc/pid/status

Name:	dockerd	# 进程名
State:	S (sleeping)	# 进程状态
## R (running)", "S (sleeping)", "D (disk sleep)", "T (stopped)", "T(tracing stop)", "Z (zombie)", or "X (dead)"
Tgid:	18582	# 线程组的ID,一个线程一定属于一个线程组(进程组)
Ngid:	0
Pid:	18582	# 进程的ID,更准确的说应该是线程的ID
PPid:	1	# 当前进程的父进程ID
TracerPid:	0	# 跟踪当前进程的进程ID,如果是0,表示没有跟踪,例如用strace跟踪
Uid:	0	0	0	0
Gid:	0	0	0	0
# 第一列数字(RUID):实际用户ID,指的是进程执行者是谁.
# 第二列数字(EUID):有效用户ID,指进程执行时对文件的访问权限.
# 第三列数字(SUID):保存设置用户ID,作为effective user ID的副本,在执行exec调用时后能重新恢复原来的effectiv user ID.
# 第四列数字(FSUID):目前进程的文件系统的用户识别码.一般情况下,文件系统的用户识别码(fsuid)与有效的用户识别码(euid)是相同的.
# RUID和EUID是由启动进程的用户决定的
# EUID,如果程序设定了setuid,那么在程序运行时是用程序的owner权限来运行程序,而不是启动的用户权限
终端1)
FDSize:	128	# FDSize是当前分配的文件描述符,这个值不是当前进程使用文件描述符的上限.
# 而如果超过32个文件描述符,将以32进行递增,如果是64位系统,将以64进行递增.
# FDSize这个值不会减少,如果我们程序打开了300个文件,并不会因为关闭文件,而减少FDSize这个值.
Groups:	# 这里的groups表示启动这个进程的用户所在的组.
NStgid:	18582
NSpid:	18582
NSpgid:	18582
NSsid:	18582
VmPeak:	  581816 kB	# 当前进程运行过程中占用内存的峰值
VmSize:	  581752 kB	# 进程现在正在占用的内存
VmLck:	       0 kB	# 进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘
VmPin:	       0 kB
VmHWM:	   89832 kB	# 得到分配到物理内存的峰值
VmRSS:	   40128 kB	# 现在使用的物理内存
VmData:	  476676 kB	# 进程数据段的大小
VmStk:	     132 kB	# 进程堆栈段的大小.
VmExe:	   47116 kB	# 进程代码的大小
VmLib:	    6128 kB	# 进程所使用LIB库的大小
VmPTE:	     396 kB	# 占用的页表的大小.
VmPMD:	      24 kB
VmSwap:	       0 kB	# 进程占用Swap的大小.
HugetlbPages:	       0 kB
Threads:	12	# 表示当前进程组有12个线程.
SigQ:	0/7338	# 当前待处理信号的个数
SigPnd:	0000000000000000	# 屏蔽位,存储了该线程的待处理信号,等同于线程的PENDING信号
ShdPnd:	0000000000000000	# 屏蔽位,存储了该线程组的待处理信号.等同于进程组的PENDING信号
SigBlk:	0000000000000000	# 存放被阻塞的信号,等同于BLOCKED信号
SigIgn:	0000000000000000	# 存放被忽略的信号,等同于IGNORED信号
SigCgt:	ffffffffffc1feff	# 存放捕获的信号,等同于CAUGHT信号
CapInh:	0000000000000000	# 表示能够被当前进程执行的程序继承的能力
CapPrm:	0000003fffffffff	# 表示进程能够使用的能力,在cap_permitted中可以包含cap_effective中没有的能力,这些能力是被进程自己临时放弃的,也可以说cap_effective是cap_permitted的一个子集
CapEff:	0000003fffffffff	# 当一个进程要进行某个特权操作时,操作系统会检查cap_effective的对应位是否有效,而不再是检查进程的有效UID是否为0
CapBnd:	0000003fffffffff	# 是系统的边界能力,我们无法改变它
CapAmb:	0000000000000000
Seccomp:	0
Cpus_allowed:	1	# 指出该进程可以使用CPU的亲和性掩码,因为我们指定为两块CPU,所以这里就是3,如果该进程指定为4个CPU(如果有话),这里就是F(1111)
Cpus_allowed_list:	0	# 0-1指出该进程可以使用CPU的列表,这里是0-1
Mems_allowed:	00000000,00000001 # 通cpu
Mems_allowed_list:	0	# 通cpu,使用了结点0的内存资源
voluntary_ctxt_switches:	24243383	# 表示进程主动切换的次数.
nonvoluntary_ctxt_switches:	6102321	# 表示进程被动切换的次数

通过stat计算cpu使用率

  • ps命令算出来的cpu使用率相对于进程启动时的平均值,随着进程运行时间的增大,该值会趋向于平缓。
  • 某一个线程在其运行期间其所使用的cpu可能会发生变化。
  • 在多核的情况下top命令输出的cpu使用率实质是按cpu个数*100%计算的。

/proc/cpuinfo

通过该文件根据processor出现的次数统计cpu的逻辑个数(包括多核、超线程)。

/proc/stat

cpu  16382797 158616 10937579 2903612556 18440580 0 465274 0 0 0
cpu0 16382797 158616 10937579 2903612556 18440580 0 465274 0 0 0
intr 4393119213 23 10 0 0 94 0 3 0 0 0 0 0 15 0 28917959 0 0 0 0 0 0 0 0 0 0 50063236 0 175989464 2840 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 10253696983
btime 1520949357
processes 23321669
procs_running 1
procs_blocked 0
softirq 2567139785 1 1177546622 7 351246654 14459636 0 16 0 0 1023886849

第一行的数值表示的是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快照与线程快照
  • 每一个线程快照均为 (utime、stime)的2元组
  • 计算总cpu时间片 totalCpuTime1、totalCpuTime2
  • 计算总进程cpu时间片 threadCpuTime1、threadCpuTime2
  • 计算该线程的cpu使用
    pcpu = 100*( threadCpuTime2 – threadCpuTime1) / (totalCpuTime2 – totalCpuTime1)
    

以上所述就是小编给大家介绍的《linux基础-proc详解》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

挑战编程技能

挑战编程技能

Brian P. Hogan / 臧秀涛 / 人民邮电出版社 / 2017-2 / 39.00元

新手程序员在具备了理论基础后,面对实际项目时,往往不知道如何解决问题;有经验的程序员在学习了一门新语言后,也会有很多不知道如何使用的特性。针对程序员的这一普遍困惑,资深软件工程师Brian P. Hogan在这本书中总结了57道练习题,教他们如何锤炼技能。这些练习题的难度会逐渐增加,使得编程训练充满挑战又乐趣多多。一起来看看 《挑战编程技能》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具