本文以CentOS系統(tǒng)為例抛虏,但同樣適用于Linux的其他發(fā)行版。不需要糾結于具體的版本套才,了解設計意圖即可迂猴。
本文隨時更新。除勘誤外背伴,不另做批注沸毁。
概覽
- 圓型節(jié)點代指目錄,方型節(jié)點代指文件傻寂。
- 圖中省去了很多不常用的目錄與文件息尺。
- 稍后單獨講
/proc
目錄與/var
目錄。
Linux將整個文件系統(tǒng)看做一棵樹疾掰,這棵樹的樹根叫做根文件系統(tǒng)搂誉,用"/"表示。
目錄 | 內容 | 舉例 |
---|---|---|
/bin | 供所有用戶使用的完成基本維護任務的命令 | ls, cp |
/etc | 系統(tǒng)和應用軟件的配置文件 | bashrc, passwd |
/home | 普通用戶的家目錄 | /home/msh |
/lib | 系統(tǒng)最基本的共享鏈接庫和內核模塊 | libc-2.17.so |
/root | root用戶的家目錄 | .bashrc, .ssh |
/sbin | 超級用戶使用的可執(zhí)行文件静檬,里面多是系統(tǒng)管理命令 | ifconfig, iptables |
/tmp | 存儲臨時文件 |
/usr
目錄的目錄結構與根目錄相似勒葱,但根目錄中的文件多是系統(tǒng)級的文件,而/usr
目錄中是用戶級的文件巴柿,一般與具體的系統(tǒng)無關凛虽。
目錄 | 內容 | 舉例 |
---|---|---|
/usr/bin | 多數(shù)日常應用程序存放的位置 | yum, git |
/usr/include | C/C++頭文件 | ctype.h |
/usr/lib | 普通用戶使用的庫文件 | mysql的庫文件 |
/usr/local | 個人安裝的軟件,通常需要手動指定广恢;與"/usr"目錄的目錄結構相似 | |
/usr/sbin | 超級用戶不需要的系統(tǒng)管理程序 | useradd |
重中之重
/proc目錄
/proc
目錄掛載了一個虛擬文件系統(tǒng)
凯旋,以虛擬文件
的形式映射系統(tǒng)與進程在內存中的運行時信息。
系統(tǒng)信息
/proc
下的直接子目錄通常存儲系統(tǒng)信息。猴子常用的只有兩個:
目錄 | 內容 | 舉例 |
---|---|---|
/proc/cpuinfo | 處理器的相關信息 | physical id至非、cpu cores钠署、siblings、processor |
/proc/version | 系統(tǒng)的內核版本號 | Linux version 3.10.0 |
/proc/version
確定內核版本號和CPU架構(如i686)荒椭;/etc/centos-release
確定發(fā)行版本號(其他發(fā)行版類似)谐鼎。
uname -a
與cat /proc/version
的作用類似。
進程信息
重點是/proc/<pid>
目錄映射的進程信息趣惠。以rsyslogd進程為例:
目錄 | 內容 | 舉例 |
---|---|---|
/proc/<pid>/cmdline |
啟動當前進程的完整命令 | /usr/sbin/rsyslogd-n |
/proc/<pid>/cwd |
當前進程工作目錄的軟鏈 | cwd -> / |
/proc/<pid>/environ |
當前進程的環(huán)境變量列表 | LANG=zh_CN.UTF-8 |
/proc/<pid>/exe |
啟動當前進程的可執(zhí)行文件的軟鏈 | exe -> /usr/sbin/rsyslogd |
/proc/<pid>/fd |
目錄狸棍,保存當前進程持有的文件描述符(以軟鏈形式存在,指向實際文件) | 2 -> /dev/null 6 -> /var/log/messages |
/proc/<pid>/limits |
當前進程使用資源的軟限制味悄、硬限制(和單位) | open files(默認軟限制1024) |
/proc/<pid>/task |
目錄草戈,保存當前進程所運行的每一個線程的相關信息;以<tid> 作為各線程的目錄名侍瑟,目錄結構與/proc/<pid> 相似 |
1037唐片、1050、1051 |
補充幾點:
- 通過ulimit來查看或修改當前進程的資源限制涨颜。
- 軟限制可以由進程自己在任何時間修改费韭;硬限制只能使用root權限修改。
- Linux上進程與線程的關系參考淺談linux線程模型和線程切換庭瑰。
/var目錄
/var
目錄存放數(shù)據(jù)文件揽思,如程序數(shù)據(jù)、日志等见擦;但線上通常只將日志放在/var
目錄。
系統(tǒng)日志/var/log/messages
通過rsyslog記錄系統(tǒng)級日志羹令,配置文件為/etc/rsyslog.conf
鲤屡。重點看/var/log/messages
的配置:
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info
表示所有服務大于等于info優(yōu)先級的信息都會記錄到/var/log/messages
中;
mail.none
表示不記錄任何mail的信息到/var/log/messages
中福侈。
以上配置表示:除安全認證酒来、郵件、定時任務外肪凛,輸出到stdout堰汉、stderr的info及更高級別的日志記錄在/var/log/messages
中。
OOM kill
猴子利用/var/log/messages
定位過一次OOM kill問題伟墙。
一個用戶經(jīng)常抱怨自己的app提到Yarn后翘鸭,container各種exit 137然后重試。假設框架不會自己exit 137玩戳葵,那么通常137代表container是因為kill -9退出就乓,于是mentor提示猴子可能因為OOM kill。要驗證這個想法,必須找到“相關container被OOM kill的痕跡”生蚁。
Linux會監(jiān)控內存使用情況噩翠,當內存不足的時候,OOM killer計算進程的優(yōu)先級邦投,殺死優(yōu)先級最高的進程釋放內存伤锚。而Yarn集群普遍會配置資源超發(fā)(Linux系統(tǒng)本身也存在內存超發(fā)),當集群資源緊張的時候志衣,大container很容易被OOM kill屯援。
OOM kill的三個步驟“發(fā)現(xiàn)內存不足”、“計算優(yōu)先級”蠢涝、“選擇進程kill”玄呛,都會記錄在/var/log/messages
中,猴子確實在用戶給定的時間點附近找到了對應container的OOM kill日志和二,內存也與container申請的資源相近徘铝。
得證。
判斷過程中存在一些小問題:
- 猴子根據(jù)container被OOM kill的時間點和內存判斷是否是目標進程惯吕,未嚴格確定惕它。
個人使用時的建議
對于本文的理解,讀者不必關心不同發(fā)行版本废登、內核版本之間的區(qū)別淹魄。
對,是存在區(qū)別的堡距。如:CentOS 6.5可驗證得本文即將講解的目錄結構甲锡;但CentOS 7.2中,
/bin
等所謂“系統(tǒng)級目錄”都被軟鏈到了/usr/bin
等所謂“用戶級目錄”羽戒。其他發(fā)行版如Debian可能差別更大缤沦。
如果非要追究的話,一般建議將所有用戶共享的軟件安裝到/usr/local
目錄(結構與/usr
目錄相似)下易稠,將用戶私有的軟件安裝到用戶自己的家目錄缸废。
參考:
本文鏈接:Linux文件系統(tǒng)目錄結構
作者:猴子007
出處:https://monkeysayhi.github.io
本文基于 知識共享署名-相同方式共享 4.0 國際許可協(xié)議發(fā)布,歡迎轉載驶社,演繹或用于商業(yè)目的企量,但是必須保留本文的署名及鏈接。