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详解》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Modeling the Internet and the Web

Modeling the Internet and the Web

Pierre Baldi、Paolo Frasconi、Padhraic Smyth / Wiley / 2003-7-7 / USD 115.00

Modeling the Internet and the Web covers the most important aspects of modeling the Web using a modern mathematical and probabilistic treatment. It focuses on the information and application layers, a......一起来看看 《Modeling the Internet and the Web》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

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

HEX HSV 互换工具