天天看點

linux /proc/pid程序資訊說明

/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更詳細的記憶體映象資訊。如中間一段:

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 不太清楚。

繼續閱讀