Linux /proc 你懂多少? 详情来了~~~

前言

最近面试的时候被面试官问到了这个,当时的我虽然使用了很久Linux系统,但对于很多目录及文件并不熟悉,感觉这很不应该。所以准备写一系列关于Linux文件系统的文章,强化自我,同时可以帮助到大家。因本人水平有限,可能无法写的很详细,如果大家有相关补充的知识可以私信我,当然,若有错误请不吝赐教,谢谢各位。

1.What’s this ?

proc 文件系统是由内核创建的虚拟文件系统,被内核用来向外界报告信息的一个文件系统,存储着当前内核运行状态的一系列特殊文件,是在系统运行时才创建的,所以它仅存在于内存之中而不在外存(硬盘、flash)上。通过proc虚拟文件可以实现Linux内核空间和用户间之间进行通信,它是内核提供给我们的查询中心,可以通过它查看系统硬件及当前运行的进程信息,甚至可以通过修改其中的某些文件改变内核的运行状态。
Linux中许多工具的数据来源正是proc目录中的内容,比如lsmod的命令是cat /proc/modules的别名。为了查看及使用上的方便,proc里的文件通常会按照相关性进行分类存储于不同的目录甚至子目录中,如/proc/scsi目录中存储的就是当前系统上所有SCSI设备的相关信息,/proc/N中存储的则是系统当前正在运行的进程的相关信息,其中N为正在运行的进程(可以想象得到,在某进程结束后其相关目录则会消失)。
大多数虚拟文件可以使用文件查看命令如cat、more或者less进行查看,有些文件信息表述的内容可以一目了然,但也有文件的信息却不怎么具有可读性。不过,这些可读性较差的文件在使用一些命令如apm、free、lspci或top查看时却可以有着不错的表现。

2./proc/目录下的文件

上面说到proc目录下的文件可以展示系统及相关进程的信息,接下来就让我们看一下都有哪些文件及相关的作用。因为系统存在差异,所以可能列举的不全,大家如果想补充可以告诉我,我会尽快补充进来。

首先当我们进入/proc目录并ls时,首先会看到很多数字,这些数字代表什么呢?难道是有人故意放的垃圾文件?

当然不是!!!这些数字代表的是系统当前运行进程的进程号,每个数字目录中都有对应该进程的相关信息。我们先拿简单的statm举例吧。

/proc/进程号/

/proc/进程号/statm

当运行cat /proc/1/statm时会打印出7组数字,每一个数字的单位都是页,而不同数字代表的含义则有很大区别:
size:任务虚拟地址空间大小
Resident:正在使用的物理内存大小
Shared:共享页数
Trs:程序所拥有的可执行虚拟内存大小
Lrs:被映像倒任务的虚拟内存空间的库的大小
Drs:程序数据段和用户态的栈的大小
dt:脏页数量

/proc/进程号/cmdline

此文件包含的是该进程的启动命令(显示的是绝对路径)

/proc/进程号/mem

不可读,此文件指代进程占用的内存

/proc/进程号/cwd

链接到此进程工作目录

扫描二维码关注公众号,回复: 15501230 查看本文章

/proc/进程号/environ

此文件包含进程环境变量的列表

/proc/进程号/comm

此文件包含进程名

/proc/进程号/coredump_filter

程序崩溃 或 使用gcore工具 生成进程的core文件时,可以通过设定内核转储掩码来筛选需要dump的部分内存。

而此文件则代表coredump过滤的类型

支持以下7种内存:

  • (bit 0) anonymous private memory(匿名私有内存段)

  • (bit 1) anonymous shared memory(匿名共享内存段)

  • (bit 2) file-backed private memory(file-backed 私有内存段):文件映射的内存

  • (bit 3) file-backed shared memory(file-bakced 共享内存段)

  • (bit 4) ELF header pages in file-backed private memory areas (it is

    effective only if the bit 2 is cleared)(ELF 文件映射,只有在bit 2 复位的时候才起作用)

  • (bit 5) hugetlb private memory(大页面私有内存) :mmap 映射的MAP_HUGETLB类型数据

  • (bit 6) hugetlb shared memory(大页面共享内存)

可以通过修改文件/proc//coredump_filter来筛选需要dump的内存段。

/proc//coredump_filter中的值为16进制,默认值为0x23,转化为二进制:00100011,从右向左看,bit 0、bit 1、bit 5 被置位,也就是说会转储所有的匿名内存段和大页面私有内存段。

/proc/进程号/exe

此链接可以链接到进程的可执行文件(执行命令文件)

/proc/进程号/fd

此目录包含进程所有相关的文件描述符,进入目录后可以看到很多链接。

linux中, 每一个进程在内核中,都对应有一个“打开文件”数组,存放指向文件对象的指针,而 fd 是这个数组的下标。

我们对文件进行操作时,系统调用,将fd传入内核,内核通过fd找到文件,对文件进行操作。

既然是数组下标,fd的类型为int, < 0 为非法值, >=0 为合法值。在linux中,一个进程默认可以打开的文件数为1024个,fd的范围为0~1023。可以通过设置,改变最大值。

在linux中,值为0、1、2的fd,分别代表标准输入、标准输出、标准错误输出。在上一篇文章中,使用重定向 2>/dev/null 就是把标准错误输出重定向到位桶中去,不显示出来。因为 0 1 2已经被linux使用了,通常在程序中打开的fd,是从3开始的。但我们在判断一个fd是否合法时,依然要使用>=0的判断标准。

fd的分配原则,是从小到大,找到第一个不用的进行分配。

除了open之外, socket编程的socket()/accept()等函数,也会返回一个fd值。
1)Linux系统下,所有进程允许打开的最大fd数量。查询语句:
/proc/sys/fs/file-max
2)Linux系统下,所有进程已经打开的fd数量及允许的最大数量。查询语句:
/proc/sys/fs/file-nr
3)单个进程允许打开的最大fd数量.查询语句:
ulimit -n
4)单个进程(例如进程id为5454)已经打开的fd.查询语句:
ls -l /proc/5454/fd/

当ls -ls后,可以看到每个链接的含义,比如

0 lrwx------ 1 root root 64 May 15 09:50 3 ->> socket:[2374]

fd为3的代表socket产生的文件描述符。

/proc/进程号/fdinfo

此目录存放着每个文件描述符的相关信息

> /proc/1180/fdinfo #cat 0 
> pos:    0  //文件offsets
> flags:  020000 //文件flags

/proc/进程号/limits

此文件包含了进程所限制的一些参数

> /proc/1180 #cat limits
>  Limit                   Soft Limit		Hard Limit           Units 
>  Max cpu time       unlimited         unlimited             seconds 
>  Max file size             unlimited      unlimited            bytes 
> Max data size             unlimited        unlimited            bytes 
> Max stack size            8388608          unlimited            bytes 
> Max core file size        0                unlimited            bytes 
> Max open files            1024            4096                 files 
> Max address space         unlimited        unlimited            bytes 
> Max resident set          unlimited        unlimited            bytes 
> Max processes             238              238                  processes 
> Max locked memory         65536       65536                bytes 
> Max file locks            unlimited        unlimited            locks 
> Max pending signals       238              238                  signals 
> Max msgqueue size         819200         819200               bytes 
> Max nice priority         0               0 
> Max realtime priority     0                    0 
> Max realtimetimeout      unlimited            unlimited            us

/proc/进程号/maps

这个文件包含了当前映射的内存区域。
在这里插入图片描述

/proc/进程号/mountinfo

此文件包含进程相关的挂载信息(下方只显示部分信息)

/proc/1180 #cat mountinfo
1 1 0:1 / / ro,relatime - rootfs rootfs ro
11 1 0:3 / /proc rw,relatime - proc /proc rw

/proc/进程号/mounts

现在的 Linux 系统里一般都有这么三个文件:/etc/fstab,/etc/mtab,和 /proc/mounts,比较容易让人迷惑。简单解释一下。

/etc/fstab 是只读不写的,它提供的是系统上挂载设备的静态信息,比如 mount -a 就会挂载 /etc/fstab 里面指定的文件系统。

/etc/mtab 是供 mount/umount 进行读写的,是相对动态的。读的话,比如你在挂载一个文件系统时缺少一个参数,它就会自动去/etc/mtab 或者 /etc/fstab 里去查,如果找到的话,只要一个参数也够。写的话,比如你umount了一个文件系统,umount 就会删掉/etc/mtab 里面的相关记录。

看似上面的这两个文件已经够用了,但是新的情况出现了。Linux 内核引入了一个 mount namespace,是给container用的。因为这个的出现,Linux 不得不引入 /proc/mounts。为什么呢?因为记录 mount 信息的 /etc/mtab 是全局的,也就是说,就算你的某个进程有自己的 namespace,但只要还和外面共享同一个 /etc/mtab,那么,里面进行umount/mount操作的信息也会被记录到/etc/mtab里,外面也会看到!凌乱了!由此可见,我们不能有全局的mtab,肿么办呢?/proc/mounts 出来了,有人可能觉得它也是全局的啊!可你仔细看一下的话会发现,它其实是到 /proc/self/mounts 的一个符号链接!如此以来,container 里面的 /proc/mounts 和外面的当然就不会一样了!聪明啊!

所以,/etc/mtab 已经过时了,应该被抛弃,或者直接符号链接到/proc/mounts。同理,查看系统上挂载的文件系统的话,直接调用无参数的mount也是不妥的,因为那样也是读 /etc/mtab。我们应该使用 util-linux-ng 提供的一个新命令: findmnt,它是读的 /proc/self/mountinfo。

/proc/进程号/mountstate

此文件包含进程相应挂载的状态

/proc/1180 #cat mountstats
device rootfs mounted on / with fstype rootfs
device /proc mounted on /proc with fstype proc
device devpts mounted on /dev/pts with fstype devpts
device tmpfs mounted on /var with fstype tmpfs

/proc/进程号/net

详细介绍:
/proc/net/arp

IP address       HW type     Flags       HW address            Mask     Device
192.168.1.151    0x1         0x2         00:e0:4c:19:1a:98     *        eth0
192.168.1.1      0x1         0x2         00:14:78:e7:c4:e8     *        eth0
 
每个网络接口的arp表中dev包的统计
IP address:IP地址(直连)
HW type:硬件类型 
23=0x17   strip (Metricom Starmode IP) 
01=0x01   ether (Ethernet) 
15=0xf      dlci (Frame Relay DLCI) 
Flags:
HW address:MAC 地址
Mask:
Device:所在网络接口

/proc/net/dev

Inter-|   Receive bytes      packets errs drop fifo frame                                              
 face |  compressed multicast
 lo:       238306  4170      0        0    0     0                 0         0
 eth0:   885217  2782      0        0    0     0                 0         0
 pan0:  0            0            0        0    0     0                 0         0
 tap0:   4092      46          0        0    0     0                 0         0
 
|  Transmit                                              
|bytes        packets errs drop fifo colls carrier compressed
238306     4170      0       0    0     0       0          0
3581505   19730    0       0    0     0       0          0
0                0           0       0    0     0       0          0
5644          38         0       0    0     0       0          0
 
网络设备的统计

/proc/net/dev_mcast

2    eth0            1     0     01005e0000fb
2    eth0            1     0     01005e000001
5    tap0            1     0     01005e0000fb
5    tap0            1     0     01005e000001
 
组播包统计

/proc/net/igmp

Idx     Device    : Count Querier       Group    Users Timer    Reporter
1       lo        :     0      V3
                                010000E0     1 0:00000000               0
2       eth0      :     2      V3
                                FB0000E0     1 0:00000000               0
                                010000E0     1 0:00000000               0
5       tap0      :     2      V3
                                FB0000E0     1 0:00000000               0
                                010000E0     1 0:00000000               0
 
IGMP 分组情况

/proc/net/netlink

sk       Eth Pid    Groups   Rmem     Wmem     Dump     Locks
cedaae00 0   2527   00000111 0        0        00000000 2
cec2a400 0   0      00000000 0        0        00000000 2
cdc8da00 7   0      00000000 0        0        00000000 2
cef32400 9   0      00000000 0        0        00000000 2
ce000c00 9   2482   00000000 0        0        00000000 2
cecb8400 10  0      00000000 0        0        00000000 2
cecaaa00 11  0      00000000 0        0        00000000 2
cf832600 15  542    00000001 0        0        00000000 2
cec5fe00 15  0      00000000 0        0        00000000 2
cecaa800 16  0      00000000 0        0        00000000 2
cddd8a00 18  0      00000000 0        0        00000000 2
 
**netlink套接口的信息**

/proc/net/netstat

TcpExt: SyncookiesSent SyncookiesRecv SyncookiesFailed EmbryonicRsts PruneCalled RcvPruned OfoPruned OutOfWindowIcmps LockDroppedIcmps ArpFilter TW TWRecycled TWKilled PAWSPassive PAWSActive PAWSEstab DelayedACKs DelayedACKLocked DelayedACKLost ListenOverflows ListenDrops TCPPrequeued TCPDirectCopyFromBacklog TCPDirectCopyFromPrequeue TCPPrequeueDropped TCPHPHits TCPHPHitsToUser TCPPureAcks TCPHPAcks TCPRenoRecovery TCPSackRecovery TCPSACKReneging TCPFACKReorder TCPSACKReorder TCPRenoReorder TCPTSReorder TCPFullUndo TCPPartialUndo TCPDSACKUndo TCPLossUndo TCPLoss TCPLostRetransmit TCPRenoFailures TCPSackFailures TCPLossFailures TCPFastRetrans TCPForwardRetrans TCPSlowStartRetrans TCPTimeouts TCPRenoRecoveryFail TCPSackRecoveryFail TCPSchedulerFailed TCPRcvCollapsed TCPDSACKOldSent TCPDSACKOfoSent TCPDSACKRecv TCPDSACKOfoRecv TCPAbortOnSyn TCPAbortOnData TCPAbortOnClose TCPAbortOnMemory TCPAbortOnTimeout TCPAbortOnLinger TCPAbortFailed TCPMemoryPressures TCPSACKDiscard TCPDSACKIgnoredOld TCPDSACKIgnoredNoUndo TCPSpuriousRTOs TCPMD5NotFound TCPMD5Unexpected
 
TcpExt: 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 555 145 2 0 0 0 0 0 0 3029 0 10463 1848 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
 
IpExt: InNoRoutes InTruncatedPkts InMcastPkts OutMcastPkts InBcastPkts OutBcastPkts
IpExt:   0                    0                        30                36                    79                  0
 
网络流量的多种统计

/proc/net/raw

  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode ref pointer drops
 
原始套接口的套接口表

/proc/net/route

Iface  Destination   Gateway     Flags  RefCnt Use   Metric Mask      MTU   Window IRTT                            
tap0  000010AC    00000000    0001  0    0    0    00FFFFFF    0    0    0                                        
eth0  0001A8C0    00000000    0001  0    0    0    00FFFFFF    0    0    0                                        
eth0  0000FEA9    00000000    0001  0    0    0    0000FFFF    0    0    0                                        
lo   0000007F    00000000    0001  0    0    0    000000FF    0    0    0                                         
eth0  00000000    0101A8C0    0003  0    0    0    00000000    0    0    0            
 
静态路由表

/proc/net/rt_cache(也可以通过ip route show cache看到解析后的结果)

Iface  Destination   Gateway     Flags      RefCnt Use   Metric Source     MTU   Window IRTT  TOS   HHRef    HHUptod SpecDst             
lo   FF01A8C0    FF01A8C0    94000000    0    0    0    9701A8C0    0    0    0    00   -10    C901A8C0                              
eth0  9701A8C0    9701A8C0        0    2    1    0    C901A8C0    1500  0    0    10   20    C901A8C0                            
lo   C901A8C0    C901A8C0    84000000    0    185   0    9701A8C0    0    0    0    00   -10    C901A8C0  
 
路由缓存表

ip route show cache
在这里插入图片描述
注:高版本内核无法显示;如果路由缓存出现问题,可以通过ip route flush cache进行恢复

/proc/net/snmp

Ip: Forwarding DefaultTTL InReceives InHdrErrors InAddrErrors ForwDatagrams InUnknownProtos InDiscards InDelivers OutRequests OutDiscards OutNoRoutes ReasmTimeout ReasmReqds ReasmOKs ReasmFails FragOKs FragFails FragCreates
Ip: 2 64 17123 0 13 0 0 0 17110 24061 0 0 0 0 0 0 0 0 0
Icmp: InMsgs InErrors InDestUnreachs InTimeExcds InParmProbs InSrcQuenchs InRedirects InEchos InEchoReps InTimestamps InTimestampReps InAddrMasks InAddrMaskReps OutMsgs OutErrors OutDestUnreachs OutTimeExcds OutParmProbs OutSrcQuenchs OutRedirects OutEchos OutEchoReps OutTimestamps OutTimestampReps OutAddrMasks OutAddrMaskReps
Icmp: 34 0 10 0 0 0 0 0 24 0 0 0 0 34 0 10 0 0 0 0 24 0 0 0 0 0
IcmpMsg: InType0 InType3 OutType3 OutType8
IcmpMsg: 24 10 10 24
Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ActiveOpens PassiveOpens AttemptFails EstabResets CurrEstab InSegs OutSegs RetransSegs InErrs OutRsts
Tcp: 1 200 120000 -1 6 6 2 2 4 16956 23979 2 0 3
Udp: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors
Udp: 30 10 0 40 0 0
UdpLite: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors
UdpLite: 0 0 0 0 0 0
 
snmp agent的ip/icmp/tcp/udp协议统计

/proc/net/sockstat

sockets: used 556
TCP: inuse 9 orphan 0 tw 0 alloc 10 mem 2
UDP: inuse 5 mem 0
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
 
使用的tcp/udp/raw/pac/syc_cookies的数量

/proc/net/tcp

 sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:10E1 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 63205 1 c91b0500 300 0 0 2 -1                             
   1: 00000000:006F 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 5253 1 ce47aa40 300 0 0 2 -1                              
   2: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 7799 1 ce4a3a80 300 0 0 2 -1                              
   3: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 6509 1 ce47a0c0 300 0 0 2 -1                              
   4: 0100007F:0019 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 7392 1 ce47a580 300 0 0 2 -1                              
   5: C901A8C0:0016 9701A8C0:0B64 01 00000034:00000000 01:00000022 00000000     0        0 16290 4 c91b09c0 35 4 3 5 4                               
   6: 0100007F:10E1 0100007F:91DE 01 00000000:00000000 00:00000000 00000000     0        0 63427 1 c91b0040 21 4 29 3 -1                             
   7: C901A8C0:0016 9701A8C0:066B 01 00000000:00000000 02:000497D5 00000000     0        0 12401 2 ce4a35c0 31 4 16 5 4                              
   8: 0100007F:91DE 0100007F:10E1 01 00000000:00000000 00:00000000 00000000     0        0 63426 1 c90a1a00 22 4 30 3 -1               
 
TCP连接的套接口

/proc/net/udp

  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode ref pointer drops             
   3: 00000000:9883 00000000:0000 07 00000000:00000000 00:00000000 00000000   104        0 6195 2 ce437700 0                   
  24: 00000000:0298 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 5252 2 ce437b80 0                   
 105: 00000000:14E9 00000000:0000 07 00000000:00000000 00:00000000 00000000   104        0 6194 2 ce437940 0                   
 111: 00000000:006F 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 5220 2 ce437dc0 0                   
 119: 00000000:0277 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 6526 2 ce437040 0                   
 
UDP连接的套接口表

/proc/net/unix

c9113580: 00000003 00000000 00000000 0001 03 11719
c9113740: 00000003 00000000 00000000 0001 03 11717 /var/run/dbus/system_bus_socket
c9113900: 00000003 00000000 00000000 0001 03 11716
c9113c80: 00000003 00000000 00000000 0001 03 11711 /tmp/orbit-yaozhongkai/linc-c9d-0-6437df843b36c
c9113e40: 00000003 00000000 00000000 0001 03 11710
c9078040: 00000003 00000000 00000000 0001 03 11708 @/tmp/dbus-TT8HxW0iEY

     
    UNIX域套接口的套接口表

/proc/进程号/ns

包含进程所属的各个namespaces的文件描述符。例如:

ls /proc/7588/ns
total 0
lrwxrwxrwx 1 root root 0 Feb 27 10:26 uts -> uts:[4026531838]
lrwxrwxrwx 1 root root 0 Feb 27 10:26 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Feb 27 10:26 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 Feb 27 10:26 net -> net:[4026531968]
lrwxrwxrwx 1 root root 0 Feb 27 10:26 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 Feb 27 10:26 ipc -> ipc:[4026531839]

/proc/进程号/oom*(即oom机制)

oom_adj/oom_score:这两个与linux的OOM机制有关的文件(关于OOM请看这里),oom_adj相当于一个因子,它值越大,在OOM时更容易被系统kill掉,但最终决定是否被kill的是oom_score,其实计算这个oom_score时,就是根据oom_adj来的,oom_adj更大,计算出来的oom_score就更大,也能容易在OOM时被系统kill掉。当然如果是很重要的服务现场,为了避免出现这种情况设置oom_adj=0就行,表示永远不会因为OOM被kill。

关于这部分我也不是很清楚,看到一些博主的文章感觉很有帮助,给大家分享一下

https://blog.csdn.net/liukuan73/article/details/43238623
https://www.linuxidc.com/Linux/2012-05/59486.htm

/proc/进程号/personality

此文件不清楚作用,cat 之后结果为00000000

/proc/进程号/root

指向当前进程运行根目录的符号链接,通常就是“/”;在Unix和Linux系统上,通常采用chroot命令使每个进程运行于独立的根目录;

/proc/进程号/stat

此文件就是将后面的status进行简写,只提供数据,减少篇幅,方便查看。每一个数据都可以在status中找到对应属性

/proc/进程号/statm

查看进程所占用内存

/proc/1180 #cat statm
2292 605 487 9 0 734 0

参数 解释 /proc/[pid]/statm
Size (pages) 任务虚拟地址空间的大小 VmSize/4
Resident(pages) 应用程序正在使用的物理内存的大小 VmRSS/4
Shared(pages) 共享页数 0
Text(code) 
Trs(pages) 程序所拥有的可执行虚拟内存的大小 VmExe/4
Lrs(pages) 被映像到任务的虚拟内存空间的库的大小 VmLib/4
Drs(pages) 程序数据段和用户态的栈的大小 (VmData+ VmStk )4

第二列为Resident(pages)—— 应用程序正在使用的物理内存的大小 VmRSS/4,为实际使用内存数值的四分之一。

/proc/进程号/status

查看进程的相关状态
cat /proc/7588/status

Name:	java                       # 进程运行的指令
State:	S (sleeping)               # 进程当前的状态,"R (running)", "S (sleeping)", "D (disk sleep)", "T (stopped)", "T(tracing stop)", "Z (zombie)",  "X (dead)"
Tgid:	7588                       # 线程组ID,一般就是进程ID
Ngid:	0                          # NUMA group ID
Pid:	7588                       # 进程ID
PPid:	7565                       # 父进程ID 
TracerPid:	0                      # PID of process tracing this process (0 if not being traced).
Uid:	0	0	0	0
Gid:	0	0	0	0
FDSize:	256
Groups:	0 1 2 3 4 6 10 11 20 26 27 
NStgid:	7588	1
NSpid:	7588	1
NSpgid:	7588	1
NSsid:	7588	1
VmPeak:	 5637656 kB
VmSize:	 5637656 kB             # 系统为进程分配的虚拟内存的大小 ,有关进程内存,详情参考:https://blog.csdn.net/sinat_26058371/article/details/86536213          
VmLck:	       0 kB
VmPin:	       0 kB
VmHWM:	 1029820 kB             # RSS的峰值大小
VmRSS:	 1029820 kB             # RSS大小
VmData:	 5581264 kB             # 数据大小
VmStk:	     132 kB             # 栈大小
VmExe:	       4 kB             # text segment大小
VmLib:	   18240 kB             # 共享库代码大小
VmPTE:	    2320 kB
VmPMD:	      36 kB
VmSwap:	       0 kB             # 交换分区的大小
HugetlbPages:	       0 kB
Threads:	41                  # 进程中线程的数量
SigQ:	0/31353
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	0000000000000000
SigIgn:	0000000000000000
SigCgt:	2000000181005ccf
CapInh:	00000000a80425fb
CapPrm:	00000000a80425fb
CapEff:	00000000a80425fb
CapBnd:	00000000a80425fb
CapAmb:	0000000000000000
Seccomp:	0
Cpus_allowed:	f                # 这个进程能够运行的CPU掩码,这台机器的CPU有4个核心,f(1111)表示这个进程可以在所有核心上运行
Cpus_allowed_list:	0-3          # 这个进程能够运行在那些cpu上,cpu的id是一个数组,通常范围是0 ~ cpu核数-1(这里就是0123)
Mems_allowed:	00000000,00000001  # 这个进程能够访问的内存节点掩码(和NUMA的group id一致)
Mems_allowed_list:	0              # 这个进程能够访问的内存节点(和NUMA的group id一致)
voluntary_ctxt_switches:	56
nonvoluntary_ctxt_switches:	5

/proc/进程号/task

这个目录中,进程中的每一个线程都有一个对应的子目录,子目录名就是线程ID,子目录中的文件结构与/proc/PID目录中的一致。

/proc/进程号/wchan

此文件不清楚具体作用,请各位帮忙补充。

OK 上面的就是关于进程目录下的一些介绍,接下来将对proc后续目录及文件进行介绍

/proc/

/proc/apm

高级电源管理(APM)版本信息及电池相关状态信息,通常由apm命令使用;
/proc/buddyinfo是linuxbuddy系统管理物理内存的debug信息。

/proc/buddyinfo

在linux中使用buddy算法解决物理内存的外碎片问题,其把所有空闲的内存,以2的幂次方的形式,分成11个块链表,分别对应为1、2、4、8、16、32、64、128、256、512、1024个页块。

而Linux支持NUMA技术,对于NUMA设备,NUMA系统的结点通常是由一组CPU和本地内存组成,每一个节点都有相应的本地内存,因此buddyinfo 中的Node0表示节点ID;而每一个节点下的内存设备,又可以划分为多个内存区域(zone),因此下面的显示中,对于Node0的内存,又划分类DMA、Normal、HighMem区域。而后面则是表示空闲的区域。

此处以Normal区域进行分析,第二列值为100,表示当前系统中normal区域,可用的连续两页的内存大小为1002PAGE_SIZE;第三列值为52,表示当前系统中normal区域,可用的连续四页的内存大小为522^2PAGE_SIZE

/proc/cmdline

在启动时传递至内核的相关参数信息,这些信息通常由lilo或grub等启动管理工具进行传递;

/proc/consoles

当前系统终端的信息

/proc/cpuinfo

存储了处理器的相关信息

/proc/crypto

系统已安装的密码算法及相关信息

/proc/devices

系统已经加载的所有块设备和字符设备的信息,包含主设备号和设备组(与主设备号对应的设备类型)名

/proc/diskstats

每块磁盘设备的磁盘I/O统计信息列表;(内核2.5.69以后的版本支持此功能)

/proc/filesystems

当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;通常mount一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型;

/proc/interrupts

X86或X86_64体系架构系统上每个IRQ相关的中断号列表;多路处理器平台上每个CPU对于每个I/O设备均有自己的中断号;

/proc/iomem

每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息

/proc/ioports

当前正在使用且已经注册过的与物理设备进行通讯的输入-输出端口范围信息列表;如下面所示,第一列表示注册的I/O端口范围,其后表示相关的设备

/proc/loadavg

保存关于CPU和磁盘I/O的负载平均值,其前三列分别表示每1秒钟、每5秒钟及每15秒的负载平均值,类似于uptime命令输出的相关信息;第四列是由斜线隔开的两个数值,前者表示当前正由内核调度的实体(进程和线程)的数目,后者表示系统当前存活的内核调度实体的数目;第五列表示此文件被查看前最近一个由内核创建的进程的PID

/proc/locks

保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;每个锁定占据一行,且具有一个惟一的编号;如下输出信息中每行的第二列表示当前锁定使用的锁定类别,POSIX表示目前较新类型的文件锁,由lockf系统调用产生,FLOCK是传统的UNIX文件锁,由flock系统调用产生;第三列也通常由两种类型,ADVISORY表示不允许其他用户锁定此文件,但允许读取,MANDATORY表示此文件锁定期间不允许其他用户任何形式的访问

/proc/meminfo

系统中关于当前内存的利用状况等的信息,常由free命令使用;可以使用文件查看命令直接读取此文件,其内容显示为两列,前者为统计属性,后者为对应的值

/proc/mounts

在内核2.4.29版本以前,此文件的内容为系统当前挂载的所有文件系统,在2.4.19以后的内核中引进了每个进程使用独立挂载名称空间的方式,此文件则随之变成了指向/proc/self/mounts(每个进程自身挂载名称空间中的所有挂载点列表)文件的符号链接;/proc/self是一个独特的目录,后文中会对此目录进行介绍;

第一列表示挂载的设备,第二列表示在当前目录树中的挂载点,第三点表示当前文件系统的类型,第四列表示挂载属性(ro或者rw),第五列和第六列用来匹配/etc/mtab文件中的转储(dump)属性

/proc #cat mounts
rootfs / rootfs ro,relatime 0 0
/proc /proc proc rw,relatime 0 0

/proc/modules

当前装入内核的所有模块名称列表,可以由lsmod命令使用,也可以直接查看;如下所示,其中第一列表示模块名,第二列表示此模块占用内存空间大小,第三列表示此模块有多少实例被装入,第四列表示此模块依赖于其它哪些模块,第五列表示此模块的装载状态(Live:已经装入;Loading:正在装入;Unloading:正在卸载),第六列表示此模块在内核内存(kernel memory)中的偏移量

/proc/partitions

块设备每个分区的主设备号(major)和次设备号(minor)等信息,同时包括每个分区所包含的块(block)数目(如下面输出中第三列所示)

/proc #cat partitions
major minor  #blocks  name

  31        0       2944 mtdblock0
  31        1       2112 mtdblock1

/proc/pci

内核初始化时发现的所有PCI设备及其配置信息列表,其配置信息多为某PCI设备相关IRQ信息,可读性不高,可以用“/sbin/lspci –vb”命令获得较易理解的相关信息;在2.6内核以后,此文件已为/proc/bus/pci目录及其下的文件代替

/proc/slabinfo

在内核中频繁使用的对象(如inode、dentry等)都有自己的cache,即slab pool,而/proc/slabinfo文件列出了这些对象相关slap的信息;详情可以参见内核文档中slapinfo的手册页

/proc #cat slabinfo
slabinfo - version: 2.1
 name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
ol_user_cache          0      0    800   10    2 : tunables    0    0    0 : slabdata      0      0      0
RAWv6                 12     12    672   12    2 : tunables    0    0    0 : slabdata      1      1      0
UDPLITEv6              0      0    672   12    2 : tunables    0    0    0 : slabdata      0      0      0
UDPv6                 12     12    672   12    2 : tunables    0    0    0 : slabdata      1      1      0

/proc/stat

实时追踪自系统上次启动以来的多种统计信息;如下所示,其中,
“cpu”行后的八个值分别表示以1/100(jiffies)秒为单位的统计值(包括系统运行于用户模式、低优先级用户模式,运系统模式、空闲模式、I/O等待模式的时间等);
“intr”行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数;
“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。
“btime”给出了从系统启动到现在为止的时间,单位为秒;
“processes (total_forks) 自系统启动以来所创建的任务的个数目;
“procs_running”:当前运行队列的任务的数目;
“procs_blocked”:当前被阻塞的任务的数目;

/proc #cat stat
cpu  75734 0 133789 8630740 0 0 7860 0 0 0
cpu0 75734 0 133789 8630740 0 0 7860 0 0 0
intr 22751841 0 0 0 0 612178 0 0 22118731 0 0 0 20932 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 31972782
btime 1589506354
processes 235454
procs_running 1
procs_blocked 0
softirq 24867766 0 22118022 53101 1002109 0 0 0 0 0 1694534

/proc/swaps

当前系统上的交换分区及其空间利用信息,如果有多个交换分区的话,则会每个交换分区的信息分别存储于/proc/swap目录中的单独文件中,而其优先级数字越低,被使用到的可能性越大;下面是作者系统中只有一个交换分区时的输出信息

/proc/uptime

系统上次启动以来的运行时间,如下所示,其第一个数字表示系统运行时间,第二个数字表示系统空闲时间,单位是秒

/proc/version

当前系统运行的内核版本号,在作者的RHEL5.3上还会显示系统安装的gcc版本

[root@rhel5 ~]# more /proc/version 
Linux version 2.6.18-128.el5 (mockbuild@hs20-bc1-5.build.redhat.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)) #1 SMP Wed Dec 17 11:42:39 EST 2008 

/proc/vmstat

当前系统虚拟内存的多种统计数据,信息量可能会比较大,这因系统而有所不同,可读性较好;下面为作者机器上输出信息的一个片段;(2.6以后的内核支持此文件)

/proc #cat vmstat
nr_free_pages 14596
nr_inactive_anon 326
nr_active_anon 3029
nr_inactive_file 1834
nr_active_file 703
nr_unevictable 0
nr_mlock 0
nr_anon_pages 3033
nr_mapped 1946
nr_file_pages 2867
nr_dirty 0

/proc/zoneinfo

内存区域(zone)的详细信息列表,信息量较大,下面列出的是一个输出片段:

/proc #cat zoneinfo
Node 0, zone   Normal
  pages free     14589
        min      360
        low      450
        high     540
        scanned  0
        spanned  32768
        present  32512
    nr_free_pages 14589
    nr_inactive_anon 326
    nr_active_anon 3029
    nr_inactive_file 1834
    nr_active_file 703
    nr_unevictable 0

/proc/sys

与 /proc下其它文件的“只读”属性不同的是,管理员可对/proc/sys子目录中的许多文件内容进行修改以更改内核的运行特性,事先可以使用“ls -l”命令查看某文件是否“可写入”。写入操作通常使用类似于“echo DATA > /path/to/your/filename”的格式进行。需要注意的是,即使文件可写,其一般也不可以使用编辑器进行编辑。

/proc/sys/debug 子目录

此目录通常是一空目录;

/proc/sys/dev 子目录

为系统上特殊设备提供参数信息文件的目录,其不同设备的信息文件分别存储于不同的子目录中,如大多数系统上都会具有的/proc/sys/dev /cdrom和/proc/sys/dev/raid(如果内核编译时开启了支持raid的功能) 目录,其内存储的通常是系统上cdrom和raid的相关参数信息文件。


以上则为本次整理的/proc/文件介绍,希望大家可以多提意见,将其补充的更完整。
感谢以下链接提供的帮助:

https://www.cnblogs.com/lidabo/p/5628020.html
https://www.cnblogs.com/zydev/p/8728992.html
https://www.cnblogs.com/kelamoyujuzhen/p/9939935.html
https://blog.csdn.net/lickylin/article/details/50726847

猜你喜欢

转载自blog.csdn.net/weixin_37778713/article/details/106130248