linux proc系统

Linux的/proc文件系统是一个特殊的文件系统,它提供了访问内核和进程信息的接口。它不是一个存储在硬盘上的文件系统,而是一个虚拟的文件系统,存在于内存中,用于向用户和进程展示有关系统状态和进程信息的数据。

系统相关信息

/proc目录下的文件和子目录提供了对系统状态和进程信息的访问点。一些常见的子目录和文件包括:

/proc/cpuinfo:包含有关CPU的信息,如型号、频率、缓存大小等。
/proc/meminfo:包含有关内存的信息,如总内存、可用内存、交换空间等。
/proc/net:包含有关网络协议和连接的信息。
/proc/PID:每个运行的进程都有一个以PID命名的子目录,包含该进程的相关信息,如命令行参数、打开的文件、内存映射等。
/proc/sys:包含了系统内核的运行时参数和配置信息,可以通过读写这些文件来修改内核参数。
访问/proc文件系统:
/proc文件系统可以像访问普通文件和目录一样进行读取和写入操作。可以使用标准的文件I/O操作函数(如open()、read()、write())或命令行工具(如cat、echo)来访问/proc中的文件和目录。

获取系统和进程信息:
/proc文件系统提供了一种方便的方式来获取系统和进程的信息,可以通过读取相应的文件来获得特定的信息。例如:

获得CPU信息:

cat /proc/cpuinfo

获得内存信息:

cat /proc/meminfo

获得进程列表:

ls /proc

修改内核参数:
/proc/sys目录下的文件提供了一种方式来修改内核运行时的参数和配置。可以通过修改这些文件的内容来调整系统的行为。例如:

修改文件句柄限制:

echo 100000 > /proc/sys/fs/file-max

注意事项:

/proc文件系统中的文件和目录是动态生成的,它们的内容是实时反映系统状态的。
对/proc文件系统的读取操作是非阻塞的,读取时会立即返回当前可用的数据。
/proc文件系统中的一些文件只有超级用户(root)才能访问。
/proc文件系统是Linux中非常有用的一个功能,它提供了对系统和进程信息的实时访问。通过读取和操作/proc文件系统中的文件和目录,可以获取关于系统状态、硬件信息、进程信息等各种有用的数据。下面是继续描述Linux的/proc系统的一些重要信息:

进程相关信息

/proc/[PID]/status:包含有关特定进程(使用PID替换[PID])的状态信息,如进程ID、父进程ID、内存使用情况等。
/proc/[PID]/cmdline:包含特定进程的命令行参数。
/proc/[PID]/fd:是一个目录,包含特定进程打开的文件描述符的符号链接。
/proc/[PID]/maps:包含特定进程的内存映射信息,显示进程使用的内存区域及其权限等。
/proc/[PID]/stat:包含特定进程的统计信息,如CPU使用时间、状态等。
/proc/[PID]/cpuinfo:包含特定进程运行在哪个CPU核心上的信息。
系统状态和硬件信息:

/proc/loadavg:包含系统的平均负载情况。
/proc/uptime:包含系统自上次启动以来的运行时间和空闲时间。
/proc/meminfo:包含系统内存使用情况,如总内存、可用内存、缓存等。
/proc/version:包含系统内核版本信息。
/proc/cpuinfo:包含系统CPU信息,如型号、频率、缓存等。
/proc/filesystems:包含支持的文件系统类型。
网络和网络连接信息:

/proc/net/dev:包含网络设备的统计信息,如接收和发送的数据包数量、错误等。
/proc/net/arp:包含ARP(Address Resolution Protocol)缓存信息。
/proc/net/tcp:包含当前TCP连接的信息。
/proc/net/udp:包含当前UDP连接的信息。
/proc/net/icmp:包含ICMP(Internet Control Message Protocol)统计信息。
其他一些有用的信息:

/proc/sys:是一个目录,包含系统内核运行时的参数和配置信息,如文件句柄限制、网络参数等。
/proc/self:是一个指向当前正在运行的进程自身的符号链接。可以使用它访问当前进程的信息,类似于/proc/[PID]。
需要注意的是,/proc文件系统中的文件和目录可能因Linux发行版和内核版本的不同而有所差异。此外,对/proc文件系统的读取和操作需要适当的权限,某些文件只能由超级用户(root)访问。

Linux的/proc文件系统相关信息

/proc/sys/kernel目录:
/proc/sys/kernel/hostname:包含主机名信息。
/proc/sys/kernel/osrelease:包含操作系统内核版本信息。
/proc/sys/kernel/panic:设置系统遇到严重错误时的行为,如重启或转储内存。
/proc/sys/kernel/panic_on_oops:设置是否在内核遇到致命错误(oops)时自动触发panic。
/proc/sys/kernel/sem:包含系统的信号量参数,用于进程间同步。
/proc/sys/kernel/sysrq:用于控制sysrq功能,可以通过sysrq键组合触发一些特殊操作。
/proc/sys/net目录:
/proc/sys/net/core:包含核心网络参数,如最大套接字缓冲区大小、消息队列长度等。
/proc/sys/net/ipv4:包含IPv4网络参数,如IP转发、路由缓存等。
/proc/sys/net/ipv6:包含IPv6网络参数,如IPv6转发、邻居缓存等。
/proc/sys/net/bridge:用于桥接网络设置的参数。
/proc/sys/net/icmp:包含ICMP参数,如ICMP重定向、错误报文等。
/proc/sys/fs目录:
/proc/sys/fs/file-max:限制系统上可以打开的文件句柄数。
/proc/sys/fs/inotify:包含inotify文件系统参数,用于文件和目录监控。
/proc/sys/fs/inotify/max_user_watches:限制一个用户可以监视的inotify对象数。
/proc/sys/fs/inotify/max_user_instances:限制一个用户可以创建的inotify实例数。
/proc/sys/vm目录:
/proc/sys/vm/swappiness:控制内核在内存紧张时将数据交换到交换空间的倾向性。
/proc/sys/vm/dirty_ratio:指定内存脏页的最大比例。
/proc/sys/vm/dirty_background_ratio:指定内存脏页开始写回磁盘的比例。
这些仅是/proc文件系统中的一部分内容,还有许多其他文件和目录可以提供系统和进程的各种信息。/proc系统的使用可以帮助系统管理员、开发人员和调试人员深入了解系统的状态、配置参数和进程行为。请注意,/proc文件系统中的某些文件是只读的,而其他文件允许读取和写入。在使用/proc文件系统时,应小心避免误操作,以免对系统的正常运行产生不良影响。

通过/proc文件系统获取特定进程的CPU和内存使用率的信息

通过 /proc/[PID]/stat 文件查看某一进程的 CPU 活动信息
在 /proc/[PID]/ 目录下的各个文件记录着 这个进程的各项运行指标,通过查看 /proc/[PID]/stat 文件,可以进程运行的详细信息,其中就包括 CPU 占用信息。

[root@rh ~]$ cat /proc/1/stat
1 (init) S 0 1 1 0 -1 4202752 3026 2635222 9 483 5 165 102346 3188016 20 0 1 0 1 19820544 384 18446744073709551615 1 1 0 0 0 0 0 4096 536962595 18446744073709551615 0 0 0 4 0 0 34 0 0

/proc/[PID]/stat 文件信息解释

1)我们可以通过 man 5 proc 命令查看文档,找到 /proc/[pid]/stat 节点,就可以看到各字段的意思了。如:

/proc/[pid]/stat
Status information about the process.  This is used by ps(1).  It is defined in /usr/src/linux/fs/proc/array.c.
The fields, in order, with their proper scanf(3) format specifiers, are:
pid %d      The process ID.
comm %s     The  filename  of the executable, in parentheses.  This is visible whether or not the executable is swapped out.
state %c    One character from the string "RSDZTW" where R is running, S is sleeping in an interruptible  wait,  D  is waiting in uninterruptible disk sleep, Z is zombie, T is traced or stopped (on a signal), and W is paging.
ppid %d     The PID of the parent.
......

2)具体解释,一个示例:

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 该任务所在的会话组 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实时进程

关于进程占用 CPU 的相关信息

在上述的时间中,这些信息会在计算 CPU 占用率时用到:

pid 进程号。
utime 该任务在用户态运行的时间,单位为 jiffies。
stime 该任务在核心态运行的时间,单位为 jiffies。
cutime 累计的该任务的所有的 waited-for 进程曾经在用户态运行的时间,单位为 jiffies。
cstime 累计的该任务的所有的 waited-for 进程曾经在核心态运行的时间,单位为 jiffies。
该进程的 CPU 占用时间(该值包括其所有线程的 CPU 时间):

processCPUTime = utime + stime + cutime + cstime

通过 /proc/[PID]/task/[TID]/stat 文件查看某一进程下的某一线程的活动信息
该文件包含了某一轻量级进程(lwp,即通常所说的线程)所有的活动信息,该文件中的所有值都是从系统启动开始累计到当前时刻。该文件的内容格式以及各字段的含义与 /proc/[PID]/stat 文件类似。该文件中的 tid 字段表示的是轻量级线程号。

该线程的 CPU 占用时间:

threadCPUTime = utime + stime

单核情况下 CPU 使用率的计算

首先,通过读取 /proc/stat 文件获取总的 CPU 时间,读取 /proc/[PID]/stat 获取进程 CPU 时间,读取 /proc/[PID]/task/[TID]/stat 获取线程 CPU 时间。然后,采样两个足够短的时间间隔的 CPU 快照与进程或线程快照来计算其 CPU 使用率。

计算总的 CPU 使用率 totalCPUUse

1)采样两个足够短的时间间隔的 CPU 快照,即读取 /proc/stat 文件,获取两个时间点的下列数据:

CPUT1 (user1, nice1, system1, idle1, iowait1, irq1, softirq1, stealstolen1, guest1);
CPUT2 (user2, nice2, system2, idle2, iowait2, irq2, softirq2, stealstolen2, guest2);
2)计算总的 CPU 时间 totalCPUTime:

CPUTime1 = user1 + nice1 + system1 + idle1 + iowait1 + irq1 + softirq1 + stealstolen1 + guest1;
CPUTime2 = user2 + nice2 + system2 + idle2 + iowait2 + irq2 + softirq2 + stealstolen2 + guest2;
totalCPUTime = CPUTime2 – CPUTime1;

3)计算 CPU 空闲时间 idleCPUTime:

idleCPUTime = idle2 – idle1;

4)计算总的 CPU 使用率 totalCPUUse:

totalCPUUse = (totalCPUTime – idleCPUTime) / totalCPUTime;

计算某一进程的 CPU 使用率 processCPUUse

1)采样两个足够短的时间间隔的 CPU 快照和对应的进程快照,即读取 /proc/stat 文件,获取两个时间点的下列数据:

CPUT1 (user1, nice1, system1, idle1, iowait1, irq1, softirq1, stealstolen1, guest1);
CPUT2 (user2, nice2, system2, idle2, iowait2, irq2, softirq2, stealstolen2, guest2);
读取 /proc/[PID]/stat 文件,获取两个时间点的下列数据:

ProcessT1 (utime1, stime1, cutime1, cstime1);
ProcessT2 (utime2, stime2, cutime2, cstime2);
2)计算总的 CPU 时间 totalCPUTime 和进程时间 processTime:

CPUTime1 = user1 + nice1 + system1 + idle1 + iowait1 + irq1 + softirq1 + stealstolen1 + guest1;
CPUTime2 = user2 + nice2 + system2 + idle2 + iowait2 + irq2 + softirq2 + stealstolen2 + guest2;
totalCPUTime = CPUTime2 – CPUTime1;

processTime1 = utime1 + stime1 + cutime1 + cstime1;
processTime2 = utime2 + stime2 + cutime1 + cstime2;
processTime = processTime2 – processTime1;

3)计算该进程的 CPU 使用率 processCPUUse:

processCPUUse = processTime / totalCPUTime;

计算某一线程的 CPU 使用率 threadCPUUse

1)采样两个足够短的时间间隔的 CPU 快照和对应的线程快照,即读取 /proc/stat 文件,获取两个时间点的下列数据:

CPUT1 (user1, nice1, system1, idle1, iowait1, irq1, softirq1, stealstolen1, guest1);
CPUT2 (user2, nice2, system2, idle2, iowait2, irq2, softirq2, stealstolen2, guest2);
读取 /proc/[PID]/task/[TID]/stat 文件,获取两个时间点的下列数据:

threadT1 (utime1, stime1);
threadT2 (utime2, stime2);
2)计算总的 CPU 时间 totalCPUTime 和线程时间 threadTime:

CPUTime1 = user1 + nice1 + system1 + idle1 + iowait1 + irq1 + softirq1 + stealstolen1 + guest1;
CPUTime2 = user2 + nice2 + system2 + idle2 + iowait2 + irq2 + softirq2 + stealstolen2 + guest2;
totalCPUTime = CPUTime2 – CPUTime1;

threadTime1 = utime1 + stime1;
threadTime2 = utime2 + stime2;
threadTime = threadTime2 – threadTime1;

3)计算该线程的 CPU 使用率 threadCPUUse:

threadCPUUse = threadTime / totalCPUTime;

多核情况下 CPU 使用率的计算

首先,通过读取 /proc/stat 文件获取总的 CPU 时间,读取 /proc/[PID]/stat 获取进程 CPU 时间,读取 /proc/[PID]/task/[TID]/stat 获取线程 CPU 时间,读取 /proc/cpuinfo 获取 CPU 个数。

在多核情况下计算进程或线程的 CPU 使用率,用上面的方式得到的通常是相对于 CPU 所有核的总共时间的占用率,而我们通常习惯得到进程或线程对某一个单核的占用率。所以我们可以按上面的方式计算得到 CPU 占用率,然后把结果乘上 CPU 的核数,即可得到进程或线程相对于一个单核的占用率。

多核情况下该线程的 CPU 使用率 mThreadCPUUse:

mThreadCPUUse = threadCPUUse * processorNum;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值