linux學習筆記(實驗樓) 實驗16 linux進程管理

一、實驗介紹

1.1 實驗內容

通過本實驗我們將掌握一些 Linux 所提供的工具來進行進程的查看與控制,掌握這些工具讓我們能在某些進程出現異常的時候及時查看相關的指標,從而解決問題。

1.2 實驗知識點

  • 查看進程的運行狀態
  • 進程的結束控制
  • 進程的執行順序

二、進程的查看

不管在測試的時候、在實際的生產環境中,還是自己的使用過程中,難免會遇到一些進程異常的情況,所以 Linux 為我們提供了一些工具來查看進程的狀態信息。我們可以通過 top 實時的查看進程的狀態,以及系統的一些信息(如 CPU、內存信息等),我們還可以通過 ps 來靜態查看當前的進程信息,同時我們還可以使用 pstree 來查看當前活躍進程的樹形結構。

2.1 top工具的使用

top 是一個在前台執行的程序,所以執行後便進入到這樣的一個交互界面,正是因為交互界面我們才可以實時的獲取到系統與進程的信息。在交互界面中我們可以通過一些指令來操作和篩選。在此之前我們先來了解顯示了哪些信息。

我們看到 top 顯示的第一排,

load average 在 wikipedia 中的解釋是 the system load is a measure of the amount of work that a computer system is doing 也就是對當前 CPU 工作量的度量,具體來說也就是指運行隊列的平均長度,也就是等待 CPU 的平均進程數相關的一個計算值。

我們該如何看待這個load average 數據呢?

假設我們的系統是單 CPU、單內核的,把它比喻成是一條單向的橋,把CPU任務比作汽車。

  • load = 0 的時候意味著這個橋上並沒有車,cpu 沒有任何任務;
  • load < 1 的時候意味著橋上的車並不多,一切都還是很流暢的,cpu 的任務並不多,資源還很充足;
  • load = 1 的時候就意味著橋已經被車給沾滿了,沒有一點空隙,cpu 的已經在全力工作了,所有的資源都被用完了,當然還好,這還在能力範圍之內,只是有點慢而已;
  • load > 1 的時候就意味著不僅僅是橋上已經被車佔滿了,就連橋外都被佔滿了,cpu 已經在全力的工作了,系統資源的用完了,但是還是有大量的進程在請求,在等待。若是這個值大於2,大於3,超過 CPU 工作能力的 2,3。而若是這個值 > 5 說明系統已經在超負荷運作了。【注釋1】

這是單個 CPU 單核的情況,而實際生活中我們需要將得到的這個值除以我們的核數來看。我們可以通過以下的命令來查看 CPU 的個數與核心數

通過上面的指數我們可以得知 load 的臨界值為 1 ,但是在實際生活中,比較有經驗的運維或者系統管理員會將臨界值定為0.7。這裡的指數都是除以核心數以後的值,不要混淆了

  • 若是 load < 0.7 並不會去關注他;
  • 若是 0.7< load < 1 的時候我們就需要稍微關注一下了,雖然還可以應付但是這個值已經離臨界不遠了;
  • 若是 load = 1 的時候我們就需要警惕了,因為這個時候已經沒有更多的資源的了,已經在全力以赴了;
  • 若是 load > 5 的時候系統已經快不行了,這個時候你需要加班解決問題了

通常我們都會先看 15 分鐘的值來看這個大體的趨勢,然後再看 5 分鐘的值對比來看是否有下降的趨勢。

查看 busybox 的代碼可以知道,數據是每 5 秒鐘就檢查一次活躍的進程數,然後計算出該值,然後 load 從 /proc/loadavg 中讀取的。而這個 load 的值是如何計算的呢,這是 load 的計算的源碼

有興趣的朋友可以研究一下,是如何計算的。代碼中的後面這部分相當於它的計算公式

我們回歸正題,來看 top 的第二行數據,基本上第二行是進程的一個情況統計

來看 top 的第三行數據,這一行基本上是 CPU 的一個使用情況的統計了

CPU 利用率是對一個時間段內 CPU 使用狀況的統計,通過這個指標可以看出在某一個時間段內 CPU 被佔用的情況,而 Load Average 是 CPU 的 Load,它所包含的信息不是 CPU 的使用率狀況,而是在一段時間內 CPU 正在處理以及等待 CPU 處理的進程數情況統計信息,這兩個指標並不一樣。

來看 top 的第四行數據,這一行基本上是內存的一個使用情況的統計了:

注意

系統中可用的物理內存最大值並不是 free 這個單一的值,而是 free + buffers + swap 中的 cached 的和

來看 top 的第五行數據,這一行基本上是交換區的一個使用情況的統計了

再下面就是進程的一個情況了

注意

NICE 值叫做靜態優先順序,是用戶空間的一個優先順序值,其取值範圍是-20至19。這個值越小,表示進程」優先順序」越高,而值越大「優先順序」越低。nice值中的 -20 到 19,中 -20 優先順序最高, 0 是默認的值,而 19 優先順序最低

PR 值表示 Priority 值叫動態優先順序,是進程在內核中實際的優先順序值,進程優先順序的取值範圍是通過一個宏定義的,這個宏的名稱是 MAX_PRIO,它的值為 140。Linux 實際上實現了 140 個優先順序範圍,取值範圍是從 0-139,這個值越小,優先順序越高。而這其中的 0 - 99 是實時進程的值,而 100 - 139 是給用戶的。

其中 PR 中的 100 to 139 值部分有這麼一個對應 PR = 20 + (-20 to +19),這裡的 -20 to +19 便是nice值,所以說兩個雖然都是優先順序,而且有千絲萬縷的關係,但是他們的值,他們的作用範圍並不相同

** VIRT **任務所使用的虛擬內存的總數,其中包含所有的代碼,數據,共享庫和被換出 swap空間的頁面等所佔據空間的總數

在上文我們曾經說過 top 是一個前台程序,所以是一個可以交互的

好好的利用 top 能夠很有效的幫助我們觀察到系統的瓶頸所在,或者是系統的問題所在。

2.2 ps工具的使用

ps 也是我們最常用的查看進程的工具之一,我們通過這樣的一個命令來了解一下,他能給我帶來哪些信息

我們來總體了解下會出現哪些信息給我們,這些信息又代表著什麼(更多的 keywords 大家可以通過 man ps 了解)

TPGID欄寫著-1的都是沒有控制終端的進程,也就是守護進程

STAT表示進程的狀態,而進程的狀態有很多,如下表所示

其中的 D 是不能被中斷睡眠的狀態,處在這種狀態的進程不接受外來的任何 signal,所以無法使用 kill 命令殺掉處於D狀態的進程,無論是 kill,kill -9 還是 kill -15,一般處於這種狀態可能是進程 I/O 的時候出問題了。

ps 工具有許多的參數,下面給大家解釋部分常用的參數

使用 -l 參數可以顯示自己這次登陸的 bash 相關的進程信息羅列出來

相對來說我們更加常用下面這個命令,他將會羅列出所有的進程信息

若是查找其中的某個進程的話,我們還可以配合著 grep 和正則表達式一起使用

此外我們還可以查看時,將連同部分的進程呈樹狀顯示出來

當然如果你覺得使用這樣的此時沒有把你想要的信息放在一起,我們也可以是用這樣的命令,來自定義我們所需要的參數顯示

這是一個簡單而又實用的工具,想要更靈活的使用,想要知道更多的參數我們可以使用 man 來獲取更多相關的信息

2.3 pstree工具的使用

通過 pstree 可以很直接的看到相同的進程數量,最主要的還是我們可以看到所有進程之間的相關性。

三、進程的管理

本節將會為大家介紹如何去管理進程的。

3.1 kill命令的掌握

上個實驗中我們講訴了進程之間是如何衍生,之間又有什麼相關性,我們來回顧一下,當一個進程結束的時候或者要異常結束的時候,會向其父進程返回一個或者接收一個 SIGHUP 信號而做出的結束進程或者其他的操作,這個 SIGHUP 信號不僅可以由系統發送,我們可以使用 kill 來發送這個信號來操作進程的結束或者重啟等等。

上節課程我們使用 kill 命令來管理我們的一些 job,這節課我們將嘗試用 kill 來操作下一些不屬於 job 範疇的進程,直接對 pid 下手

3.2進程的順序執行

我們在使用 ps 命令的時候可以看到大部分的進程都是處於休眠的狀態,如果這些進程都被喚醒,那麼該誰最先享受 CPU 的服務,後面的進程又該是一個什麼樣的順序呢?進程調度的隊列又該如何去排列呢?

當然就是靠該進程的優先順序值來判定進程調度的優先順序,而優先順序的值就是上文所提到的 PR 與 nice 來控制與體現了

而 nice 的值我們是可以通過 nice 命令來修改的,而需要注意的是 nice 值可以調整的範圍是 -20 ~ 19,其中 root 有著至高無上的權力,既可以調整自己的進程也可以調整其他用戶的程序,並且是所有的值都可以用,而普通用戶只可以調製屬於自己的進程,並且其使用的範圍只能是 0 ~ 19,因為系統為了避免一般用戶搶佔系統資源而設置的一個限制

我們還可以用 renice 來修改已經存在的進程的優先順序,同樣因為許可權的原因在實驗環境中無法嘗試


推薦閱讀:

TAG:Linux | 實驗樓 | 程序員 |