原文轉自:http://www.cnblogs.com/cute/archive/2011/04/20/2022280.html
Linux系統上的/proc目錄是一種檔案系統,即proc檔案系統。與其它常見的檔案系統不同的是,/proc是一種僞檔案系統(也即虛拟檔案系統),存儲的是目前核心運作狀态的一系列特殊檔案,使用者可以通過這些檔案檢視有關系統硬體及目前正在運作程序的資訊,甚至可以通過更改其中某些檔案來改變核心的運作狀态。
基于/proc檔案系統如上所述的特殊性,其内的檔案也常被稱作虛拟檔案,并具有一些獨特的特點。例如,其中有些檔案雖然使用檢視指令檢視時會傳回大量資訊,但檔案本身的大小卻會顯示為0位元組。此外,這些特殊檔案中大多數檔案的時間及日期屬性通常為目前系統時間和日期,這跟它們随時會被重新整理(存儲于RAM中)有關。
為了檢視及使用上的友善,這些檔案通常會按照相關性進行分類存儲于不同的目錄甚至子目錄中,如/proc/scsi目錄中存儲的就是目前系統上所有SCSI裝置的相關資訊,/proc/N中存儲的則是系統目前正在運作的程序的相關資訊,其中N為正在運作的程序(可以想象得到,在某程序結束後其相關目錄則會消失)。
大多數虛拟檔案可以使用檔案檢視指令如cat、more或者less進行檢視,有些檔案資訊表述的内容可以一目了然,但也有檔案的資訊卻不怎麼具有可讀性。不過,這些可讀性較差的檔案在使用一些指令如apm、free、lspci或top檢視時卻可以有着不錯的表現。
一、 程序目錄中的常見檔案介紹
/proc目錄中包含許多以數字命名的子目錄,這些數字表示系統目前正在運作程序的程序号,裡面包含對應程序相關的多個資訊檔案。
[root@rhel5 ~]# ll /proc
total 0
dr-xr-xr-x 5 root root 0 Feb 8 17:08 1
dr-xr-xr-x 5 root root 0 Feb 8 17:08 10
dr-xr-xr-x 5 root root 0 Feb 8 17:08 11
dr-xr-xr-x 5 root root 0 Feb 8 17:08 1156
dr-xr-xr-x 5 root root 0 Feb 8 17:08 139
dr-xr-xr-x 5 root root 0 Feb 8 17:08 140
dr-xr-xr-x 5 root root 0 Feb 8 17:08 141
dr-xr-xr-x 5 root root 0 Feb 8 17:09 1417
dr-xr-xr-x 5 root root 0 Feb 8 17:09 1418
上面列出的是/proc目錄中一些程序相關的目錄,每個目錄中是當程序本身相關資訊的檔案。下面是作者系統(RHEL5.3)上運作的一個PID為2674的程序saslauthd的相關檔案,其中有些檔案是每個程序都會具有的,後文會對這些常見檔案做出說明。
[root@rhel5 ~]# ll /proc/2674
dr-xr-xr-x 2 root root 0 Feb 8 17:15 attr
-r-------- 1 root root 0 Feb 8 17:14 auxv
-r--r--r-- 1 root root 0 Feb 8 17:09 cmdline
-rw-r--r-- 1 root root 0 Feb 8 17:14 coredump_filter
-r--r--r-- 1 root root 0 Feb 8 17:14 cpuset
lrwxrwxrwx 1 root root 0 Feb 8 17:14 cwd -> /var/run/saslauthd
-r-------- 1 root root 0 Feb 8 17:14 environ
lrwxrwxrwx 1 root root 0 Feb 8 17:09 exe -> /usr/sbin/saslauthd
dr-x------ 2 root root 0 Feb 8 17:15 fd
-r-------- 1 root root 0 Feb 8 17:14 limits
-rw-r--r-- 1 root root 0 Feb 8 17:14 loginuid
-r--r--r-- 1 root root 0 Feb 8 17:14 maps
-rw------- 1 root root 0 Feb 8 17:14 mem
-r--r--r-- 1 root root 0 Feb 8 17:14 mounts
-r-------- 1 root root 0 Feb 8 17:14 mountstats
-rw-r--r-- 1 root root 0 Feb 8 17:14 oom_adj
-r--r--r-- 1 root root 0 Feb 8 17:14 oom_score
lrwxrwxrwx 1 root root 0 Feb 8 17:14 root -> /
-r--r--r-- 1 root root 0 Feb 8 17:14 schedstat
-r-------- 1 root root 0 Feb 8 17:14 smaps
-r--r--r-- 1 root root 0 Feb 8 17:09 stat
-r--r--r-- 1 root root 0 Feb 8 17:14 statm
-r--r--r-- 1 root root 0 Feb 8 17:10 status
dr-xr-xr-x 3 root root 0 Feb 8 17:15 task
-r--r--r-- 1 root root 0 Feb 8 17:14 wchan
1.1、cmdline — 啟動目前程序的完整指令,但僵屍程序目錄中的此檔案不包含任何資訊;
[root@rhel5 ~]# more /proc/2674/cmdline
/usr/sbin/saslauthd
1.2、cwd — 指向目前程序運作目錄的一個符号連結;
1.3、environ — 目前程序的環境變量清單,彼此間用空字元(NULL)隔開;變量用大寫字母表示,其值用小寫字母表示;
[root@rhel5 ~]#
more /proc/2674/environ
TERM=linuxauthd
1.4、exe — 指向啟動目前程序的可執行檔案(完整路徑)的符号連結,通過/proc/N/exe可以啟動目前程序的一個拷貝;
1.5、fd — 這是個目錄,包含目前程序打開的每一個檔案的檔案描述符(file descriptor),這些檔案描述符是指向實際檔案的一個符号連結;
ll /proc/2674/fd
lrwx------ 1 root root 64 Feb 8 17:17 0 -> /dev/null
lrwx------ 1 root root 64 Feb 8 17:17 1 -> /dev/null
lrwx------ 1 root root 64 Feb 8 17:17 2 -> /dev/null
lrwx------ 1 root root 64 Feb 8 17:17 3 -> socket:[7990]
lrwx------ 1 root root 64 Feb 8 17:17 4 -> /var/run/saslauthd/saslauthd.pid
lrwx------ 1 root root 64 Feb 8 17:17 5 -> socket:[7991]
lrwx------ 1 root root 64 Feb 8 17:17 6 -> /var/run/saslauthd/mux.accept
1.6、limits — 目前程序所使用的每一個受限資源的軟限制、硬限制和管理單元;此檔案僅可由實際啟動目前程序的UID使用者讀取;(2.6.24以後的核心版本支援此功能);
1.7、maps — 目前程序關聯到的每個可執行檔案和庫檔案在記憶體中的映射區域及其通路權限所組成的清單;
[root@rhel5 ~]# cat /proc/2674/maps
00110000-00239000 r-xp 00000000 08:02 130647 /lib/libcrypto.so.0.9.8e
00239000-0024c000 rwxp 00129000 08:02 130647 /lib/libcrypto.so.0.9.8e
0024c000-00250000 rwxp 0024c000 00:00 0
00250000-00252000 r-xp 00000000 08:02 130462 /lib/libdl-2.5.so
00252000-00253000 r-xp 00001000 08:02 130462 /lib/libdl-2.5.so
1.8、mem — 目前程序所占用的記憶體空間,由open、read和lseek等系統調用使用,不能被使用者讀取;
1.9、root — 指向目前程序運作根目錄的符号連結;在Unix和Linux系統上,通常采用chroot指令使每個程序運作于獨立的根目錄;
1.10、stat — 目前程序的狀态資訊,包含一系統格式化後的資料列,可讀性差,通常由ps指令使用;
1.11、statm — 目前程序占用記憶體的狀态資訊,通常以“頁面”(page)表示;
1.12、status — 與stat所提供資訊類似,但可讀性較好,如下所示,每行表示一個屬性資訊;其詳細介紹請參見 proc的man手冊頁;
more /proc/2674/status
Name: saslauthd
State: S (sleeping)
SleepAVG: 0%
Tgid: 2674
Pid: 2674
PPid: 1
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 32
Groups:
VmPeak: 5576 kB
VmSize: 5572 kB
VmLck: 0 kB
VmHWM: 696 kB
VmRSS: 696 kB
…………
1.13、task — 目錄檔案,包含由目前程序所運作的每一個線程的相關資訊,每個線程的相關資訊檔案均儲存在一個由線程号(tid)命名的目錄中,這類似于其内容類似于每個程序目錄中的内容;(核心2.6版本以後支援此功能)
二、/proc目錄下常見的檔案介紹
2.1、/proc/apm
進階電源管理(APM)版本資訊及電池相關狀态資訊,通常由apm指令使用;
2.2、/proc/buddyinfo
用于診斷記憶體碎片問題的相關資訊檔案;
2.3、/proc/cmdline
在啟動時傳遞至核心的相關參數資訊,這些資訊通常由lilo或grub等啟動管理工具進行傳遞;
more /proc/cmdline
ro root=/dev/VolGroup00/LogVol00 rhgb quiet
2.4、/proc/cpuinfo
處理器的相關資訊的檔案;
2.5、/proc/crypto
系統上已安裝的核心使用的密碼算法及每個算法的詳細資訊清單;
[root@rhel5 ~]# more /proc/crypto
name : crc32c
driver : crc32c-generic
module : kernel
priority : 0
type : digest
blocksize : 32
digestsize : 4
2.6、/proc/devices
系統已經加載的所有塊裝置和字元裝置的資訊,包含主裝置号和裝置組(與主裝置号對應的裝置類型)名;
[root@rhel5 ~]# more /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
…………
Block devices:
1 ramdisk
2 fd
8 sd
2.7、/proc/diskstats
每塊磁盤裝置的磁盤I/O統計資訊清單;(核心2.5.69以後的版本支援此功能)
2.8、/proc/dma
每個正在使用且注冊的ISA DMA通道的資訊清單;
[root@rhel5 ~]# more /proc/dma
2: floppy
4: cascade
2.9、/proc/execdomains
核心目前支援的執行域(每種作業系統獨特“個性”)資訊清單;
[root@rhel5 ~]# more /proc/execdomains
0-0 Linux [kernel]
2.10、/proc/fb
幀緩沖裝置清單檔案,包含幀緩沖裝置的裝置号和相關驅動資訊;
2.11、/proc/filesystems
目前被核心支援的檔案系統類型清單檔案,被标示為nodev的檔案系統表示不需要塊裝置的支援;通常mount一個裝置時,如果沒有指定檔案系統類型将通過此檔案來決定其所需檔案系統的類型;
[root@rhel5 ~]# more /proc/filesystems
nodev sysfs
nodev rootfs
nodev proc
iso9660
ext3
2.12、/proc/interrupts
X86或X86_64體系架構系統上每個IRQ相關的中斷号清單;多路處理器平台上每個CPU對于每個I/O裝置均有自己的中斷号;
[root@rhel5 ~]# more /proc/interrupts
CPU0
0: 1305421 IO-APIC-edge timer
1: 61 IO-APIC-edge i8042
185: 1068 IO-APIC-level eth0
2.13、/proc/iomem
每個實體裝置上的記憶體(RAM或者ROM)在系統記憶體中的映射資訊;
[root@rhel5 ~]# more /proc/iomem
00000000-0009f7ff : System RAM
0009f800-0009ffff : reserved
000a0000-000bffff : Video RAM area
000c0000-000c7fff : Video ROM
<a></a>
This file shows you the current map of the system's memory for each physical device:
The first column displays the memory registers used by each of the different types of memory. The second column lists the kind of memory located within those registers and displays which memory registers are used by the kernel within the
system RAM or, if the network interface card has multiple Ethernet ports, the memory registers assigned for each port.
/opt/qtmarvell/mvqt # cat /proc/iomem
00000000-0fffffff : System RAM
0002b000-00554fff : Kernel text
00556000-005a22f3 : Kernel data
10000000-1fffffff : System RAM
e0000000-e7ffffff : PEX0 Memory
e0000000-e0003fff : 0000:00:01.0
e0004000-e0004fff : 0000:00:01.0
e8000000-efffffff : PEX1 Memory
f1012100-f10121ff : serial8250.0
f1012100-f101211f : serial
f1090000-f10903ff : mvsdio
f1090000-f10903ff : mvsdio
f10a0000-f10a3fff : mv88fx_snd.0
f10a0000-f10a3fff : mv88fx_snd
f10c0000-f10d0000 : dovefb.0 寄存器位址映射到這個
f10c0000-f10d0000 : dovefb_ovly.0
/opt/qtmarvell/mvqt # ./framebuffer
The framebuffer device was opened successfully.
Fixed screen info:
id: GFX Layer 0
smem_start: 0x12000000
smem_len: 33554432
type: 0
type_aux: 0
visual: 2
xpanstep: 1
ypanstep: 1
ywrapstep: 0
line_length: 2560
mmio_start: 0xf10c0000
mmio_len: 65537
2.14、/proc/ioports
目前正在使用且已經注冊過的與實體裝置進行通訊的輸入-輸出端口範圍資訊清單;如下面所示,第一清單示注冊的I/O端口範圍,其後表示相關的裝置;
[root@rhel5 ~]# less /proc/ioports
0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-006f : keyboard
2.15、/proc/kallsyms
子產品管理工具用來動态連結或綁定可裝載子產品的符号定義,由核心輸出;(核心2.5.71以後的版本支援此功能);通常這個檔案中的資訊量相當大;
[root@rhel5 ~]# more /proc/kallsyms
c04011f0 T _stext
c04011f0 t run_init_process
c04011f0 T stext
2.16、/proc/kcore
系統使用的實體記憶體,以ELF核心檔案(core file)格式存儲,其檔案大小為已使用的實體記憶體(RAM)加上4KB;這個檔案用來檢查核心資料結構的目前狀态,是以,通常由GBD通常調試工具使用,但不能使用檔案檢視指令打開此檔案;
2.17、/proc/kmsg
此檔案用來儲存由核心輸出的資訊,通常由/sbin/klogd或/bin/dmsg等程式使用,不要試圖使用檢視指令打開此檔案;
2.18、/proc/loadavg
儲存關于CPU和磁盤I/O的負載平均值,其前三列分别表示每1秒鐘、每5秒鐘及每15秒的負載平均值,類似于uptime指令輸出的相關資訊;第四列是由斜線隔開的兩個數值,前者表示目前正由核心排程的實體(程序和線程)的數目,後者表示系統目前存活的核心排程實體的數目;第五清單示此檔案被檢視前最近一個由核心建立的程序的PID;
[root@rhel5 ~]# more /proc/loadavg
0.45 0.12 0.04 4/125 5549
[root@rhel5 ~]# uptime
06:00:54 up 1:06, 3 users, load average: 0.45, 0.12, 0.04
2.19、/proc/locks
儲存目前由核心鎖定的檔案的相關資訊,包含核心内部的調試資料;每個鎖定占據一行,且具有一個惟一的編号;如下輸出資訊中每行的第二清單示目前鎖定使用的鎖定類别,POSIX表示目前較新類型的檔案鎖,由lockf系統調用産生,FLOCK是傳統的UNIX檔案鎖,由flock系統調用産生;第三列也通常由兩種類型,ADVISORY表示不允許其他使用者鎖定此檔案,但允許讀取,MANDATORY表示此檔案鎖定期間不允許其他使用者任何形式的通路;
[root@rhel5 ~]# more /proc/locks
1: POSIX ADVISORY WRITE 4904 fd:00:4325393 0 EOF
2: POSIX ADVISORY WRITE 4550 fd:00:2066539 0 EOF
3: FLOCK ADVISORY WRITE 4497 fd:00:2066533 0 EOF
2.20、/proc/mdstat
儲存RAID相關的多塊磁盤的目前狀态資訊,在沒有使用RAID機器上,其顯示為如下狀态:
[root@rhel5 ~]# less /proc/mdstat
Personalities :
unused devices: <none>
2.21、/proc/meminfo
系統中關于目前記憶體的利用狀況等的資訊,常由free指令使用;可以使用檔案檢視指令直接讀取此檔案,其内容顯示為兩列,前者為統計屬性,後者為對應的值;
[root@rhel5 ~]# less /proc/meminfo
MemTotal: 515492 kB
MemFree: 8452 kB
Buffers: 19724 kB
Cached: 376400 kB
SwapCached: 4 kB
2.22、/proc/mounts
在核心2.4.29版本以前,此檔案的内容為系統目前挂載的所有檔案系統,在2.4.19以後的核心中引進了每個程序使用獨立挂載名稱空間的方式,此檔案則随之變成了指向/proc/self/mounts(每個程序自身挂載名稱空間中的所有挂載點清單)檔案的符号連結;/proc/self是一個獨特的目錄,後文中會對此目錄進行介紹;
[root@rhel5 ~]# ll /proc |grep mounts
lrwxrwxrwx 1 root root 11 Feb 8 06:43 mounts -> self/mounts
如下所示,其中第一清單示挂載的裝置,第二清單示在目前目錄樹中的挂載點,第三點表示目前檔案系統的類型,第四清單示挂載屬性(ro或者rw),第五列和第六列用來比對/etc/mtab檔案中的轉儲(dump)屬性;
[root@rhel5 ~]# more /proc/mounts
rootfs / rootfs rw 0 0
/dev/root / ext3 rw,data=ordered 0 0
/dev /dev tmpfs rw 0 0
/proc /proc proc rw 0 0
/sys /sys sysfs rw 0 0
/proc/bus/usb /proc/bus/usb usbfs rw 0 0
2.23、/proc/modules
目前裝入核心的所有子產品名稱清單,可以由lsmod指令使用,也可以直接檢視;如下所示,其中第一清單示子產品名,第二清單示此子產品占用記憶體空間大小,第三清單示此子產品有多少執行個體被裝入,第四清單示此子產品依賴于其它哪些子產品,第五清單示此子產品的裝載狀态(Live:已經裝入;Loading:正在裝入;Unloading:正在解除安裝),第六清單示此子產品在核心記憶體(kernel memory)中的偏移量;
[root@rhel5 ~]# more /proc/modules
autofs4 24517 2 - Live 0xe09f7000
hidp 23105 2 - Live 0xe0a06000
rfcomm 42457 0 - Live 0xe0ab3000
l2cap 29505 10 hidp,rfcomm, Live 0xe0aaa000
2.24、/proc/partitions
塊裝置每個分區的主裝置号(major)和次裝置号(minor)等資訊,同時包括每個分區所包含的塊(block)數目(如下面輸出中第三列所示);
[root@rhel5 ~]# more /proc/partitions
major minor #blocks name
8 0 20971520 sda
8 1 104391 sda1
8 2 6907950 sda2
8 3 5630782 sda3
8 4 1 sda4
8 5 3582463 sda5
2.25、/proc/pci
核心初始化時發現的所有PCI裝置及其配置資訊清單,其配置資訊多為某PCI裝置相關IRQ資訊,可讀性不高,可以用“/sbin/lspci –vb”指令獲得較易了解的相關資訊;在2.6核心以後,此檔案已為/proc/bus/pci目錄及其下的檔案代替;
2.26、/proc/slabinfo
在核心中頻繁使用的對象(如inode、dentry等)都有自己的cache,即slab pool,而/proc/slabinfo檔案列出了這些對象相關slap的資訊;詳情可以參見核心文檔中slapinfo的手冊頁;
[root@rhel5 ~]# more /proc/slabinfo
slabinfo - version: 2.1
# name <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <ac
tive_slabs> <num_slabs> <sharedavail>
rpc_buffers 8 8 2048 2 1 : tunables 24 12 8 : slabdata 4 4 0
rpc_tasks 8 20 192 20 1 : tunables 120 60 8 : slabdata 1 1 0
rpc_inode_cache 6 9 448 9 1 : tunables 54 27 8 : slabdata 1 1 0
2.27、/proc/stat
實時追蹤自系統上次啟動以來的多種統計資訊;如下所示,其中,
“cpu”行後的八個值分别表示以1/100(jiffies)秒為機關的統計值(包括系統運作于使用者模式、低優先級使用者模式,運系統模式、空閑模式、I/O等待模式的時間等);
“intr”行給出中斷的資訊,第一個為自系統啟動以來,發生的所有的中斷的次數;然後每個數對應一個特定的中斷自系統啟動以來所發生的次數;
“ctxt”給出了自系統啟動以來CPU發生的上下文交換的次數。
“btime”給出了從系統啟動到現在為止的時間,機關為秒;
“processes (total_forks) 自系統啟動以來所建立的任務的個數目;
“procs_running”:目前運作隊列的任務的數目;
“procs_blocked”:目前被阻塞的任務的數目;
[root@rhel5 ~]# more /proc/stat
cpu 2751 26 5771 266413 2555 99 411 0
cpu0 2751 26 5771 266413 2555 99 411 0
intr 2810179 2780489 67 0 3 3 0 5 0 1 0 0 0 1707 0 0 9620 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 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 0 0 0 0 0 0 0 0 0 0 0 5504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12781 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 427300
btime 1234084100
processes 3491
procs_running 1
procs_blocked 0
2.28、/proc/swaps
目前系統上的交換分區及其空間利用資訊,如果有多個交換分區的話,則會每個交換分區的資訊分别存儲于/proc/swap目錄中的單獨檔案中,而其優先級數字越低,被使用到的可能性越大;下面是作者系統中隻有一個交換分區時的輸出資訊;
[root@rhel5 ~]# more /proc/swaps
Filename Type Size Used Priority
/dev/sda8 partition 642560 0 -1
2.29、/proc/uptime
系統上次啟動以來的運作時間,如下所示,其第一個數字表示系統運作時間,第二個數字表示系統空閑時間,機關是秒;
[root@rhel5 ~]# more /proc/uptime
3809.86 3714.13
2.30、/proc/version
目前系統運作的核心版本号,在作者的RHEL5.3上還會顯示系統安裝的gcc版本,如下所示;
[root@rhel5 ~]# more /proc/version
Linux version 2.6.18-128.el5 ([email protected]) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)) #1 SMP Wed Dec 17 11:42:39 EST 2008
2.31、/proc/vmstat
目前系統虛拟記憶體的多種統計資料,資訊量可能會比較大,這因系統而有所不同,可讀性較好;下面為作者機器上輸出資訊的一個片段;(2.6以後的核心支援此檔案)
[root@rhel5 ~]# more /proc/vmstat
nr_anon_pages 22270
nr_mapped 8542
nr_file_pages 47706
nr_slab 4720
nr_page_table_pages 897
nr_dirty 21
nr_writeback 0
2.32、/proc/zoneinfo
記憶體區域(zone)的詳細資訊清單,資訊量較大,下面列出的是一個輸出片段:
[root@rhel5 ~]# more /proc/zoneinfo
Node 0, zone DMA
pages free 1208
min 28
low 35
high 42
active 439
inactive 1139
scanned 0 (a: 7 i: 30)
spanned 4096
present 4096
nr_anon_pages 192
nr_mapped 141
nr_file_pages 1385
nr_slab 253
nr_page_table_pages 2
nr_dirty 523
nr_writeback 0
nr_unstable 0
nr_bounce 0
protection: (0, 0, 296, 296)
pagesets
all_unreclaimable: 0
prev_priority: 12
start_pfn: 0
三、/proc/sys目錄詳解
與 /proc下其它檔案的“隻讀”屬性不同的是,管理者可對/proc/sys子目錄中的許多檔案内容進行修改以更改核心的運作特性,事先可以使用“ls -l”指令檢視某檔案是否“可寫入”。寫入操作通常使用類似于“echo DATA > /path/to/your/filename”的格式進行。需要注意的是,即使檔案可寫,其一般也不可以使用編輯器進行編輯。
3.1、/proc/sys/debug 子目錄
此目錄通常是一空目錄;
3.2、/proc/sys/dev 子目錄
為系統上特殊裝置提供參數資訊檔案的目錄,其不同裝置的資訊檔案分别存儲于不同的子目錄中,如大多數系統上都會具有的/proc/sys/dev /cdrom和/proc/sys/dev/raid(如果核心編譯時開啟了支援raid的功能) 目錄,其記憶體儲的通常是系統上cdrom和raid的相關參數資訊檔案。
四、綜合了解
這個是轉貼,希望給大家提供幫助,更好地了解/proc檔案系統)
不隻一次的有人問我關于/proc檔案系統,那是什麼,那些巨大的檔案在那裡做什麼?我可以删除它們嗎?本文将詳細介紹/proc檔案系統,描述一些工具,你可以通過這些工具領略/proc的威力。最後有一個例子程式,示範了系統管理者如何與/proc互動。
◆ 介紹/proc
在過去那些糟糕的日子裡,隻能通過直接通路核心記憶體(/dev/kmem)擷取程序資料,比如運作ps(1)指令時。為了實作這種通路,需要超級使用者權限,而且步驟相當複雜。Sun公司從UNIX SVR4開始解決了程序資料通路問題,現在,可以簡單地通過/proc通路程序資料。
/proc檔案系統不是普通意義上的檔案系統,它是一個到運作中程序位址空間的通路接口。通過/proc,可以用标準Unix系統調用(比如open()、read()、write()、ioctl()等等)通路程序位址空間。事實上,Solaris ps(1)指令正是利用/proc擷取程序狀态。
S (l) 程序狀态:
O 正在運作
S 休眠: 程序正在等待某個事件發生/完成
R 可運作: 程序位于運作隊列中
Z 僵屍狀态: 程序結束了,但是其父程序未處理SIGCHLD信号
T 程序暫停: 可能是任務控制信号所緻,或者正在被
跟蹤調試
/proc下的大檔案對應運作中程序的位址空間,不是标準Unix檔案。事實上每個檔案名對應運作中程序的PID,檔案屬主、屬組對應程序擁有者的real-uid和primary-gid。權限控制與普通Unix檔案一樣。檔案大小是最令人迷惑的地方,事實上相當好了解,對應程序記憶體映像大小,并不真正占用硬碟空間,是以你不必擔心空間浪費的問題。不要企圖删除這些檔案!觀察圖A中列舉的/proc例子:
--------------------------------------------------------------------------
$ ls -l /proc
total 43384
-rw------- 1 root root 0 Apr 2 20:07 00000
-rw------- 1 root root 393216 Apr 2 20:07 00001
-rw------- 1 root root 0 Apr 2 20:07 00002
-rw------- 1 root root 0 Apr 2 20:07 00003
-rw------- 1 root root 1695744 Apr 2 20:07 00081
-rw------- 1 root root 1597440 Apr 2 20:07 00083
-rw------- 1 root root 1777664 Apr 2 20:08 00096
-rw------- 1 root root 1683456 Apr 2 20:08 00099
-rw------- 1 root root 1589248 Apr 2 20:08 00101
-rw------- 1 root root 1445888 Apr 2 20:08 00116
-rw------- 1 root root 1404928 Apr 2 20:08 00126
-rw------- 1 root root 798720 Apr 2 20:08 00135
-rw------- 1 root root 1368064 Apr 2 20:08 00195
-rw------- 1 root root 1585152 Apr 2 20:08 00197
-rw------- 1 root root 1368064 Apr 2 20:08 00200
-rw------- 1 root other 225280 Apr 2 20:08 00201
-rw------- 1 root root 1454080 Apr 2 20:08 00203
-rw------- 1 root root 1519616 Apr 2 20:14 00243
-rw------- 1 rthomas wheel 1499136 Apr 2 20:14 00245
-rw------- 1 rthomas wheel 806912 Apr 2 20:16 00261
$
圖A: /proc例子
操作/proc下檔案的方式和操作普通Unix檔案一樣,可以使用所有你熟悉的系統調用,包括ioctl()。在核心中,針對/proc下檔案的vnode操作被轉向procfs。這意味着操作vnode的系統調用(比如lookuppn())實際上最終轉向procfs-savvy系統調用(比如prlookup())。
◆ /proc能告訴我什麼
Solaris下使用/proc的工具相當完善,位于/usr/proc/bin目錄中。這些工具提供了一種通路任意指定程序臨界資料的簡捷辦法。比如,想知道一個程序已經打開了多少檔案,你可以使用crash(1M)(見鬼,我不會),但是你是root嗎?不必擔心,可以用/usr/proc/bin/pfiles擷取這種資訊,圖B示範了pfiles(1)指令的使用:
[scz@ /export/home/scz]>; ps
PID TTY TIME CMD
637 pts/3 0:00 bash
[scz@ /export/home/scz]>; pfiles 637
637: -bash
Current rlimit: 64 file descriptors
0: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3
O_RDWR
1: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3
2: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3
3: S_IFDOOR mode:0444 dev:191,0 ino:1618164880 uid:0 gid:0 size:0
O_RDONLY|O_LARGEFILE FD_CLOEXEC door to nscd[213]
63: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3
O_RDWR FD_CLOEXEC
[scz@ /export/home/scz]>;
圖B: 使用pfiles(1)指令
正如上面示範的,/usr/proc/bin下的指令使用很簡單,隻需要在指令行上指定PID。然而,留心權限許可設定,與所有普通Unix檔案一樣,你無權通路那些權限設定上禁止通路的指定PID的程序資料。
花點時間看看proc(1)手冊頁,熟悉其中介紹的指令,你将學會列舉指定程序相關的庫、程序信号設定、程序信任設定,你甚至可以暫停、重新開機程序。
◆ 編寫/proc工具
/proc的魅力在于它包含了你可能想知道的關于一個程序的任何資訊,你隻需要簡單地從中擷取。/usr/include/sys/procfs.h檔案中定義了兩個結構,prstatus和prpsinfo,從中可以擷取指定程序的很多資訊。下面是個例子,開發者想知道他的應用程式究竟占用了多少記憶體。簡單!ls /proc就可以知道了。但是,他還想知道更多細節,他需要知道總的映像大小、常駐部分的大小、堆區(heap)大小、棧區(stack)大小。此外,他希望能夠定期跟蹤這些資料資訊,類似vmstat(1M)那種方式。如上所述,聽起來象是一個令人生畏的任務。
譯者: Solaris 2.6開始這兩個結構定義在/usr/include/sys/old_procfs.h檔案中
然而,通過使用/proc檔案系統,我們可以使這項程式設計挑戰變得容易些。我們寫的這個工具稱做memlook,将顯示指定PID對應的記憶體統計資訊。此外,可以在指令行上指定一個時間間隔,以便定期重新檢測記憶體利用資訊。圖C示範了一次簡單的輸出:
$ memlook 245
PID IMAGE RSS HEAP STACK
245 1499136 1044480 24581 8192
圖C: memlook的輸出舉例
下面是memlook.c的源代碼
/*
* @(#)memlook.c 1.0 10 Nov 1997
* Robert Owen Thomas [email][email protected][/email]
* memlook.c -- A process memory utilization reporting tool.
*
* gcc -Wall -O3 -o memlook memlook.c
*/
#pragma ident "@(#)memlook.c 1.0 10 Nov 1997 Robert Owen Thomas [email][email protected][/email]"
#include <stdio.h>;
#include <stdlib.h>;
#include <sys/types.h>;
#include <sys/stat.h>;
#include <sys/signal.h>;
#include <sys/syscall.h>;
#include <sys/procfs.h>;
#include <sys/param.h>;
#include <unistd.h>;
#include <fcntl.h>;
int counter = 10;
int showUsage ( const char * );
void getInfo ( int, int );
int main ( int argc, char * argv[] )
{
int fd, pid, timeloop = 0;
char pidpath[BUFSIZ]; /* /usr/include/stdio.h: #define BUFSIZ 1024 */
switch ( argc )
{
case 2:
break;
case 3:
timeloop = atoi( argv[2] );
default:
showUsage( argv[0] );
} /* end of switch */
pid = atoi( argv[1] );
sprintf( pidpath, "/proc/%-d", pid ); /* -表示向左靠 */
if ( ( fd = open( pidpath, O_RDONLY ) ) < 0 )
perror( pidpath );
exit( 1 );
}
if ( 0 < timeloop )
for ( ; ; )
{
getInfo( fd, pid );
sleep( timeloop );
}
getInfo( fd, pid );
close( fd );
exit( 0 );
} /* end of main */
int showUsage ( const char * progname )
fprintf( stderr, "%s: usage: %s < PID >; [time delay]\n", progname, progname );
exit( 3 );
} /* end of showUsage */
void getInfo ( int fd, int pid )
prpsinfo_t prp;
prstatus_t prs;
if ( ioctl( fd, PIOCPSINFO, &prp ) < 0 )
perror( "ioctl" );
exit( 5 );
if ( ioctl( fd, PIOCSTATUS, &prs ) < 0 )
exit( 7 );
if ( counter >; 9 )
fprintf( stdout, "PID\tIMAGE\t\tRSS\t\tHEAP\t\tSTACK\n" );
counter = 0;
fprintf( stdout, "%u\t%-9u\t%-9u\t%-15u\t%-15u\n", pid,
( unsigned int )prp.pr_bysize, ( unsigned int )prp.pr_byrssize,
( unsigned int )prs.pr_brksize, ( unsigned int )prs.pr_stksize );
counter++;
} /* end of getInfo */
譯者: 作者這裡利用了ioctl(),而不是直接讀取/proc下檔案,這樣做的好處在于即使系統更新後/proc布局改變,核心中相應ioctl cmd支援也随之改變,對于應用層的開發者,接口一樣,源代碼可平穩移植。事實上從作者前面舉例來看, memlook.c是在Solaris 2.6以前的版本上開發的,但我并未修改就可以直接用在Solaris 2.6上,雖然此時/proc布局已經發生重大變化。
仔細閱讀prstatus和prpsinfo結構,尋找那些你敢興趣的成員。在未能真正掌握這種技術之前不要針對/proc檔案系統使用write()或者ioctl()。針對特定程序胡亂做write()調用,結果未知。
◆ 結論
當痛苦調試程式或者試圖擷取指定程序狀态的時候,/proc檔案系統将是你強有力的支援者。通過它可以建立更強大的工具,擷取更多資訊。
:em02: :em02: :em02: :em02: :em02: :em02:
1、從/proc檔案系統擷取相關的性能參數
cpu使用率:/proc/stat
記憶體使用情況: /proc/meminfo
網絡負載資訊:/proc/net/dev
相應的計算方法:(摘自:什麼是proc檔案系統)
(1) 處理器使用率
(2) 記憶體使用率
(3) 流入流出資料包
(4) 整體網絡負載
這些資料分别要從/proc/stat、/proc/net/dev、/proc/meminfo三個檔案中提取。如裡有問題或對要提取的資料不太清楚,可以使用man proc來檢視proc檔案系統的聯機手冊。
這裡要從/proc/stat中提取四個資料:使用者模式(user)、低優先級的使用者模式(nice)、核心模式(system)以及空閑的處理器時間(idle)。它們均位于/proc/stat檔案的第一行。CPU的使用率使用如下公式來計算。
CPU使用率 = 100 *(user + nice + system)/(user + nice + system + idle)
這裡需要從/proc/meminfo檔案中提取兩個資料,目前記憶體的使用量(cmem)以及記憶體總量(amem)。
記憶體使用百分比 = 100 * (cmem / umem)
(3)網絡使用率
為了得到網絡使用率的相關資料,需要從/proc/net/dev檔案中獲得兩個資料:從本機輸出的資料包數,流入本機的資料包數。它們都位于這個檔案的第四行。
性能收集程式開始記錄下這兩個資料的初始值,以後每次獲得這個值後均減去這個初始值即為從叢集啟動開始從本節點通過的資料包。
利用上述資料計算出網絡的平均負載,方法如下:
平均網絡負載 = (輸出的資料包+流入的資料包) / 2
2. 通過/proc檔案系統調整相關的核心配置
允許ip轉發 /proc/sys/net/ipv4/ip_forward
禁止ping/proc/sys/net/ipv4/icmp_echo_ignore_all
可以在指令行下直接往上述兩個“檔案”裡頭寫入"1"來實作相關配置,如果寫入"0"将取消相關配置。不過在系統重新開機以後,這些配置将恢複預設設定,是以,如果想讓這些修改生效,可以把下面的配置直接寫入/etc/profile檔案,或者其他随系統啟動而執行的程式檔案中。
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
如果需要擷取其他的性能參數,或者需要對核心進行更多的配置,可以參考proc檔案系統介紹,也可以直接通過man proc檢視相關的資訊。