由於自己Linux系統知識基礎比較薄弱,准備比較全面學習,准備從/proc這個目錄開始。實際上這個目錄也基本上記錄所有系統運行時和內核的一些信息,所以如果想對linux系統有一個比較全面的了解,從/proc入手應該是個不錯的選擇。准備將自己學習的過程記錄下來,分享給同樣需要的朋友,也便於以後查閱。今天准備介紹一下/proc/pid這個目錄到底是做什麼用的,它到底記錄了哪些信息。
cd /proc/之後,你會發現很多的目錄和文件,今天首先來介紹的就是那些以數字命名的目錄--它們就是linux中的進程號,每當你創建一個進程時,裡面就會動態更新多出一個名稱為pid的目錄,然後你ls -l /proc/pid會發現如下信息:
dr-xr-xr-x 2 user group 0 Sep 19 16:17 attr
-r-------- 1 user group 0 Sep 19 16:17 auxv
-r--r--r-- 1 user group 0 Sep 19 16:17 cgroup
--w------- 1 user group 0 Sep 19 16:17 clear_refs
-r--r--r-- 1 user group 0 Sep 18 14:18 cmdline
-rw-r--r-- 1 user group 0 Sep 19 16:17 coredump_filter
-r--r--r-- 1 user group 0 Sep 19 16:17 cpuset
lrwxrwxrwx 1 user group 0 Sep 19 16:17 cwd -> /home/user/zbs/mysql/node-2
-r-------- 1 user group 0 Sep 19 16:17 environ
lrwxrwxrwx 1 user group 0 Sep 19 16:17 exe -> /home/user/zbs/xtradb-5.1.47_group/libexec/mysqld
dr-x------ 2 user group 0 Sep 18 14:38 fd
dr-x------ 2 user group 0 Sep 19 16:17 fdinfo
-r-------- 1 user group 0 Sep 19 16:17 io
-r-------- 1 user group 0 Sep 19 16:17 limits
-rw-r--r-- 1 user group 0 Sep 19 16:17 loginuid
-r--r--r-- 1 user group 0 Sep 19 16:17 maps
-rw------- 1 user group 0 Sep 19 16:17 mem
-r--r--r-- 1 user group 0 Sep 19 16:17 mountinfo
-r--r--r-- 1 user group 0 Sep 19 16:17 mounts
-r-------- 1 user group 0 Sep 19 16:17 mountstats
dr-xr-xr-x 10 user group 0 Sep 19 16:17 net
-r--r--r-- 1 user group 0 Sep 19 16:17 numa_maps
-rw-r--r-- 1 user group 0 Sep 19 16:17 oom_adj
-r--r--r-- 1 user group 0 Sep 19 16:17 oom_score
-r--r--r-- 1 user group 0 Sep 19 16:17 pagemap
-r--r--r-- 1 user group 0 Sep 19 16:17 personality
lrwxrwxrwx 1 user group 0 Sep 19 16:17 root -> /
-rw-r--r-- 1 user group 0 Sep 19 16:17 sched
-r--r--r-- 1 user group 0 Sep 19 16:17 sessionid
-r--r--r-- 1 user group 0 Sep 19 16:17 smaps
-r--r--r-- 1 user group 0 Sep 19 16:17 stack
-r--r--r-- 1 user group 0 Sep 18 14:18 stat
-r--r--r-- 1 user group 0 Sep 18 14:18 statm
-r--r--r-- 1 user group 0 Sep 18 14:18 status
-r--r--r-- 1 user group 0 Sep 19 16:17 syscall
dr-xr-xr-x 20 user group 0 Sep 19 16:17 task
下面我們挑常用的來解釋(用紅色標注出)
cmdline:這個主要是當前這個進程被運行時的command line,裡面包括了運行時指定的一些參數,比如如果是mysqld的話就包括basedir==,datadir==,port=,socket=等等信息,你可以自己嘗試一下。
cwd:current working directory,當前的工作目錄
environ:這是個比較有用的文件,裡面記錄了當前進程的一些環境變量,比如一台機器上對同一個系統起多個實例(當然是不同端口、不同數據目錄),而你想知道哪個進程對應的是在哪個數據目錄起來的(可能是因為你想kill-9其中一個實例,因為你怕弄錯,所以的確定哪個進程是對應哪個數據目錄),那麼此時你該怎麼辦呢?兩者方法:1.strings /proc/pid/environ | grep PWD 2.tr \\0 \\n < /proc/pid/envrion | grep PWD 即可。當然裡面還有很多的信息,你可以自己嘗試。
exe:這個就是氣這個進程的執行文件
fd:進程打開的文件描述符,我記得以前有人使用mysql遇到過two many openfiles的錯誤,這個就是打開太多的文件導致的,當然你如果只修改mysql裡面的參數可能不會起作用,因為可能os上設置了一個比較小的數,所以要兩者都調大。
fdinfo:跟上面一個一樣,只不過只有文件描述符的值,沒有表示這個文件描述符是對應打開的哪個文件。在/proc很多時候都是這樣維護的:可能兩個文件裡面要表示的信息是一樣的,但是有一個一般是以人能容易讀懂的格式給出。
limits:這個跟fd有一點關聯,因為這個裡面限制了進程對系統資源的使用額度,比如前面說的你可以打開多少文件,具體的設定你可以修改這個文件/etc/securiry/limits.conf,裡面也對每一項說得很清楚,只要會點E文,理解應該沒問題
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。
stat/status:這兩者要表示的信息都是一樣的,進程的基本狀態,但是後一個是以人容易讀懂的格式給出,怎麼分析前者stat的內容-->見這裡。
這裡順便提一個問題?我們遇到過通過查看stat裡面的CPU time spent in user code(第14個值)這個值是0,不知道是什麼原因導致的,有誰知道請留個言告訴一下
當然你會發現我還有很多的項沒介紹?最主要的原因是有些我也不懂,其次,對於新手了解這些最常用的應該暫時足夠了,等以後自己對它了解了再慢慢更新上來。當然如果你了解那些我沒提到的目錄、文件,歡迎大家留言互相交流~
參考文章:
1. http://www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html