目录
proc文件夹是干嘛用?
proc下都有什么系统信息?
/proc/bus
/proc/buddyinfo
/proc/cgroups
/proc/cmdline
/proc/consoles
/proc/cpuinfo
/proc/crypto
/proc/devices
/proc/diskstats
/proc/execdomains
/proc/fb
/proc/filesystems
/proc/fs
/proc/inerrupts
/proc/iomem
/proc/ioports
/proc/irq
/proc/kallsyms
/proc/keys
/proc/key-users
/proc/kmsg
/proc/kpagecgroup
/proc/kpagecount
/proc/kpageflags
/proc/loadavg
/proc/locks
/proc/mdstat
/proc/meminfo
/proc/misc
/proc/modules
/proc/mounts
/proc/net
/proc/pagetypeinfo
/proc/partitions
/proc/sched_debug
/proc/schedstat
/proc/scsi
/proc/slabinfo
/proc/softirqs
/proc/stat
/proc/swaps
/proc/sys
/proc/sysrq-trigger
/proc/sysvipc
/proc/timer_list
/proc/timer_stats
/proc/tty
/proc/uptime
/proc/version
/proc/vmallocinfo
/proc/vmstat
/proc/zoneinfo
最近由于定位问题,频繁查看一些proc的文件信息,所以索性就一文撸到底,把proc翻个底朝天吧。
proc文件夹是干嘛用?
在linux系统/proc目录中一些文件,记录一些系统运行时的信息,比如内存信息、网络信息、cpu信息等,但是要注意的是,这个目录下并不是保存真正的文件或者目录,只是一个伪文件系统。它只是保存在内存中,不是持久化的文件。可以理解为内核开放的一个集中查询系统信息的地方,方便查找使用,符合linux文件系统的习惯。
proc下都有什么系统信息?
/proc/bus
bus下有两个目录
input pci
Linux系统提供了 input 子系统,鼠标、键盘、触摸屏等设备都可以通过 input 接口函数来实现设备驱动
devices handlers
devices:注册的 input devices
handlers:注册的 input handlers
而 /proc/bus/input/devices 文件会记录已注册的 input 设备信息。可以使用 cat 命令直接查看该文件内容。其中devices里的信息如下:
I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button"
P: Phys=PNP0C0C/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input0
U: Uniq=
H: Handlers=kbd event0
B: PROP=0
B: EV=3
B: KEY=10000000000000 0
I :设备ID(struct input_id)
N:设备名称【Name】
P:系统层次结构中设备的物理路径【Physical path】
S:系统文件路径【Sysfs path】
U:设备的唯一识别码,可以为空【Unique identification code】
H:与设备关联的输入句柄列表【Handles】
B:位掩码,以十六进制表示【Bitmasks】
PROP:设备属性【Properties】
EV :设备支持的事件类型【Events】
KEY :设备拥有的键盘、按键
MSC :设备支持的杂项事件
LED :设备上的 LED
handlers的内容如下:
N: Number=0 Name=kbd
N: Number=1 Name=sysrq (filter)
N: Number=2 Name=mousedev Minor=32
N: Number=3 Name=evdev Minor=64
显示所有handlers的名称
pci中保存的为pci驱动相关信息, 由于系统下的文件较大, 不贴了,直接放字段解释:
总共18个字段,每个字段之间是\t。
第一个字段是,总线设备功能,总线是前8位,后8位是设备(前5位)和功能(后3位)。
第二个字段是,vendor(前16位)和device(后16位)。
第三个字段是,中断号
第4-10个字段是bar0-bar6以及flag信息。
第11-17个字段是bar0-bar6的长度。
第18个字段是设备名称,optional
/proc/buddyinfo
buddyinfo用于记录系统的内存资源。linux的内存系统使用buddy算法来管理内存以减少内存碎片的产生。buddy算法管理最小的单一为PAGE_SIZE,一般情况下大小为4K。以2的N次幂一次增加。
Node 0, zone DMA32 635 549 425 251 124 66 23 2 4 0 0 0 0 0
Node 0, zone Normal 2947 1489 456 145 347 146 49 24 16 5 2 0 0 0
/proc/cgroups
controller group,用来限制、记录、隔离进程组的物理资源,将任意进程进行分组化管理的Linux内核功能。cgroup本身提供将进程进行分组化管理的功能和接口的基础结构。实现 cgroups 的主要目的是为不同用户层面的资源管理提供一个统一化的接口。从单个任务的资源控制到操作系统层面的虚拟化,cgroups 提供了五大功能:
资源限制(Resource limiting ):比如memory子系统可以为进程组设定一个memory使用上限,进程组使用的内存达到限额再申请内存,就会出发OOM(out of memory)
优先级控制(Prioritization):比如可以使用cpu子系统为某个进程组分配cpu share
资源统计(Accounting ):比如使用cpuacct子系统记录某个进程组使用的cpu时间
进程组隔离(Isolation):比如使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间
进程组控制(Control):比如使用freezer子系统可以将进程组挂起和恢复
#subsys_name hierarchy num_cgroups enabled
cpuset 6 1 1
cpu 7 1 1
cpuacct 7 1 1
blkio 10 1 1
memory 9 175 1
devices 3 110 1
freezer 4 1 1
net_cls 2 1 1
perf_event 11 1 1
net_prio 2 1 1
hugetlb 12 1 1
pids 8 167 1
rdma 5 1 1
cpu | 限制 CPU 时间片的分配,与 cpuacct 挂载在同一目录 |
cpuacct | 生成 cgroup 中的任务占用 CPU 资源的报告,与 cpu 挂载在同一目录 |
cpuset | 给 cgroup 中的任务分配独立的 CPU(多处理器系统) 和内存节点 |
devices | 允许或禁止 cgroup 中的任务访问设备 |
freezer | 暂停/恢复 cgroup 中的任务 |
hugetlb | 限制使用的内存页数量 |
memory | 对 cgroup 中的任务的可用内存进行限制,并自动生成资源占用报告 |
net_cls | 使用等级识别符(classid)标记网络数据包,这让 Linux 流量控制器(tc 指令)可以识别来自特定 cgroup 任务的数据包,并进行网络限制 |
net_prio | 允许基于 cgroup 设置网络流量(netowork traffic)的优先级 |
perf_event | 允许使用 perf 工具来监控 cgroup |
pids | 限制任务的数量 |
rdma | 限制进程对rdma和ib资源的使用。rdma作为host-offload、host-bypass技术,使低延迟、高带宽的直接内存到内存的数据通信成为可能。ib为新一代网络协议 |
systemd | systemd 提供了 cgroups 的使用和管理接口,在系统的开机阶段,systemd 会把支持的 controllers (subsystem 子系统)挂载到默认的 /sys/fs/cgroup/ 目录下面 |
/proc/cmdline
在启动时传递至内核的相关参数信息,这些信息通常由lilo或grub等启动管理工具进行传递
test@LAPTOP-D98HS8JP:/proc$ cat cmdline
BOOT_IMAGE=/kernel init=/init
/proc/consoles
使用的控制台
ttyAMA0 -W- (EC p a) 114:64
/proc/cpuinfo
记录设备的CPU信息
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 141
model name : 11th Gen Intel(R) Core(TM) i5-11400H @ 2.70GHz
stepping : 1
microcode : 0xffffffff
cpu MHz : 2688.000
cache size : 1280 KB
physical id : 0
siblings : 12
core id : 0
cpu cores : 6
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 6
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave osxsave avx f16c rdrand lahf_lm abm 3dnowprefetch fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl avx512vbmi umip pku avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq rdpid ibrs ibpb stibp ssbd
bogomips : 5376.00
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:
对此款芯片的简单总结:芯片型号是"Hygon C86 3135",拥有4个物理处理核,8个逻辑处理核(使用超线程技术),CPU主频是3499.941MHZ,二级缓存大小是512KB。
(1)processor :系统中逻辑处理核的编号。对于单核处理器,则课认为是其CPU编号,对于多核处理器则可以是物理核、或者使用超线程技术虚拟的逻辑核
(2)vendor_id :CPU制造商
(3)cpu family :CPU产品系列代号
(4)model :CPU属于其系列中的哪一代的代号
(5)model name:CPU属于的名字及其编号、标称主频
(6)stepping :CPU属于制作更新版本
(7)cpu MHz :CPU的实际使用主频
(8)cache size :CPU二级缓存大小
(9)physical id :单个CPU的标号
(10)siblings :单个CPU逻辑物理核数
(11)core id :当前物理核在其所处CPU中的编号,这个编号不一定连续
(12)cpu cores :该逻辑核所处CPU的物理核数
(13)apicid :用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续
(14)fpu :是否具有浮点运算单元(Floating Point Unit)
(15)fpu_exception :是否支持浮点计算异常
(16)cpuid level :执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容
(17)wp :表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection)
(18)flags :当前CPU支持的功能
(19)bogomips :在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second)
(20)clflush size :每次刷新缓存的大小单位
(21)cache_alignment :缓存地址对齐单位
(22)address sizes :可访问地址空间位数
(23)power management :对能源管理的支持,有以下几个可选支持功能:
/proc/crypto
系统上已安装的内核使用的密码算法及每个算法的详细信息列表
name : crc32
driver : crc32-pclmul
module : crc32-pclmul
priority : 250
refcnt : 1
selftest : passed
internal : yes
type : skcipher
blocksize : 16
digestsize: 4
/proc/devices
字符装置(Character Device)和块装置(Block Device)的major number和名字。比如你知道一个device的major number和minor number,你就可以通过改device的major number在这个文件里面查到device的具体类型。
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
13 input
Block devices:
8 sd
9 md
11 sr
65 sd
66 sd
67 sd
/proc/diskstats
内核通过diskstats文件,将通用块设备层的一些重要指标以文件的形式呈现给用户,/proc/diskstats 文件中,包含了设备相关的信息,即磁盘相关的信息,以文件形式保存。
253 0 vda 1746168 36417 1176610770 181628087 21568405 976149 1056163141 327225581 0 108763630 475299800 0 0 0 0
253 1 vda1 115 226 14601 318 1 0 1 0 0 340 190 0 0 0 0
253 2 vda2 524 0 126308 3107 20 2 4452 166 0 1560 2500 0 0 0 0
253 3 vda3 1745491 36191 1176463845 181624445 14007587 976147 1056158688 324926062 1 91126960 473918270 0 0 0 0
253 16 vdb 10202124 4961 4884985263 375955447 23440092 766118 4433247734 605919961 0 111733750 909536000 0 0 0 0
253 17 vdb1 10202103 4961 4884981423 375955398 15879335 766118 4433247734 600854086 1 73556740 905749350 0 0 0 0
11 0 sr0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
252 0 dm-0 11923311 0 6052040092 559235180 38612989 0 5445892975 999320890 2 139854130 1558556070 0 0 0 0
252 1 dm-1 73372 0 9395456 1487730 607717 0 77787776 200728120 0 599140 202215850 0 0 0 0
vda:设备名。一般ide接口的以hd[a-d]口命名,scsi和sata接口的以sd[a-z]命名。
/proc/execdomains
内核当前支持的执行域(每种操作系统独特“个性”)信息列表
0-0 Linux [kernel]
/proc/fb
可用的帧缓冲列表,包含帧缓冲设备的设备号和相关驱动信息
/proc/filesystems
当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;通常mount一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型。
nodev sysfsnodev rootfs
nodev ramfs
nodev bdev
nodev proc
nodev cpuset
/proc/fs
包含了一些文件系统信息。比较有用的有/proc/fs/ext4
目录,该目录下的每个subdirectory表示一个被挂载的device名字,device名字目录下还有mb_groups
和options
文件。
[test@myLinux fs]$ ls
aufs ext4 fscache jbd2 lockd nfs nfsd nfsfs xfs
/proc/inerrupts
系统中断使用信息,X86或X86_64体系架构系统上每个IRQ相关的中断号列表;多路处理器平台上每个CPU对于每个I/O设备均有自己的中断号。
CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11 CPU12 CPU13 CPU14 CPU15
2: 1017998324 3523442607 4209774678 111105660 3994378972 3926886470 3959970091 3993317757 4067035816 3806411631 4067614717 4021606034 4099769443 4048179032 103373262 4167652047 GICv3 27 Level
/proc/iomem
每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息,在 kernel/resource.c 中创建。
[test@myLinux proc]$ cat iomem
00000000-00000000 : LNRO0015:00
00000000-00000000 : LNRO0015:01
00000000-00000000 : ARMH0011:00
00000000-00000000 : ARMH0011:00
00000000-00000000 : QEMU0002:00
00000000-00000000 : fw_cfg_mem
00000000-00000000 : LNRO0005:00
/proc/ioports
提供了当前注册的端口区域列表,用于与设备进行输入或输出通信,包含了kernel driver用request_region划定的IO ports 范围的列表。第一列是IO ports的范围,第二列是调用request_region的kernel driver名字。
[test@myLinux proc]$ cat ioports
00000000-00000000 : PCI Bus 0000:00
00000000-00000000 : PCI Bus 0000:01
00000000-00000000 : PCI Bus 0000:02
00000000-00000000 : 0000:02:03.0
00000000-00000000 : 0000:02:01.0
00000000-00000000 : ahci
00000000-00000000 : 0000:02:04.0
00000000-00000000 : uhci_hcd
00000000-00000000 : 0000:02:06.0
00000000-00000000 : PCI Bus 0000:3f
第一列给出了为第二列中列出的设备保留的 I/O 端口地址范围,I/O端口地址空间通常都比较小。CPU通过设立专门的IN和OUT指令来访问这一空间中的地址单元(即I/O端口)
/proc/irq
中断系统子目录。每个注册的irq创建一个以irq编号为名字的子目录,每个子目录下分别有以下条目:
affinity_hint :只读条目,用于用户空间做irq平衡;
node :不明,参考kernel doc
smp_affinity :是一个bitmask用来设置CPU affinity,用来表示那些CPU可以handler这个IRQ,比如,echo 5 > /proc/irq/10/smp_affinity 表示1,2,3号CPU可以处理10号IRQ。当有多个CPU可以执行该IRQ时,kernel会采用Round Robin的方式去分配
spurious:可以获得该irq被处理和未被处理的次数的统计信息。
/proc/irq/default_smp_affinity 里面记录了对于未激活(non-allocated/activated) 的IRQ的CPU affinity bitmask。因为这些未激活的IRQ没有自己的subdirectory。
[test@myLinux proc]$ cd irq
[test@myLinux irq]$ ls
1 104 109 114 119 124 129 134 4 44 49 54 59 64 69 74 79 84 89 94 99
100 105 110 115 120 125 130 2 40 45 50 55 60 65 70 75 80 85 90 95 default_smp_affinity
101 106 111 116 121 126 131 3 41 46 51 56 61 66 71 76 81 86 91 96
102 107 112 117 122 127 132 37 42 47 52 57 62 67 72 77 82 87 92 97
103 108 113 118 123 128 133 39 43 48 53 58 63 68 73 78 83 88 93 98
[test@myLinux irq]$ cat default_smp_affinity
ffff
/proc/kallsyms
在内核中通过/proc/kallsyms获得符号的地址。
生成过程:
./scripts/kallsyms.c负责生成System.map
./kernel/kallsyms.c负责生成/proc/kallsyms
./scripts/kallsyms.c解析vmlinux(.tmp_vmlinux)生成kallsyms.S(.tmp_kallsyms.S),然后内核编译过程中将kallsyms.S(内核符号表)编入内核镜像uImage
内核启动后./kernel/kallsyms.c解析uImage形成/proc/kallsyms
/proc/kallsyms包含了内核中的函数符号(包括没有EXPORT_SYMBOL)、全局变量(用EXPORT_SYMBOL导出的全局变量)
/proc/keys
系统授权密钥环记录,包含了暴露给reading thread的key的列表
[test@myLinux proc]$ cat keys
0256e6a6 I--Q--- 194 perm 3f030000 1000 1000 keyring _ses: 3
20d035bf I--Q--- 1 perm 3f010000 1000 1000 user mykey: 16
/proc/key-users
此文件列出了每个用户ID的各种信息在系统上至少有一个密钥。
[test@myLinux proc]$ cat key-users
0: 86 85/85 79/1000000 1488/25000000
192: 1 1/1 1/200 9/20000
/proc/kmsg
内核日志,通过dmesg或者klogd查看。
/proc/kpagecgroup
这个文件包含一个64位的内存索引节点号cgroup每页收费,按页面框架编制索引数字。
/proc/kpagecount
此文件包含64位的次数计数每个物理页面帧都被映射,并按页面帧进行索引数字。
/proc/kpageflags
此文件包含64位掩码,每个掩码对应物理页面框架;它是按页码索引的。
/proc/loadavg
用来表示CPU和IO的负载。从左到右分别是1分钟,5分钟,15分钟的平均CPU和IO负载值,running的进程数/总进程数,最后使用的进程ID。这是一个很重要的一个系统负载指标,可以使用top,w,uptime,vmstat等命令查看。
[test@myLinux proc]$ cat loadavg
2.89 3.26 3.34 5/2916 3945357
/proc/locks
记录当前被kernel锁住的文件。
[test@myLinux proc]$ cat locks
1: FLOCK ADVISORY WRITE 2814436 fc:00:872727024 0 EOF
2: FLOCK ADVISORY WRITE 984 00:17:16298 0 EOF
3: FLOCK ADVISORY WRITE 1417 00:17:16853 0 EOF
从左到右分别表示:
- unique ID
- 锁种类:FLOCK为老式UNIX锁,POSIX为新式POSIX锁(使用lockf系统调用)
- 锁形式:ADVISORY表示不会阻止其他进程访问数据,当时会阻止获取锁。MANDATORY表示禁止任何访问
- 锁权限:READ或者WRITE
- 进程ID
- 文件ID:格式为,MAJOR:MINOR:INODE-NUMBER
- 文件开始位置
- 文件结束位置
/proc/mdstat
显式磁盘的信息,包含正在使用RAIDS、创建分区情况等。
/proc/meminfo
linux系统内存使用状况,是也一个较常使用的信息,常用的free、vmstat都是获取这里的信息。
[test@myLinux proc]$ cat meminfo
MemTotal: 32103296 kB
MemFree: 3933504 kB
MemAvailable: 10393024 kB
Buffers: 1344 kB
Cached: 11626304 kB
SwapCached: 70208 kB
Active: 13616512 kB
Inactive: 13533184 kB
Active(anon): 13305984 kB
Inactive(anon): 2925312 kB
Active(file): 310528 kB
Inactive(file): 10607872 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 4222912 kB
SwapFree: 1743872 kB
Dirty: 640 kB
Writeback: 0 kB
AnonPages: 15454400 kB
Mapped: 372672 kB
Shmem: 709440 kB
Slab: 616640 kB
SReclaimable: 100288 kB
SUnreclaim: 516352 kB
KernelStack: 46864 kB
PageTables: 67776 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 20274560 kB
Committed_AS: 45796736 kB
VmallocTotal: 133009637312 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
Percpu: 49152 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
ShmemPmdMapped: 0 kB
CmaTotal: 524288 kB
CmaFree: 486336 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 524288 kB
Hugetlb: 0 kB
MemTotal系统从加电开始到引导完成,firmware/BIOS要保留一些内存,kernel本身要占用一些内存,最后剩下可供kernel支配的内存就是MemTotal。这个值在系统运行期间一般是固定不变的。可参阅解读DMESG中的内存初始化信息。
MemFree表示系统尚未使用的内存。[MemTotal-MemFree]就是已被用掉的内存。
MemAvailable有些应用程序会根据系统的可用内存大小自动调整内存申请的多少,所以需要一个记录当前可用内存数量的统计值,MemFree并不适用,因为MemFree不能代表全部可用的内存,系统中有些内存虽然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可以回收,所以这部分可回收的内存加上MemFree才是系统可用的内存,即MemAvailable。/proc/meminfo中的MemAvailable是内核使用特定的算法估算出来的,要注意这是一个估计值,并不精确。
MemTotal:可用物理内存大小,是实际的物理内存条的总大小减去fireware和kernel本身占用的内存,即能够被kernel使用的内存总大小
MemFree:空闲内存大小,即free中的free大小
MemAvailable:可用内存大小,MemFree表示的是当前空闲的内存,但是在系统中还有一些内存虽然已经被使用但是可以被释放掉,如cache、buffer、slab中的部分,这些可回收的内存大小加上MemFree的大小才是系统的可用内存大小,即MemAvailable,MemAvailable·是一个估计值,因为一部分内存还没有被回收,这只是根据内核算法估算出来的结果,所以并不精确。
Buffers:块设备使用的缓存,包括直接读写块设备、以及文件系统的的元数据所使用的缓存,
直接对块设备进行读写操作使用的缓存。主要包括:直接读写块设备,文件系统元数据(比如superblock,不包括文件系统中文件的元数据)。它与Cached的区别在于,Cached表示的普通文件的缓存。
Cached:文件缓存
Buffers+Cached = Active(file)+Inactive(file)+Shmem
SwapCached:交换分区上占用的空间
Active:Active(anon) + Active(file),活跃的缓存大小
Inactive:Inactive(anon) +Inactive(file) 不活跃的缓存大小
Active(anon)/Inactive(anon)/Active(file)/Inactive(file):anon表示匿名内存,file表示文件内存,active表示最近使用过的内存,inactive表示最近没有使用的内存。当内存释放的时候,会优先释放inactive的内存空间。
Unevictable:不能够被释放的内存
Mlocked:被mlock()系统调用锁定的内存大小
SwapTotal:swap分区的大小
SwapFree:swap分区未使用的大小
Dirty:脏数据,尚未写入到磁盘中的数据大小
Writeback:正在写入的脏数据大小
AnonPages:匿名页的大小
Mapped:正在被进程关联的文件缓存大小
Shmem:tmpfs文件系统使用的内存和共享缓存大小
Slab:slab分配器使用的内存大小,等于SReclaimable+Sunreclaim
SReclaimable:Slab中不活跃的对象,可以被回收的容量
Sunreclaim:Slab中活跃的对象,不能被回收的容量
KernelStack:内核使用的堆栈大小,当前系统进程越多,kernelstack的值就越大
PageTables:页表使用的内存空间大小
NFS_Unstable:发送给NFS server但是还没有写入硬盘的缓存
Bounce:跳转buffer
CommitLimit:允许超过的虚拟内存大小
VmallocTotal:理论上虚拟内存空间的总大小
VmallocUsed:固定为0
VmallocChunk:固定为0
HardwareCorrupted:系统检测到内存上存在的硬件故障,会把有故障的页删除掉不再使用,HardwareCorrupted上就记录了删除掉的内存页大小
AnonHugePages:透明大页使用量
HugePage_Total:分配的大页内存大小
HugePage_Free:空闲的大页内存大小
Hugepagesize:大页大小
/proc/misc
提供了那些没有被ASSIGN给其它/proc文件的数据信息,获取内核或硬件设备的某些信息。这些信息通常是原始数据的形式,需要一定的解释和分析后才能真正理解。
/proc/modules
显示所有被加载到kernel的模块。使用lsmod命令查看更加工整。
[test@myLinux proc]$ cat modules
nfsv3 262144 0 - Live 0x0000000000000000
rpcsec_gss_krb5 262144 0 - Live 0x0000000000000000
nfsv4 786432 2 - Live 0x0000000000000000
dns_resolver 262144 1 nfsv4, Live 0x0000000000000000
nfs 458752 3 nfsv3,nfsv4, Live 0x0000000000000000
fscache 524288 2 nfsv4,nfs, Live 0x0000000000000000
从左到右分别是:
- 模块名字
- 模块所占内存大小
- 有多少实例被加载
- 所依赖的模块列表
- 模块状态,Live,Loading,Unloading
- 模块所在kernel内存的offset,用来做debug分析用,比如oprofile工具
/proc/mounts
当前系统的文件系统mount列表。
[test@myLinux proc]$ cat mounts
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
从左到右依次是:
- 文件系统名字
- 文件mount点
- 文件系统类型
- 权限
- dump
- fsck
/proc/net
也是一个很重要的文件记录,记录了系统的网络情况和网络配置信息。
[test@myLinux net]$ ls
anycast6 fib_trie igmp6 ip_tables_matches netfilter psched rt6_stats sockstat6 udp6
arp fib_triestat ip6_flowlabel ip_tables_names netlink ptype rt_acct softnet_stat udplite
connector icmp ip6_mr_cache ip_tables_targets netstat raw rt_cache stat udplite6
dev icmp6 ip6_mr_vif ipv6_route nfsfs raw6 snmp tcp unix
dev_mcast if_inet6 ip_mr_cache mcfilter packet route snmp6 tcp6 wireless
dev_snmp6 igmp ip_mr_vif mcfilter6 protocols rpc sockstat udp xfrm_stat
/proc/net/tcp 显示tcp4网络信息 /proc/net/tcp6 显示tcp6网络信息
/proc/pagetypeinfo
相较于/proc/buddyinfo,该文件包含了更细节的空闲page的统计。用以分析内存分配bug。内核中通过对不同页面进行分组来避免碎片化将类型迁移到称为页块的相同连续内存区域中。
Page block order: 9
Pages per block: 512
Free pages count per migrate type at order 0 1 2 3 4 5 6 7 8 9 10
Node 0, zone DMA, type Unmovable 0 1 0 1 1 1 1 0 1 0 0
Node 0, zone DMA, type Movable 0 0 0 0 0 0 0 0 0 1 3
Node 0, zone DMA, type Reclaimable 0 0 0 0 0 0 0 0 0 0 0
Node 0, zone DMA, type HighAtomic 0 0 0 0 0 0 0 0 0 0 0
Node 0, zone DMA, type Isolate 0 0 0 0 0 0 0 0 0 0 0
Node 0, zone DMA32, type Unmovable 40 22 4 15 7 2 0 0 1 1 1
Node 0, zone DMA32, type Movable 2674 2438 1697 1214 594 143 27 4 4 1 476
Node 0, zone DMA32, type Reclaimable 30 36 18 9 11 9 17 13 5 3 4
Node 0, zone DMA32, type HighAtomic 0 0 0 0 0 0 0 0 0 0 0
Node 0, zone DMA32, type Isolate 0 0 0 0 0 0 0 0 0 0 0
Node 0, zone Normal, type Unmovable 126 32 17 5 7 0 0 0 0 0 0
Node 0, zone Normal, type Movable 49 11390 4915 618 279 4 0 0 0 0 0
Node 0, zone Normal, type Reclaimable 127 78 253 99 75 9 1 0 0 0 0
Node 0, zone Normal, type HighAtomic 0 0 0 0 0 0 0 0 0 0 0
Node 0, zone Normal, type Isolate 0 0 0 0 0 0 0 0 0 0 0
Number of blocks type Unmovable Movable Reclaimable HighAtomic Isolate
Node 0, zone DMA 1 7 0 0 0
Node 0, zone DMA32 6 1754 24 0 0
Node 0, zone Normal 221 1724 343 0 0
/proc/partitions
包含了系统分区的信息。从左到右依次是:major number,minor number,block数量,分区名称。
major minor #blocks name
253 0 52428800 vda
253 1 204800 vda1
253 2 1048576 vda2
253 3 51173376 vda3
253 16 262144000 vdb
253 17 262142976 vdb1
11 0 1048575 sr0
252 0 309088256 dm-0
252 1 4222976 dm-1
/proc/sched_debug
kernel调度器的debug信息。
/proc/schedstat
调度器状态数据
version 15
timestamp 5584247103
cpu0 0 0 0 0 0 0 424405389779060 96615823560430 22857723126
domain0 ffff 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
/proc/scsi
以驱动程序命名的目录中的每个适配器都有一个文件系统。这些文件包含有关控制器的信息,包括所使用的IRQ和IO地址范围。显示的信息量为取决于使用的适配器。
[test@myLinux proc]$ cd scsi
[test@myLinux scsi]$ ls
device_info scsi sg
/proc/slabinfo
包含slab内存分配情况。Linux kernel会使用slab分配器进行低于一个內存页的内存分配。
/proc/softirqs
为每个cpu提供自引导时间以来服务的softirq处理程序的计数。不同CPU上的软中断(soft interrupt)的数量统计。其中第一列里,TIMER为定时中断、NET_RX为网络接收、NET_TX为网络发送,SCHED内核调度、RCU(RCU 锁)。可以使用mpstate命令查看。当top发现CPU的si使用率很高时可以通过该文件查看那一类中断比较多,从而定位性能瓶颈。
> cat /proc/softirqs
CPU0 CPU1 CPU2 CPU3
HI: 0 0 0 0
TIMER: 27166 27120 27097 27034
NET_TX: 0 0 0 17
NET_RX: 42 0 0 39
BLOCK: 0 0 107 1121
TASKLET: 0 0 0 290
SCHED: 27035 26983 26971 26746
HRTIMER: 0 0 0 0
RCU: 1678 1769 2178 2250
/proc/stat
记录了系统自上一次启动以来的一些运行数据,比如CPU在不同情况下的使用时间,中断数统计,上下文切换统计等等。此文件中报告的所有数字都是聚合数自系统首次启动以来。为了快速查看,只需将文件放入cat即可。
pu 244939043 160629 336654028 19810440829 26785008 71364376 44858107 0 0 0
cpu0 15394097 6838 21312646 1237930729 1819759 4460072 785206 0 0 0
cpu1 15903537 9583 21189406 1238963231 1755757 4487373 964874 0 0 0
cpu2 15625317 10440 21035396 1240356984 1619028 4344654 681100 0 0 0
cpu3 15389994 11336 20958128 1240475628 1694415 4374730 671430 0 0 0
cpu4 14765742 9987 21217351 1236138615 1660872 4556678 5244293 0 0 0
cpu5 15367563 10250 21036247 1236288558 1685287 4539681 4699207 0 0 0
cpu6 15621070 10316 20939876 1240437285 1657916 4323438 666094 0 0 0
cpu7 15042360 9733 20872200 1235218742 1521256 4600572 6344072 0 0 0
cpu8 15442128 9082 21049992 1240477633 1648660 4340707 668411 0 0 0
cpu9 15087681 9847 21031726 1235895283 1729551 4545753 5288452 0 0 0
cpu10 15296187 8765 21014969 1240382292 1716971 4370892 686983 0 0 0
cpu11 14502440 10752 20718650 1231199081 1594800 4768636 10780291 0 0 0
cpu12 15418422 11130 21081642 1240490524 1607996 4344265 668224 0 0 0
cpu13 15459410 8682 21040178 1240389689 1712380 4341569 668204 0 0 0
cpu14 15467422 10470 21137205 1239895477 1716727 4426684 671508 0 0 0
cpu15 15155665 13409 21018407 1235901069 1643625 4538663 5369752 0 0 0
intr 79132619396 0 0 1612993883 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65 0 0 0 0 0 1 1 1 1 1 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 0 0 28130950 0 30553058 11094934 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 0 26097831 3 0 990261890 496529
ctxt 727964631919
btime 1670469897
processes 326788297
procs_running 3
procs_blocked 0
softirq 27907662096 3 2592561657 34065392 1442525309 63561764 0 2383454 3477120843 3772741 3111801749
/proc/swaps
记录系统的swap空间以及使用数据。其中有多个swap空间是,Priority的值越低越会被使用。
Filename Type Size Used Priority
/dev/dm-1 partition 4222912 2479040 -2
/proc/sys
提供kernel runtime配置接口。可以通过sysctl命令操作。
[test@myLinux proc]$ cd sys
[test@myLinux sys]$ ls
crypto debug dev fs fscache kernel net user vm
/proc/sysrq-trigger
通过echo特定的指令到该文件中可以触发一些效果。需要使用root用户触发。也可以使用组合键Alt + SysRq + [command]的方式触发 。通过/proc/sys/kernel/sysrq可以显示哪些命令可以生效。
立即重新启动计算机
echo "b" > /proc/sysrq-trigger
# 立即关闭计算机
echo "o" > /proc/sysrq-trigger
# 导出内存分配的信息 (可以用/var/log/message 查看)
echo "m" > /proc/sysrq-trigger
# 导出当前CPU寄存器信息和标志位的信息
echo "p" > /proc/sysrq-trigger
# 导出线程状态信息
echo "t" > /proc/sysrq-trigger
# 故意让系统崩溃
echo "c" > /proc/sysrq-trigger
# 立即重新挂载所有的文件系统
echo "s" > /proc/sysrq-trigger
# 立即重新挂载所有的文件系统为只读
echo "u" > /proc/sysrq-trigger
# r、e、i、s、u、b的顺序触发,让系统安全重启
/proc/sysvipc
记录System V IPC相关的信息,
[test@myLinux sysvipc]$ ls
msg sem shm
[test@myLinux sysvipc]$
[test@myLinux sysvipc]$ cat msg
key msqid perms cbytes qnum lspid lrpid uid gid cuid cgid stime rtime ctime
[test@myLinux sysvipc]$ cat sem
key semid perms nsems uid gid cuid cgid otime ctime
808241953 65536 777 1 1001 1001 1001 1001 1670570581 1670491425
808241955 98305 777 1 1001 1001 1001 1001 1670570581 1670491425
808240416 131074 777 1 1001 1001 1001 1001 1673333559 1673333518
808240417 163843 777 1 1001 1001 1001 1001 1673333559 1673333518
808218727 196612 777 1 1021 1021 1021 1021 1677238188 1677565727
808218728 229381 777 1 1021 1021 1021 1021 1677238188 1677565727
808232700 262150 777 1 1021 1021 1021 1021 1678691867 1678672746
808232703 294919 777 1 1021 1021 1021 1021 1678691867 1678672747
808215986 327688 777 1 1021 1021 1021 1021 1679557274 1679557251
808215989 360457 777 1 1021 1021 1021 1021 1679557274 1679557251
808253583 393226 777 1 1023 1023 1023 1023 1680496661 1680496653
808253586 425995 777 1 1023 1023 1023 1023 1680496661 1680496653
808190784 458764 777 1 1021 1021 1021 1021 1682072583 1681917600
808190785 491533 777 1 1021 1021 1021 1021 1682072583 1681917600
808233564 524302 777 1 1023 1023 1023 1023 1683337566 1683334662
808233567 557071 777 1 1023 1023 1023 1023 1683337566 1683334662
[test@myLinux sysvipc]$ cat shm
key shmid perms size cpid lpid nattch uid gid cuid cgid atime dtime ctime rss swap
- msg:表示消息
- sem:表示信号量(semaphore)
- shm:共享内存
/proc/timer_list
内核提供了方便查看当前系统TickDevice、活动的Timer列表以及Timer使用的统计信息。内核分别用两个节点来表示TimerList和Timer统计信息。
一个是/proc/timer_list,打印per_cpu的hrtimer_bases信息以及基于此的timer列表,包括三种时MONOTONIC/REALTIME/BOOTTIME;以及Broadcast Tick Device和Per CPU Tick Device信息。
另一个是/proc/timer_stats,需要echo 1 > /proc/timer_stats打开,echo 0 /proc/timer_stats关闭。cat /proc/timer_stats可以获取统计信息。
/proc/timer_stats
需要echo 1 > /proc/timer_stats打开,echo 0 /proc/timer_stats关闭。cat /proc/timer_stats可以获取统计信息。
统计结束后:从左到右依次是,timer count、进程号、进程名称、超时函数、启动timer函数。通过timer_stats可以知道系统的timer使用程度,一定程度上反映了进程的活跃状态
/proc/tty
存储着可以使用以及正在使用的tty装置的信息。Linux上有3种tty装置,serial tty,pesudo tty,以及virtual tty。使用中的tty装置记录在 /proc/tty/drives文件中。/proc/tty/driver/serial中记录了每个serial tty的使用情况 。
[test@myLinux proc]$ cd tty
[test@myLinux tty]$ ls
driver drivers ldisc ldiscs
/proc/uptime
系统uptime时间,uptime命令查看的就是当前的记录
12893374.32 199328575.48
第一个参数代表从系统启动到现在的时间(以秒为单位)
第二个参数代表系统空闲的时间(以秒为单位
在SMP系统里,系统空闲的时间有时会是系统运行时间的几倍,因为系统空闲时间的计算,是把SMP算进去的,就是所你有几个逻辑的CPU(包括超线程)。
系统的空闲率(%) = num2/(num1*N) 其中N是SMP系统中的CPU个数。
计算一下空闲率:
3310821.00 / 3387048.81 = 0.9774943278718207
也就是说:它的空闲率是97%
说明:
(1)空闲率高低并不单意味着,它做的工作多少,还有跟服务器的配置和性能有很大的关系。
(2)空闲率跟服务器的配置有很大的关系,服务器的性能越好,配置越高,它处理的速度越快,配置高的服务器处理的时间要小于配置低的服务器。
(3)从空闲时间,你就可以判断你的服务器负载是否过大,看一下是不是有异常情况发生,如果空闲时间很小,说明你的服务器已经在满负荷运行,然后决定是不是需要升级你的服务器。
(4)系统空闲率越大,说明系统比较闲,可以加重一些负载;而系统空闲率很小,则可能考虑升级本机器硬件或者迁移部分负载到其他机器上。
/proc/version
系统kernel版本信息
Linux version 4.4.0-19041-Microsoft (Microsoft@Microsoft.com) (gcc version 5.4.0 (GCC) ) #2311-Microsoft Tue Nov 08 17:09:00 PST 2022
/proc/vmallocinfo
vmalloc分配信息,Vmalloc用来将不连续的物理地址分配给连续的虚拟地址。
> cat /proc/vmallocinfo
0xffffc20000000000-0xffffc20000201000 2101248 alloc_large_system_hash+0x204 ...
/0x2c0 pages=512 vmalloc N0=128 N1=128 N2=128 N3=128
0xffffc20000201000-0xffffc20000302000 1052672 alloc_large_system_hash+0x204 ...
/0x2c0 pages=256 vmalloc N0=64 N1=64 N2=64 N3=64
0xffffc20000302000-0xffffc20000304000 8192 acpi_tb_verify_table+0x21/0x4f...
phys=7fee8000 ioremap
0xffffc20000304000-0xffffc20000307000 12288 acpi_tb_verify_table+0x21/0x4f...
phys=7fee7000 ioremap
0xffffc2000031d000-0xffffc2000031f000 8192 init_vdso_vars+0x112/0x210
从左到右依次是:虚拟地址,分配大小,哪个函数分配的,物理地址,分配类型
/proc/vmstat
显示从内核导出的虚拟内存的统计信息
nr_free_pages 61121 //空闲页数量
nr_zone_inactive_anon 45836 //所有zone统计的非活跃的匿名页数之和
nr_zone_active_anon 208114 //所有zone统计的活跃的匿名页数之和
nr_zone_inactive_file 165808 //所有zone统计的非活跃的文件页数之和
nr_zone_active_file 4853 //所有zone统计的活跃的文件页数之和
nr_zone_unevictable 0 //所有zone统计的不可释放的页数之和
nr_zone_write_pending 9 //脏页、写回页和不稳定页的计数
nr_mlock 0 //mlock的页数
nr_page_table_pages 1059 //分配到页表的页数
nr_kernel_stack 46880 //分配给内核堆栈的内存量
nr_bounce 0 //缓冲取页数量
nr_zspages 0 //Zsmalloc分配器分配的页数量
nr_free_cma 7599 //可用的CMA(连续内存分配器)页面数
numa_hit 41950664048 //进程从此节点成功分配成功的内存
numa_miss 0 //在非预期节点中分配
numa_foreign 0 //进程想在这个节点上分配,但最终却从另一个节点获得了内存
numa_interleave 4624 //交织分配的页
numa_local 41950664048 //从本地节点分配的内存
numa_other 0 //从其他节点分配的内存
nr_inactive_anon 45836 //所有node统计的非活跃的匿名页数之和
nr_active_anon 208114 //所有node统计的活跃的匿名页数之和
nr_inactive_file 165808 //所有node统计的非活跃的文件页数之和
nr_active_file 4853 //所有node统计的活跃的文件页数之和
nr_unevictable 0 // 所有node统计的不可释放的页数之和
nr_slab_reclaimable 1567 //已经分配出去的reclaimable slab object的内存大小
nr_slab_unreclaimable 8062 // 已经分配出去的unreclaimable slab object的内存大小
nr_isolated_anon 0 //anon lru的临时隔离页
nr_isolated_file 0 //文件lru临时隔离页
workingset_refault 14562813 //TODO
/proc/zoneinfo
DMA,Normal, Highmem区域的详细内存使用情况
Node 0, zone DMA
per-node stats
nr_inactive_anon 45836
nr_active_anon 208140
nr_inactive_file 166920
nr_active_file 5141
nr_unevictable 0
nr_slab_reclaimable 1567
nr_slab_unreclaimable 8063
nr_isolated_anon 0
nr_isolated_file 0
workingset_refault 14562813
workingset_activate 2242125
workingset_nodereclaim 996722
nr_anon_pages 241753
nr_mapped 5974
nr_file_pages 184369
nr_dirty 7
nr_writeback 0
nr_writeback_temp 0
nr_shmem 11214
nr_shmem_hugepages 0
nr_shmem_pmdmapped 0
nr_anon_transparent_hugepages 0
nr_unstable 0
nr_vmscan_write 815704
nr_vmscan_immediate_reclaim 621726
nr_dirtied 58545394
nr_written 48579207
pages free 15447
min 2172
low 2715
high 3258
spanned 49152
注:整理过程参考了很多博客和官方文档,不逐一列举了,只放重要参考:
Linux procfs内容大汇总(1) - 知乎
https://www.kernel.org/doc/Documentation/filesystems/proc.txt
Maintaining Linux man-pages