Troubleshooting(二):進程

前言

    服務器的意義就在於這些運行中的進程,這也是工做圍繞的重點之一。前端

    在 Linux 和 Unix 中(Windows Server 基本沒接觸過)進程一般被定義爲程序執行時的一個實例,每一個進程都有一個自身的進程描述符,裏面詳細記錄了關於進程的一切。linux

     Liunx 中查看進程狀態的命令也大都圍繞着這個進程描述符的,和 TCP 協議同樣,每一個域都有自身的含義,前輩們的設計理念仍是很統一而高效的!   docker

    PS:關於進程描述符和比較偏底層的就不在這裏詳細介紹了,本人理解有限,傳送門:《深刻理解 Linux 內核》shell

 

進程狀態

  •     ps

    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 樹裝顯示(實在很雞肋,僅用空格肉眼實在很差分辨)

 

  • pstree

    以樹狀結構顯示進程,ps -H 的加強版。

 

  • pstack

    相似於 stack 命令,用於進程的棧跟蹤,顯示系統調用,偏底層,對於內功修煉頗有幫助。

 

  • kill

    終止指定進程,kill 命令經過向進程發送指定的信號來結束相應進程的,默認採用 15 SIGTERM 的信號,-l 參數能夠列出所有信號編號參數(含義可自行查找),經常使用的 HUP 1 終端斷線、INT 2 中斷、QUIT 3 退出、TERM 15 終止、KILL 9 強制終止、CONT 18 繼續(與  STOP 相反)、STOP 19 暫停(同 Ctrl + z)

 

  • top/htop

    又一個 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/renice

    nice [OPTION] [command [arguments...]]

    調整進程運行的優先級,提升進程的優先級,內核會分配更多 CPU 時間片給這個進程,默認狀況下進程是以 0 的優先級啓動的,top 中 NI(nice value)列展現了進程的優先級狀況,範圍爲 -20 ~ 19,值越低,優先級越高。

    renice 相似於 nice,-u -g 選項可指定用戶和組來改變進程優先級。

 

  • ulimit

    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

    cgroups(Control Groups)最初叫Process Container,由Google工程師(Paul Menage和Rohit Seth)於2006年提出,後來由於Container有多重含義容易引發誤解,就在2007年改名爲Control Groups,並被整合進Linux內核。顧名思義就是把進程放到一個組裏面統一加以控制。ps:偷懶摘下維基百科

    最近很火的 docker 就是使用 cgroups 來管理 container 的資源的,linux 下重量級的資源管理框架,配上好的前端簡直能夠把配置系統資源這麼抽象而微觀的事情,變成一件可視化精細度很高的一件事,因爲小的項目不多關注資源限制,因此大都用不上,不過不可否定它的強大。

    後續單獨博客整理

 

  • pgrep

    經過進程號全局正則匹配,pgrep 掃描當前運行的進程,而後按照命令匹配出進程 PID,-u 可指定用戶、-l 顯示進程名稱、-P 指定父進程號、-t 指定開啓進程的終端。

 

  • fg/bg

    fg 和 bg 用來調度正在運行的任務,前臺運行的程序使用 Ctrl-z 能夠掛起這個程序,jobs 命令能夠查看任務,fg 命令能夠把做業調回前臺運行,bg 則能夠把程序調度到後臺,& 用在命令最後,也能夠把這個命令放到後臺執行。

  • nohup

    不掛斷地運行命令,nohup 運行由 command 參數和任何相關的 Arg 參數指定的命令,它會忽略全部掛斷(SIGHUP)信號,從而使的程序接受不到掛斷的信號。

    輸出會附加到當前目錄的 nohup.out 文件中,nohup command & 便可建立一個不掛起的進程到後臺,命令提示 nohup 成功後在終端任意鍵便可回到命令窗口,exit 退出則可安全退出,直接在成功後就關閉終端,會斷掉 session,致使 nohup 的進程被一塊兒 shutdown。

 

  • ipcs

    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 查詢,先記錄,後續有時間研究下

相關文章
相關標籤/搜索