Proc令系统信息了如指掌
作者:佚名出处:51cto2010-01-13 07:01
Proc是一个虚拟文件系统,在Linux系统中它被挂载于/proc目录之上。
Proc是一个虚拟文件系统,在Linux系统中它被挂载于/proc目录之上。Proc有多个功能,这其中包括用户可以通过它访问内核信息或用于排错,这其中一个非常有用的功能,也是Linux变得更加特别的功能就是以文本流的形式来访问进程信息。很Linux命令(比如ps、toPpstree等)都需要使用这个文件系统的信息。
本文就是向用户介绍一些访问这些信息的方法。需要说明的是,本文所述的内容并不一定适用所有内核版本,有部分操作只适用于2.6内核。
一、进程信息
在/proc文件系统中,每一个进程都有一个相应的文件。下面是/proc目录下的一些重要文件:
/proc/pid/cmdline包含了用于开始进程的命令;
/proc/pid/cwd包含了当前进程工作目录的一个链接;
/proc/pid/environ包含了可用进程环境变量的列表;
/proc/pid/exe包含了正在进程中运行的程序链接;
/proc/pid/fd/这个目录包含了进程打开的每一个文件的链接;
/proc/pid/mem包含了进程在内存中的内容;
/proc/pid/stat包含了进程的状态信息;
/proc/pid/statm包含了进程的内存使用信息。
下面是一些获取进程信息的例子:
◆假设现在要查看是否所有的进程都会做存储器清除工作。在/proc/pid/stat文件中的每一个进程标识(第8个属性)提供了有关进程的很多"个人"信息。这个信息可以对每一个进程标识进行。
0x00000002 Process being created
0x00000004 Exiting
0x00000008 Dead
0x00000040 Process using
superuser privflage
0x00000200 P rocess dumping core
0x00000400 Prooess received some signal
0x00000800 Process allocating memory
0x00001000 Killed due to out-of--memory condition
笔者从/usr/src/linux/include/linux/sched.h中提取了这些信息。
◆/proc/pid/fd/目录提供了有关打开文件的信息。要查看被进程使用的输入文件,使用以下命令:
# ls –l /proc/pid/fd/0
◆查看被进程使用socket,使用以下命令:
#ls –l /proc/pid/fd|sed –n /socket/{s/.*\[//;s/\]//p}
有关这些socket的信息可以使用以下命令获取:
# netstat --ae
◆要将命令行参数传递给任意进程,使用以下命令:
~~cat /proc/pid/cmdline
◆要获取某一进程父进程的ID号,使用以下命令:
#grep PPid/proc/pid/status
二、普通的系统信息
Proc包含了很多系统信息,这其中包括CPU负载、文件系统和网络配置。下面是一些通过Proc查看和更改系统的例子:
◆获取可用系统内存的空间:
# grep Free /proc/meminfo
◆自从系统最后一次启动后的系统统计可以从/proc/stat文件中获取:
#grep processes /proc/stat
◆获知第1、5和15分钟系统负载的平均值:
#awk {print "1 min:\t" $1 "\n5 min:\t" $2 "\n15 min:\t" $3
/proc/loadavg
◆/proc/partitions可用于获取系统的分区信息。
◆/proc/net和/proc/sys/net可用于查看和更改重要的网络信息。比如,禁用ping命令,可以以root身份运行以下命令:
#echo 1>/proc/sys/net/ipv4/icmp_echo_ignore_all
如果要启用IP转发/IP伪装,使用以下命令:
#echo 1> /proc/sys/net/ipv4/ip_forward
◆已经挂载的文件系统信息可以从/proc/mounts中检索。
◆要改变正在使用的主机名,使用以下命令:
# echo www.abc.corn >/proc/sys/kernel/hostname
◆要获取CPU信息,使用以下命令:
# cat /proc/cpuinfo
◆要获知swap空间的使用情况,使用以下命令:
# cat /proc/swaps
◆获取系统的正常运行时间:
#cat /proc/uptime
◆列出由NFS共享的文件系统:
# cat /proc/fs/nfsd/exports
三、相关内核的信息
这是一个非常宽泛的主题,这里只介绍其中一小部分内容:
◆从正在运行的内核中获知内核的版本:
#cat /proc/version
◆/proc/kmsg文件被作为内核日志信息源,它可以被作为一个系统信息调用的接口使用。
◆/proc/kcore文件提供了以内核文件格式形式访问系统物理内存,并且可以被gdb用于检查任意内核数据结构的当前状态。如果装了源码,那么可以通过查看/usr/src/linux/Documentation/filesystems/proc.txt文件来获取更多的信息。
从中可以看出来,Proc是一个非常不错的获取系统信息渠道。如果利用得好,则它对Linux系统的维护和管理能提供非常大的帮助。
/proc/pid/是进程目录,存放的是当前运行进程的信息。
譬如apache进程ls -al /proc/23597:
-r——– 1 root root 0 2009-05-26 15:00 auxv -r–r–r– 1 root root 0 2009-05-26 02:03 cmdline -r–r–r– 1 root root 0 2009-05-26 15:00 cpuset lrwxrwxrwx 1 root root 0 2009-05-26 15:00 cwd -> / -r——– 1 root root 0 2009-05-26 15:00 environ lrwxrwxrwx 1 root root 0 2009-05-26 11:15 exe -> /usr/local/apache2/bin/httpd dr-x—— 2 root root 0 2009-05-11 10:15 fd -rw——- 1 root root 0 2009-05-26 15:00 mapped_base -r–r–r– 1 root root 0 2009-05-26 15:00 maps -rw——- 1 root root 0 2009-05-26 15:00 mem -r–r–r– 1 root root 0 2009-05-26 15:00 mounts -rw-r–r– 1 root root 0 2009-05-26 15:00 oom_adj -r–r–r– 1 root root 0 2009-05-26 15:00 oom_score lrwxrwxrwx 1 root root 0 2009-05-26 15:00 root -> / -rw——- 1 root root 0 2009-05-26 15:00 seccomp -r–r–r– 1 root root 0 2009-05-26 15:00 smaps -r–r–r– 1 root root 0 2009-05-26 02:03 stat -r–r–r– 1 root root 0 2009-05-26 11:15 statm -r–r–r– 1 root root 0 2009-05-26 03:00 status dr-xr-xr-x 3 root root 0 2009-05-26 03:30 task -r–r–r– 1 root root 0 2009-05-26 15:00 wchan
以上目录或文件,一个一个看: auxv二进制文件。auxv_t结构数组,包含进程执行时传递给动态链接器的初始值。
cmdline进程启动的命令行参数。譬如一个带启动参数的进程,用cat cmdline命令:./getstats./stats.cfg。看起来是不是没有格式?NO!用vi cmdline查看内容是:./tiap_cstats^@./cstats.cfg^@。所以命令参数间是有间隔的,vi里看到的"^@"其实是字符'\0′,用c++程序打印出来就可以很清楚的看到。
cpuset不太清楚
environ进程使用的环境变量信息。
exe符号链接,指向进程的可执行文件。
fd包含当前进程所有文件描述符的目录。 该目录下会发现1,2,3是被系统霸占的: 0 –标准输入(standard input);1 –标准输出(standard output);2 –标准错误(standard error)。从3开始系统自动分配给应用程序使用。若进程使用大量文件句柄(如TCP服务器),要特别关注这个目录下的句柄增长情况。系统默认最大允许使用1024个句柄,文件句柄用完之后就会提示错误"too many open files"。一般来说是出现了文件句柄泄漏,使用完之后没有close。如果需要更改最大句柄使用限制,使用ulimic -n命令,如:ulimit -n 10240,从经验上来讲,对于提供tcp服务的进程,该设置是十分必要的。
mapped_base该文件内容是一个地址,共享库将从该地址装载到内存。看到的内容是"1073741824″,转换成十六进制就是0×40000000,这就是默认值。可以把这个值设置低一些,刘更多的内存给应用程序。DB2或Oracle安装有修改这个值的,让更多内存留给数据库共享内存使用,这样就有超过2GB的空间留给数据库共享内存。
maps保存内存映象。从左到右是:和这个映射有关的地址空间,和这个映射有关的权限,距离文件开始(即这个映射开始的地方)的偏移量,这个映射文件所在的设备,文件的inode号,最后是文件名本身。 b7e31000-b7ee5000 r-xp 00000000 08:01 211854 /usr/lib/libstdc++.so.5.0.7 b7ee5000-b7eea000 rwxp 000b3000 08:01 211854 /usr/lib/libstdc++.so.5.0.7
mem进程的内存被利用情况。用于某一应用程序在某些情况下可以方便的访问另一应用程序内存。其中之一访问内存的方法是直接使用mmap()映射页面。
mounts文件内容是当前进程加载的文件系统。
oom_adj oom_score特殊用途,保护某个进程不被杀死。oom_adj的取值返回是-17~15,当进程的oom_adj是-17时,系统将不会杀死它,-16到15使得进程的oom_score值呈指数(K * 2 ^ n)形式递增,也就是说他们被杀的可能性呈指数形式递增。如:echo -17 > oom_adj
root链接此进程的root目录
seccomp不太清楚。和安全相关?
smaps是比maps更详细的内存映象信息。如中间一段: b7e31000-b7ee5000 r-xp 00000000 08:01 211854 /usr/lib/libstdc++.so.5.0.7 Size: 720 kB Rss: 68 kB Shared_Clean: 68 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 0 kB b7e31000-b7ee5000是该虚拟内存段的开始和结束位置;r-xp内存段的权限,最后一位p代表私有,s代表共享;00000000该虚拟内存段在对应的映射文件中的偏移量;08:01文件的主设备和次设备号。211854被映射到虚拟内存的文件的索引节点号;/usr/lib/libstdc++.so.5.0.7被映射到虚拟内存的文件名称。 size是进程使用内存空间,并不一定实际分配了内存;Rss是实际分配的内存;Shared_Clean和其他进程共享的未改写页面;Shared_Dirty和其他进程共享的已改写页面;Private_Clean未改写的私有页面页面;Private_Dirty已改写的私有页面页面;其中Dirty页面如果没有交换机制的情况下,应该是不能回收的。所有映射之和应该就是内存使用情况。更多:http://www.broncho.cn/forum/viewtopic.php?f=20&p=1474&sid=906b9187b39d25cb95e0c7640398436d
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实时进程
statm进程内存状态信息,该文件中的所有值都是从系统启动开始累计到当前时刻。如:654 57 44 0 0 334 0 各字段含义: Size (pages)任务虚拟地址空间的大小VmSize/4 Resident(pages)应用程序正在使用的物理内存的大小VmRSS/4 Shared(pages)共享页数0 Trs(pages)程序所拥有的可执行虚拟内存的大小VmExe/4 Lrs(pages)被映像到任务的虚拟内存空间的库的大小VmLib/4 Drs(pages)程序数据段和用户态的栈的大小(VmData+ VmStk)4 dt(pages) 0
status进程当前状态,State,PID,UID,PPID等信息。这些信息可通过ps或top看到。
task该目录列出了进程中所有线程(包括主线程)。每个线程目录下也有自己的fd等目录和文件。
wchan不太清楚 |
原文链接: https://www.cnblogs.com/zhgyee/archive/2011/10/11/2207903.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/34061
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!