提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- [pid]/attr
- [pid]/cmdline
- [pid]/comm
- [pid]/coredump_filter
- [pid]/cwd
- [pid]/environ
- [pid]/exe
- [pid]/fd/
- [pid]/fdinfo/
- [pid]/gid_map uid_map
- [pid]/limits
- [pid]/map_files/
- [pid]/maps
- [pid]/mem
- [pid]/mountinfo
- [pid]/ns/
- [pid]/pagemap
- [pid]/root
- [pid]/smaps
- [pid]/stack
- [pid]/stat
- [pid]/statm
- [pid]/status
- [pid]/syscall
- [pid]/task
- [pid]/task/[tid]/children
- [pid]/timers
- [pid]/wchan
- apm
- buddyinfo
- cmdline
- filesystems
- iomem
- loadavg
- locks
- meminfo
- modules
- net/
- net/arp
- net/dev
- net/raw tcp udp unix
- partitions
- slabinfo
- stat
- swaps
- sys
- uptime
- version
- vmstat
- zoneinfo
前言
proc是伪文件系统,它提供了和内核数据结构交互的接口。通常它挂载在/proc目录下。
大致分为下面的组和子目录:
- /proc/[pid]
包含进程信息, a task subdirectory contains subdirectories of the form task/[tid], which contain corresponding information about each of the threads in the process, where tid is the kernel thread ID of the thread.
该目录可被ls观察到 - /proc/[tid]
thread相关的资源信息,与/proc/[pid]/task/[tid]是一样的。
/proc/[tid]不能被getdents遍历到因此不能被ls观察但可直接cd - /proc/self
- /proc/thread-self
- /proc/[a-z]*
system-wide info
[pid]/attr
该目录内的东西是为了支持安全相关的内容,如支持SELinux等安全模块。
只有当内核配置为 CONFIG_SECURITY 才有该目录。
attr/current
该文件表示了最近进程的安全属性
在SELinux中,该文件用于获取进程的安全上下文。
[pid]/cmdline
完整的命令行
僵尸进程为空
execve改变的argv将会在这里呈现
[pid]/comm
线程可通过写入 /proc/self/task/[tid]/comm 改变本线程组的comm,大于TASK_COMM_LEN的字符(包括’\0’)会被截断,最多15个可显示字符
pthread_setname_np通过它重命名线程
可用于在core文件中标识不同线程
[pid]/coredump_filter
用于设置哪些内存段存入core文件
[pid]/cwd
指向当前工作目录的符号链接
cd /proc/[pid]/cwd; pwd -P
[pid]/environ
execve后的初始环境变量(char* env[]):
cat /proc/1/environ | tr ‘\000’ ‘\n’
后续对 putenv 或者 environ变量的改变不会反映到该文件!!!
[pid]/exe
符号链接,指向可执行文件的绝对路径
[pid]/fd/
包含进程打开的所有的文件描述符(符号链接)
对于 pipe 和 socket :
type[inode]
[pid]/fdinfo/
文件描述符信息,只读
- 常规文件
pos: 1000 # offset flags: 01002002 # 标识 包含open时的flag mnt_id: 21 # 挂载点id
- eventfd
pos: 0 flags: 02 mnt_id: 10 eventfd-count: 40 # 十六进制计数
- epoll文件描述符
- signalfd
pos: 0 flags: 02 mnt_id: 10 # 十六进制信号屏蔽集,下面屏蔽了SIGINT和SIGQUIT信号 sigmask: 0000000000000006
- timerfd
。。。。。。
[pid]/gid_map uid_map
man 7 user_namespaces
[pid]/limits
This file displays the soft limit, hard limit, and units of measurement for each of the process’s resource limits
ulimits -a 可看
[pid]/map_files/
This subdirectory contains entries corresponding to memory-mapped files (see mmap(2)).
[pid]/maps
进程的内存空间
address perms offset dev inode pathname
00400000-00452000 r-xp 00000000 08:02 173521 /usr/bin/dbus-daemon
00651000-00652000 r--p 00051000 08:02 173521 /usr/bin/dbus-daemon
00652000-00655000 rw-p 00052000 08:02 173521 /usr/bin/dbus-daemon
00e03000-00e24000 rw-p 00000000 00:00 0 [heap]
00e24000-011f7000 rw-p 00000000 00:00 0 [heap]
...
35b1800000-35b1820000 r-xp 00000000 08:02 135522 /usr/lib64/ld-2.15.so
35b1a1f000-35b1a20000 r--p 0001f000 08:02 135522 /usr/lib64/ld-2.15.so
35b1a20000-35b1a21000 rw-p 00020000 08:02 135522 /usr/lib64/ld-2.15.so
35b1a21000-35b1a22000 rw-p 00000000 00:00 0
35b1c00000-35b1dac000 r-xp 00000000 08:02 135870 /usr/lib64/libc-2.15.so
35b1dac000-35b1fac000 ---p 001ac000 08:02 135870 /usr/lib64/libc-2.15.so
35b1fac000-35b1fb0000 r--p 001ac000 08:02 135870 /usr/lib64/libc-2.15.so
35b1fb0000-35b1fb2000 rw-p 001b0000 08:02 135870 /usr/lib64/libc-2.15.so
...
f2c6ff8c000-7f2c7078c000 rw-p 00000000 00:00 0 [stack:986]
...
7fffb2c0d000-7fffb2c2e000 rw-p 00000000 00:00 0 [stack]
7fffb2d48000-7fffb2d49000 r-xp 00000000 00:00 0 [vdso]
address: 进程虚拟内存地址
perms:
r = read
w = write
x = execute
s = shared
p = private(copy on write)
offset: 在file/whatever中的偏移量
dev: 设备(major:minor)
inode: 在该设备中的inode,0意味无inode与该段内存关联,如BSS段
pathname:该内存段映射的文件
[stack] 初始化(main线程)栈区
[stack:<\tid>] 线程栈 (在Linux3.4~4.4)中存在,在4.4之后移除了,因为在有超多线程的进程中提供该信息非常占用资源
[vdso] 虚拟动态链接共享库,它是一个small的共享库,内核会自动的将它映射到所有进程的用户空间。应用不需要关心这些细节,因为它会由C库调用。像往常一样使用标准函数接口,C库会处理与VDSO相关的功能。该库的存在是为了解决高频调用syscall而导致的用户态-内核态/上下文切换的开销。请使用C库的标准接口。
在x86 32-bit systems 通过触发软中断( int $0x80 )来告诉内核应用想要进行系统调用。
但是该指令的代价是十分昂贵的。通过vdso内核提供了一种机制,
例如获取事件的函数,gettimeofday,将它从系统调用转换成了一个普遍的函数调用
[heap] 进程堆区
如果一个pathname是空的,代表它是匿名的,There is no easy way to coordinate this back to a process’s source, short of running it through gdb(1), strace(1), or similar.
如果对虚拟内存进行了超越 perms 的访问则会触发 segmentation fault
[pid]/mem
用于通过open,read, lseek来访问进程的内存页
[pid]/mountinfo
process’s mount namespace内的挂载点的相关信息
[pid]/ns/
与namespace相关
[pid]/pagemap
进程虚拟内存页和物理内存页的映射,或者是虚拟内存页和swap的映射
[pid]/root
每个进程的文件系统根目录,由chroot syscall设置
[pid]/smaps
每个进程mapping的内存消耗
00400000-0048a000 r-xp 00000000 fd:03 960637 /bin/bash
Size: 552 kB
Rss: 460 kB
Pss: 100 kB
Shared_Clean: 452 kB
Shared_Dirty: 0 kB
Private_Clean: 8 kB
Private_Dirty: 0 kB
Referenced: 460 kB
Anonymous: 0 kB
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
ShmemPmdMapped: 0 kB
Swap: 0 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Locked: 0 kB
ProtectionKey: 0
VmFlags: rd ex mr mw me dw
第一行和maps一样
Rss: 当前驻留在RAM中的映射量
只有当内核配置CONFIG_PROC_PAGE_MONITOR
开启时才有该文件
[pid]/stack
提供该进程内核栈的函数调用的符号追踪
[pid]/stat
该进程的状态信息,被ps命令使用
[pid]/statm
提供内存占用相关信息
[pid]/status
相比stat,statm,提供更详细的信息
[pid]/syscall
暴露进程最近执行系统调用号和参数寄存器
[pid]/task
包含一个进程中的所有线程
[pid]/task/[tid]/children
该task的子task
内核需配置CONFIG_PROC_CHILDREN参数
[pid]/timers
POSIX timers
# timer id 和 timer_create返回的timer ID不同,它和内核内部的ID(siginfo_t.si_timerid)相同
ID: 1
# timer用于分发通知的信号,/后是一个由sigev_value提供的signal handler
signal: 60/00007fff86e452a8
# 分发通知的机制(signal / thread / none)/
notify: signal/pid.2634
ClockID: 0
ID: 0
signal: 60/00007fff86e452a8
notify: signal/pid.2634
ClockID: 1
[pid]/wchan
The symbolic name corresponding to the location in the kernel where the process is sleeping.
apm
advanced power management
buddyinfo
用于诊断内存碎片问题
cmdline
启动时传入内核的参数
filesystems
内核支持的文件系统
iomem
I/O 内存映射
loadavg
locks
显示最近的file locks(flock(2) and fcntl(2))
1: POSIX ADVISORY READ 5433 08:01:7864448 128 128
2: FLOCK ADVISORY WRITE 2001 08:01:7864554 0 EOF
3: FLOCK ADVISORY WRITE 1568 00:2f:32388 0 EOF
4: POSIX ADVISORY WRITE 699 00:16:28457 0 EOF
5: POSIX ADVISORY WRITE 764 00:16:21448 0 0
6: POSIX ADVISORY READ 3548 08:01:7867240 1 1
7: POSIX ADVISORY READ 3548 08:01:7865567 1826 2335
8: OFDLCK ADVISORY WRITE -1 08:01:8713209 128 191
meminfo
报告系统的内存使用率的静态统计。free命令会用到该信息
modules
内核模块
net/
与网络相关的目录
net/arp
用于地址决议的内核arp表
net/dev
包含网络设备状态信息,ifconfig命令会用到它,包括虚拟网卡等
net/raw tcp udp unix
partitions
每个分区的major:minor
slabinfo
kernel caches. see slabinfo(5)
stat
kernel/system 统计
swaps
see swapon(8)
sys
与内核变量有关
uptime
自系统启动以来的时间和多核总的空闲时间
version
/proc/sys/kernel/ostype, /proc/sys/kernel/osrelease, and /proc/sys/kernel/version
vmstat
虚拟内存统计
zoneinfo
This file displays information about memory zones. This is useful for analyzing virtual memory behavior.