服務器的意義就在於這些運行中的進程,這也是工做圍繞的重點之一。前端
在 Linux 和 Unix 中(Windows Server 基本沒接觸過)進程一般被定義爲程序執行時的一個實例,每一個進程都有一個自身的進程描述符,裏面詳細記錄了關於進程的一切。linux
Liunx 中查看進程狀態的命令也大都圍繞着這個進程描述符的,和 TCP 協議同樣,每一個域都有自身的含義,前輩們的設計理念仍是很統一而高效的! docker
PS:關於進程描述符和比較偏底層的就不在這裏詳細介紹了,本人理解有限,傳送門:《深刻理解 Linux 內核》shell
ps:Process Status,從字面意思就能夠看出來,這個命令是用來查看進程狀態的。安全
ps 命令列出了當前進程的快照,也就是說它不是動態的顯示這些進程的,僅僅是執行命令那個時刻的進程信息,而在 Linux 中,/proc 目錄就是存放進程相關的文件及目錄,ps 命令也是經過讀取這些文件來顯示的(starce 命令能夠追蹤命令的系統調用 starce ps)。服務器
進程狀態:STATsession
D 不可中斷(一般爲 IO)數據結構
R 正在運行中的進程多線程
S 已經中斷的進程,處於休眠狀態,系統中大部分進程都是這個狀態框架
T 中止或被暫停的進程
W 沒有作夠的內存頁分配
X 已經死掉的進程
Z 殭屍進程,進程已終止,但進程描述符還在,直到父進程調用 wait4() 系統調用後釋放
BSD 風格
< 高優先級進程
N 低優先級進程
L 在內存中被鎖了內存分頁
s 包含子進程
l 多線程進程
+ 前臺運行的進程
VSZ:佔用虛擬內存大小;(Mac 中壓縮後的內存跟這個很像)
RSS:佔用內存大小;
TTY:終端的次要裝置號碼;
經常使用選項: a 顯示現行終端機下全部程序,不區分用戶;
-A -e x 顯示全部程序;
-H 樹裝顯示(實在很雞肋,僅用空格肉眼實在很差分辨)
以樹狀結構顯示進程,ps -H 的加強版。
相似於 stack 命令,用於進程的棧跟蹤,顯示系統調用,偏底層,對於內功修煉頗有幫助。
終止指定進程,kill 命令經過向進程發送指定的信號來結束相應進程的,默認採用 15 SIGTERM 的信號,-l 參數能夠列出所有信號編號參數(含義可自行查找),經常使用的 HUP 1 終端斷線、INT 2 中斷、QUIT 3 退出、TERM 15 終止、KILL 9 強制終止、CONT 18 繼續(與 STOP 相反)、STOP 19 暫停(同 Ctrl + z)
又一個 Linux 經常使用的進程管理工具,在性能分析時能實時顯示各個進程的資源佔用情況,相似於任務管理器。
第一行:任務隊列信息,同 uptime,load average 分別列出一、五、15分鐘的負載數,大於 5 表示超負荷了。
第二行:Tasks,處於某個狀態的進程數;
第三行:cpu 狀態信息,us -- 用戶空間cpu佔用、sy —— 內核空間佔用、ni——改變過優先級的進程佔用、id——空閒cpu、wa——IO等待cpu佔用、hi si 硬軟中斷佔用;
第4、五行:內存狀態、swap 交換分區狀態;
PS:簡單計算可用內存數:第四行 free + 第四行 buff + 第五行 cache
top 還支持交互命令的方式,h 可顯示幫助信息,q 爲退出,r 可調整進程的優先級。
htop 相似於 top,默認是沒有安裝的,展現效果更好,由於命令大都是 F1~F10,mac 上按鍵不方便,用的較少。
nice [OPTION] [command [arguments...]]
調整進程運行的優先級,提升進程的優先級,內核會分配更多 CPU 時間片給這個進程,默認狀況下進程是以 0 的優先級啓動的,top 中 NI(nice value)列展現了進程的優先級狀況,範圍爲 -20 ~ 19,值越低,優先級越高。
renice 相似於 nice,-u -g 選項可指定用戶和組來改變進程優先級。
ulimit shell 內建命令,調用系統 getrlimit 和 setrlimit API,來改變 resouce limit,從而改變 shell 啓動的進程的 resource limit(子進程繼承)。
在 Linux 中,Resouce limit 指的是在一個進程執行的時候,所得到的資源限制:
內核結構體定義了 rlimit 數據結構:
ulimit 的 -S -H 參數分別對應內核的 soft limit 和 hard limit,hard limit 做爲 soft limit 的上限,當設置了 hard limit 後,soft limit 就不能超過它,不指定這兩個參數的時候,默認同時設置soft 和 hard。
-a 參數可顯示當前的限制設定,-c core 文件的最大值、-f shell 能創建的最大文件、-m 可以使用的內存上限、-n 同時開啓的文件、-t 指定 CPU 使用時間、-u 用戶最多開啓的程序數目。
ulimit 限制程序所能建立的 socket 數量,對於 C/S 模型中的 server 來講,它會爲多個 client 請求建立多個 socket 端口響應,linux建立一個新的socket,實際上也是建立了一個新的文件描述符,經過 ulimit -n來限制程序所能打開的最大文件描述符,可限制socket建立的數量。
ulimit 限制的當前 shell 進程以及其派生的子進程,要想針對具體用戶的資源加以限制,則需經過修改 /etc/security/limit.conf 配置文件來限定:
<domain> <type> <item> <value>
domain表示用戶或組,type 爲soft 和 hard,item表示須要限定的資源(cpu、stack、nofile等)
若是想對整個系統作限制,則須要修改 /proc 的配置文件,/proc/sys/kernel/pid_max、/proc/sys/net/ipv4/ip_local_port_range 等等,經過修改內核的配置文件,來控制系統的資源限制。
cgroups(Control Groups)最初叫Process Container,由Google工程師(Paul Menage和Rohit Seth)於2006年提出,後來由於Container有多重含義容易引發誤解,就在2007年改名爲Control Groups,並被整合進Linux內核。顧名思義就是把進程放到一個組裏面統一加以控制。ps:偷懶摘下維基百科
最近很火的 docker 就是使用 cgroups 來管理 container 的資源的,linux 下重量級的資源管理框架,配上好的前端簡直能夠把配置系統資源這麼抽象而微觀的事情,變成一件可視化精細度很高的一件事,因爲小的項目不多關注資源限制,因此大都用不上,不過不可否定它的強大。
後續單獨博客整理
經過進程號全局正則匹配,pgrep 掃描當前運行的進程,而後按照命令匹配出進程 PID,-u 可指定用戶、-l 顯示進程名稱、-P 指定父進程號、-t 指定開啓進程的終端。
fg 和 bg 用來調度正在運行的任務,前臺運行的程序使用 Ctrl-z 能夠掛起這個程序,jobs 命令能夠查看任務,fg 命令能夠把做業調回前臺運行,bg 則能夠把程序調度到後臺,& 用在命令最後,也能夠把這個命令放到後臺執行。
不掛斷地運行命令,nohup 運行由 command 參數和任何相關的 Arg 參數指定的命令,它會忽略全部掛斷(SIGHUP)信號,從而使的程序接受不到掛斷的信號。
輸出會附加到當前目錄的 nohup.out 文件中,nohup command & 便可建立一個不掛起的進程到後臺,命令提示 nohup 成功後在終端任意鍵便可回到命令窗口,exit 退出則可安全退出,直接在成功後就關閉終端,會斷掉 session,致使 nohup 的進程被一塊兒 shutdown。
ipcs 顯示進程間通訊設施狀態,能夠顯示消息隊列、共享內存和信號量,-m 查看系統使用的 IPC 共享內存資源、-q 系統使用 IPC 消息隊列、-s 系統使用 IPC 信號量資源、-l 查詢系統 IPC 參數限制。
IPC(Inter-process Communication)進程間通訊,指多個進程間相互通訊,交換信息的方法,Linux IPC 基本是從 Unix(System V風格和 BSD 風格)平臺繼承的,支持 POSIX (Portable Operating System Interface 可移植操做系統接口)IPC。
信號是 Linux 系統在必定條件下生產的事件,是一種異步通訊機制,進程不須要執行任何操做來等待信號的到達,信號異步通知接收信號的進程發生了某個事件,而後操做系統會中斷接收到信號的進程的執行,轉而去執行相應的信號處理程序。管道是用來鏈接不一樣進程之間的數據流。
修改系統的 IPC 參數,須要修改 /etc/sysctl.conf 文件,kernel.msgmax、kernel.msgmnb、kernel.msgmni、kernel.shmmax 等參數,sysctl -p 生效。
ps:未搞懂 ipcs,解釋均摘自 google 查詢,先記錄,後續有時間研究下。