Linux進程管理


Linux進程管理

1.進程基本概述

進程是已啟動的可執行程序的運行中實例。

/proc目錄下以數字為名的目錄,每一個目錄代表一個進程,保存着進程的屬性信息。每一個進程的PID是唯一的,就算進程退出了,其它進程也不會占用其PID。

1.1.進程的組成部分

已分配內存的地址空間
安全屬性,包括所有權憑據和特權
程序代碼的一個或多個執行線程
進程狀態

1.2.進程的環境

本地和全局變量
當前調度上下文
分配的系統資源,如文件描述符和網絡端口

1.3.進程的產生

現有的(父)進程復制自己的地址空間(fork)來創建一個新的(子)進程結構。
每個新進程分配有一個唯一的進程ID(PID),滿足跟蹤和安全性之需。PID與父進程ID(PPID)是新進程環境的元素。
任何進程可創建子進程。所有進程都是第一個系統進程的后代。RHEL7上,第一個系統進程是systemd。

通過fork例程,子進程繼承安全性身份、過去和當前的文件描述符、端口和資源特權、環境變量,以及程序代碼。隨后,子進程可能exec其自己的程序代碼。通常,父進程在子進程運行期間處於睡眠狀態,設置一個在子進程完成時發出信號的請求(wait)。在退出時,子進程可能已經關閉或丟棄了其資源和環境,剩余的部分被稱作僵停。父進程在子進程退出時收到信號而被喚醒,清理剩余結構,然后繼續執行其自己的程序代碼。

1.4.進程的分類

  • 前台進程:與終端相關的進程,通過終端啟動的進程
    注意:也可把在前台啟動的進程送往后台,以守護模式運行
  • 守護進程:daemon,與終端無關的進程(如內核),在系統引導過程中啟動的進程

2.進程狀態

Excuting //運行態
Ready //就緒態,也可以稱作睡眠態
Uninterruptible sleep //不可中斷的睡眠。不可隨時喚醒,只有當IO資源加載成功后才能喚醒
Interruptible sleep //可中斷的睡眠。可隨時喚醒
Zombie //僵屍進程。正常運行結束了,但是不釋放占據的內存
Stopped //停止態,暫停於內存中,但不會被調度,除非手動啟動之
進程睡眠的原因:
當一個執行中的進程,需要加載額外的IO資源的時候,由於IO設備的速度太慢,所以會轉入睡眠狀態等待,交出CPU給其他進程,以免浪費剩余執行時間
在多任務處理操作系統中,每個CPU(或CPU核心)在一個時間點上處理一個進程。在進程運行時,它對CPU時間和資源分配的直接要求會有變化。進程分配有一個狀態,它隨着環境要求而改變。

2.1.Linux進程狀態

標志 內核定義的狀態名稱和描述
R TASK_RUNNING:進程正在CPU上執行,或者正在等待運行。處於運行中(或可運行)狀態時,進程可能正在執行用戶例程或內核例程(系統調用),或者已排隊並就緒
S TASK_INTERRUPTIBLE:進程處於睡眠狀態且正在等待某一條件:硬件請求、系統資源訪問或信號。當事件或信號滿足該條件時,該進程將返回到運行中
D TASK_UNINTERRUPTIBLE:此進程也在睡眠,但與S狀態不同,不會響應傳遞的信號。僅在特定的條件下使用,其中進程中斷可能會導致意外的設備狀態
K TASK_KILLABLE:進程處於睡眠狀態,與不可中斷的D狀態相同,但有所修改,允許等待中的任務通過響應信號而被中斷(徹底退出)。實用程序通常將可中斷的進程顯示為D狀態
T TASK_STOPPED:進程已被停止(暫停),通常是通過用戶或其他進程發出的信號。進程可以通過另一信號返回到運行中狀態,繼續執行(恢復)
T TASK_TRACED:正在被調試的進程也會臨時停止,並且共享同一個T狀態標志
Z EXIT_ZOMBIE:子進程在退出時向父進程發出信號。除進程身份(PID)之外的所有資源都已釋放
X EXIT_DEAD:當父進程清理(獲取)剩余的子進程結構時,進程現在已徹底釋放。此狀態從不會在進程列出實用程序中看到
< 高優先級進程
N 低優先級進程
+ 前台進程組中的進程
多線程進程
s 會話進程首進程

3.進程優先級

3.1.Linux進程調度與多任務

現代計算機系統中既包含每次只能執行一個指令的低端處理器,也包含高性能超級計算機,這些超級計算機每台配備數百個CPU,每個CPU上具有多個核心,它們可以並行執行數以百計的指令。但是所有這些系統往往具有一個共同點:它們需要運行的進程數量總是超出實際具有的核心數。

通過時間分片技術,Linux(和其他操作系統)實際能夠運行的進程數(和線程數)可以超出可用的實際處理單元數。操作系統進程調度程序將在單個核心上的進程之間進行快速切換,從而給用戶一種有多個進程在同時運行的印象。

執行此切換的Linux內核部分稱為進程調度程序。

3.2.進程優先級

進程優先級范圍:0-139,數字越小,優先級越高

  • 0-99:實時優先級,內核調整
  • 100-139:靜態優先級,用戶可控制

進程優先級高的特點:

  • 獲得更多的CPU運行時間
  • 更優先獲得CPU運行的機會

要修改進程的優先級可以通過調整進程的nice值來實現,nice值越小,優先級越高:
nice值的范圍是(-20,19),-20對應100,19對應139

3.3.相對優先級

由於不是每種進程都與其他進程同樣重要,可告知調度程序為不同的進程使用不同的調度策略。常規系統上運行的大多數進程所使用的調度策略稱為SCHED_OTHER(也稱為SCHED_NORMAL),但還有一些其他策略可用於不同的目的。

由於並非所有進程都以同樣的方式創建,可為采用SCHED_NORMAL策略運行的進程指定相對優先級。此優先級稱為進程的nice值。一個進程可以有40種不同級別的nice值。

這些nice級別的范圍是從-20到19。默認情況下,進程將繼承其父進程的nice級別,通常為0

nice級別越高,表示優先級越低(該進程容易將其CPU使用量讓給其他進程)
nice級別越低,表示優先級越高(該進程更加不傾向於讓出CPU)
如果不存在資源爭用(例如當活動進程數少於可用CPU核心數時),即使nice級別高的進程也將仍使用它們可使用的所有可用CPU資源。但當請求CPU時間的進程數超過可用核心數時,nice級別較高的進程將比nice級別較低的進程收到更少的CPU時間

3.4.nice級別與權限

為很占CPU資源的進程設置較低的nice級別可能會對同一系統上運行的其他進程的性能造成負面影響,所以僅允許root用戶設置負nice級別以及降低現有進程的nice級別。

普通非特權用戶僅允許設置正的nice級別。只能對現有進程提升nice級別,而不能降低nice級別。

3.5.進程優先級調整

進程優先級調整:調整nice值

//調整已經啟動的進程的nice值:
renice NI PID(例:renice 3 3704)
//在啟動時指定nice值:(-20,19)
nice -n NI COMMAND

[root@localhost ~]# ps -elF|grep vi
4 S root 730 1 0 80 0 - 24938 poll_s 6196 0 09:13 ? 00:00:00 /usr/bin/VGAuthService -s
4 S root 2427 1409 0 80 0 - 31577 poll_s 1692 0 14:24 pts/0 00:00:00 vi abc
0 S root 2430 2410 0 80 0 - 28169 pipe_w 984 0 14:26 pts/1 00:00:00 grep --color=auto vi
[root@localhost ~]# renice 10 2427
2427 (進程 ID) 舊優先級為 0,新優先級為 10
[root@localhost ~]# ps -elF|grep vi
4 S root 730 1 0 80 0 - 24938 poll_s 6196 0 09:13 ? 00:00:00 /usr/bin/VGAuthService -s
4 S root 2427 1409 0 90 10 - 31577 poll_s 1692 0 14:24 pts/0 00:00:00 vi abc
0 R root 2433 2410 0 80 0 - 28169 - 984 0 14:27 pts/1 00:00:00 grep --color=auto vi
[root@localhost ~]# ls
abc test
[root@localhost ~]# nice -n 19 vi abc

4.進程管理命令

Linux系統各進程的相關信息均保存在/proc/PID目錄下的各文件中

4.1.ps

ps(process state)命令用於列出當前的進程。可以顯示詳細的進程信息,包括:

  • 用戶識別符(UID),它確定進程的特權
  • 唯一進程識別符(PID)
  • CPU和已經花費的實時時間
  • 進程在各種位置上分配的內存數量
  • 進程的位置STDOUT,稱為控制終端
  • 當前的進程狀態

ps支持三種選項格式:

  • UNIX(POSIX)選項,可以分組但必須以連字符開頭
  • BSD 選項,可以分組但不可與連字符同用
  • GNU 長選項,以雙連字符開頭

ps(process state),顯示進程信息。注意事項:

  • 加了[]中括號的,表示內核線程,通常位於頂部
  • exiting或defunct表示僵屍進程
//常用選項:
a       //顯示所有與終端有關的進程
u       //顯示進程是由哪個用戶啟動的
x       //顯示所有與終端無關的進程

-e      //顯示所有進程,與-A效果相同
-l      //以長格式顯示
-F      //顯示更詳細的完整格式的進程信息
-f      //顯示更詳細的完整格式的進程信息
-H      //以進程層級格式顯示進程相關信息
-o      //根據自己的需要選擇要顯示的字段  

//aux結果解析:
    VSZ     //Virtual memory SiZe,虛擬內存集
    RSS     //ReSident Size,常駐內存集
    STAT    //進程狀態
    TIME    //運行時的累積時長
    
//ps命令結果解析:
    NI      //nice值
    PRI     //優先級
    PSR     //進程運行在哪個CPU核心上
    RTPTRIO //實時優先級
    C       //運行的CPU編號
    STIME   //進程的啟動時間
    VSZ     //Virtual memory SiZe,虛擬內存集
    RSS     //ReSident Size,常駐內存集
    STAT    //進程狀態
    TIME    //運行時的累積時長

[root@localhost ~]# ps aux |head 
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 129108 6472 ? Ss 09:13 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0.0 0.0 0 0 ? S 09:13 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 09:13 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 09:13 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 09:13 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 09:13 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R 09:13 0:00 [rcu_sched]
root 10 0.0 0.0 0 0 ? S 09:13 0:00 [watchdog/0]
root 12 0.0 0.0 0 0 ? S 09:13 0:00 [kdevtmpfs]
[root@localhost ~]# ps -elf |head 
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 32277 ep_pol 09:13 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
1 S root 2 0 0 80 0 - 0 kthrea 09:13 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 09:13 ? 00:00:00 [ksoftirqd/0]
1 S root 5 2 0 60 -20 - 0 worker 09:13 ? 00:00:00 [kworker/0:0H]
1 S root 7 2 0 -40 - - 0 smpboo 09:13 ? 00:00:00 [migration/0]
1 S root 8 2 0 80 0 - 0 rcu_gp 09:13 ? 00:00:00 [rcu_bh]
1 R root 9 2 0 80 0 - 0 - 09:13 ? 00:00:00 [rcu_sched]
5 S root 10 2 0 -40 - - 0 smpboo 09:13 ? 00:00:00 [watchdog/0]
5 S root 12 2 0 80 0 - 0 devtmp 09:13 ? 00:00:00 [kdevtmpfs]
[root@localhost ~]# ps -F
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 1409 1405 0 28880 2204 0 09:13 pts/0 00:00:00 -bash
root 2470 1409 0 37766 1784 0 14:41 pts/0 00:00:00 ps -F
[root@localhost ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 1409 1405 0 09:13 pts/0 00:00:00 -bash
root 2471 1409 0 14:41 pts/0 00:00:00 ps -f

4.2.pstree

pstree用於顯示當前系統上的進程樹

[root@localhost ~]# pstree
systemd─┬─NetworkManager─┬─dhclient
        │ └─2*[{NetworkManager}]
        ├─VGAuthService
        ├─agetty
        ├─auditd───{auditd}
        ├─chronyd
        ├─crond
        ├─dbus-daemon───{dbus-daemon}
        ├─firewalld───{firewalld}
        ├─lvmetad
        ├─master─┬─pickup
        │ └─qmgr
        ├─polkitd───5*[{polkitd}]
        ├─rhnsd
        ├─rhsmcertd
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd─┬─sshd───bash───pstree
        │ └─sshd───bash
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        └─vmtoolsd───{vmtoolsd}

4.3.pgrep

以grep風格指定只顯示哪些進程,在當前系統中找符合某些特性的進程。只顯示進程號

[root@localhost ~]# pgrep vi
730
2500
[root@localhost ~]# ps -ef|grep vi
root 730 1 0 09:13 ? 00:00:00 /usr/bin/VGAuthService -s
root 2500 1409 0 14:54 pts/0 00:00:00 vi abc
root 2526 2410 0 15:00 pts/1 00:00:00 grep --color=auto vi

4.4.pidof

根據進程名查找其PID號

[root@localhost ~]# ps -ef|grep vi
root 730 1 0 09:13 ? 00:00:00 /usr/bin/VGAuthService -s
root 2500 1409 0 14:54 pts/0 00:00:00 vi abc
root 2526 2410 0 15:00 pts/1 00:00:00 grep --color=auto vi
[root@localhost ~]# pidof vi
2500

4.5.vmstat

虛擬內存狀態查看命令

//語法:vmstat [options] [delay [count]]
//例:
vmstat 2        //表示每2秒刷新一次
vmstat 2 5      //表示每2秒刷新一次,刷新5次后退出
                        
//常用的選項:
    -s          //顯示內存的統計數據

procs:
    r(running)  //表示等待運行的隊列長度,也即等待運行的進程的個數
    b(block)    //表示阻塞隊列長度,也即處於不可中斷睡眠態的進程個數
memory:
    swpd        //交換內存的使用總量
    free        //空閑物理內存總量
    buffer      //用於buffer的內存總量
    cache       //用於cache的內存總量
swap:
    si(swap in)     //表示從物理內存有多少頁面換進swap,也即數據進入swap的數據速率(kb/s)
    so(swap out)    //表示從swap有多少頁面換進物理內存,也即數據離開swap的數據速率(kb/s)
io:
    bi(block in)    //表示磁盤塊有多少個被調入內存中,也即從塊設備讀入數據到系統的速率(kb/s)
    bo(block out)   //表示有多少個磁盤塊從內存中被同步到硬盤上去了,也即保存數據至塊設備的速率(kb/s)
system:
    in( interrupts)     //表示中斷的個數,也即中斷速率(kb/s)
    cs(context switch)  //表示上下文切換的次數,也即進程切換速率(kb/s)
CPU:
    us      //表示用戶空間
    sy      //表示內核空間
    id      //表示空閑百分比
    wa      //表示等待IO完成所占據的時間百分比
    st      //表示steal,被虛擬化技術偷走的時間(比如運行虛擬機)
[root@localhost ~]# vmstat 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r b swpd free buff cache si so bi bo in cs us sy id wa st
 1 0 0 1483472 3008 225880 0 0 9 1 40 41 0 0 100 0 0
[root@localhost ~]# vmstat 2 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r b swpd free buff cache si so bi bo in cs us sy id wa st
 1 0 0 1483472 3008 225880 0 0 9 1 40 41 0 0 100 0 0
 0 0 0 1483476 3008 225880 0 0 0 0 67 71 0 0 100 0 0
 0 0 0 1483476 3008 225880 0 0 0 0 71 72 0 0 100 0 0
 1 0 0 1483476 3008 225880 0 0 0 0 81 77 0 0 100 0 0
 0 0 0 1483476 3008 225880 0 0 0 0 61 66 0 1 100 0 0
[root@localhost ~]# vmstat -s
      1867024 K total memory
       154520 K used memory
       130336 K active memory
       115732 K inactive memory
      1483616 K free memory
         3008 K buffer memory
       225880 K swap cache
      2097148 K total swap
            0 K used swap
      2097148 K free swap
         1229 non-nice user cpu ticks
            9 nice user cpu ticks
         2988 system cpu ticks
      2099312 idle cpu ticks
         2695 IO-wait cpu ticks
            0 IRQ cpu ticks
          166 softirq cpu ticks
            0 stolen cpu ticks
       179796 pages paged in
        23257 pages paged out
            0 pages swapped in
            0 pages swapped out
       844377 interrupts
       859142 CPU context switches
   1569201184 boot time
         2674 forks

5.控制作業

5.1.作業與會話

作業控制是shell的一種功能,它允許單個shell實例運行和管理多個命令。

作業與在shell提示符中輸入的每個管道相關聯。該管道中的所有進程均是作業的一部分,並且是同一個進程組的成員。(如果在shell提示符中僅輸入了一條命令,則這條命令可視為命令的最小管道。該命令將是該作業的唯一成員)

一次只能有一個作業從特定終端窗口讀取輸入和鍵盤生成的信號。屬於該作業的進程是該控制終端的前台進程。

該控制終端的后台進程是與該終端相關聯的任何其他作業的成員。終端的后台進程無法從終端讀取輸入或接收鍵盤生成的中斷,但可以寫入終端。后台中的作業可能已停止(暫停),也可能正在運行。如果某個正在運行的后台作業嘗試從終端讀取內容,則該作業將自動暫停。

每個終端是其自身的會話,並且可以具有一個前台進程和多個獨立的后台進程。一個作業只能屬於一個會話,也就是屬於其控制終端的會話。

5.2.作業分類

Linux作業分為前台作業與后台作業兩種。其各自的特點如下:

  • 前台作業:通過終端啟動,且啟動后一直占據了命令提示符
  • 后台作業:可以通過終端啟動,但啟動之后,釋放命令提示符,后續的操作在后台完成
    • 此類作業雖然被送往后台運行,但其依然與終端相關。如果希望送往后台后,剝離與終端的關系需要執行(nohup COMMAND &)

5.3.在后台運行作業

//在命令后跟上&符號可以生成一個后台作業
//jobs命令用於顯示當前所有的后台作業

[root@localhost ~]# sleep 800 &
[1] 2305
[root@localhost ~]# jobs 
[1]+ 運行中 sleep 800 &

//當只有一個后台作業時,直接使用fg命令,不跟任何參數即可將后台作業調至前台運行,但是當有多個作業時則必須跟上%+作業號,也就是上面命令執行結果中以[ ]括起來的數字。

//使用ctrl+z可將前台進程發送到后台,此時作業將處於停止狀態

[root@localhost ~]# sleep 600 &
[2] 2307
[root@localhost ~]# sleep 500 &
[3] 2308
[root@localhost ~]# jobs
[1] 運行中 sleep 800 &
[2]- 運行中 sleep 600 &
[3]+ 運行中 sleep 500 &
[root@localhost ~]# fg %3
sleep 500
^Z
[3]+ 已停止 sleep 500
[root@localhost ~]# jobs
[1] 運行中 sleep 800 &
[2]- 運行中 sleep 600 &
[3]+ 已停止 sleep 500

//使用bg命令+作業號可使后台已停止的作業重新運行
//kill加上作業號可以手動殺死指定作業
//jobs命令的結果中
+ //命令將默認操作的作業
- //命令將第二個默認操作的作業

[root@localhost ~]# jobs
[1] 運行中 sleep 800 &
[2]- 運行中 sleep 600 &
[3]+ 已停止 sleep 500
[root@localhost ~]# bg %3
[3]+ sleep 500 &
[root@localhost ~]# jobs
[1] 運行中 sleep 800 &
[2]- 運行中 sleep 600 &
[3]+ 運行中 sleep 500 &
[root@localhost ~]# kill %3
[root@localhost ~]# jobs
[1] 運行中 sleep 800 &
[2]- 運行中 sleep 600 &
[3]+ 已終止 sleep 500

6.進程間通信

進程間通信(IPC:Inter Process Communication)

進程間通信方式:

同一主機

  • 共享內存
  • 信號:Signal

不同主機

  • rpc:remote procecure call
  • 基於socket實現進程間通信

7.使用信號控制進程

信號是傳遞至進程的軟件中斷。信號向執行中的程序報告事件。生成信號的事件可以是錯誤或外部事件(如I/O請求或計時器過期),或者來自於明確請求(如使用信號發送命令)

下表列出了系統管理員用於日常進程管理的基本信號。請通過短名稱(HUP)或正確名稱(SIGHUP)指代信號。

指定一個信號的方法:

  • 信號號碼(數字標識):kill -1
  • 信號完整名稱:kill -SIGKILL
  • 信號簡寫名稱:kill -TERM或kill -KILL或kill -INT或kill -HUP

基本進程管理信號

信號編號ID 短名稱 定義 用途
1 HUP 掛起 讓一個進程不用重啟就可以重讀配置文件,並讓新的配置信息生效
2 INT 鍵盤中斷 中斷一個前台進程。ctrl+c就是用的SIGINT信號
9 KILL 中斷,無法攔截 導致立即終止程序。無法被攔截、忽略或處理
15默認值 TERM 終止 導致程序終止。和SIGKILL不同,可以被攔截、忽略或處理。要求程序終止的友好方式,允許自我清理

用戶可以中斷自己的進程,但只有root才能終止由其他人擁有的進程。
kill命令根據ID向進程發送信號。雖其名稱為kill,但該命令可用於發送任何信號,而不僅僅是終止程序的信號

//語法: kill [-SIGNAL] PID ...
//顯示所有可用的信號(可使用man 7 signal查看幫助信息)

[root@localhost ~]# kill -l
 1) SIGHUP	2) SIGINT	3) SIGQUIT	4) SIGILL	5) SIGTRAP
 6) SIGABRT	7) SIGBUS	8) SIGFPE	9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX 

/killall COMMAND:killall后面跟進程名,表示將匹配到的以進程名為名的進程全部殺死

[root@localhost ~]# ps -ef|grep sleep
root 2340 1412 0 14:27 pts/0 00:00:00 sleep 500
root 2341 1412 0 14:27 pts/0 00:00:00 sleep 800
root 2342 1412 0 14:28 pts/0 00:00:00 sleep 900
root 2344 1412 0 14:28 pts/0 00:00:00 grep --color=auto sleep
[root@localhost ~]# killall sleep
[1] 已終止 sleep 500
[2]- 已終止 sleep 800
[3]+ 已終止 sleep 900
[root@localhost ~]# ps -ef|grep sleep
root 2348 1412 0 14:28 pts/0 00:00:00 grep --color=auto sleep

8.監控進程活動

8.1. IO負載

負載平均值代表一段時間內感知的系統負載。Linux通過預期服務等待時間的表示來實施平均負載計算。

Linux不僅計算進程數,也作為獨立的任務計算線程數。運行中線程和等待I/O資源的線程的CPU請求隊列對應於R和D進程狀態。等待I/O包括處於睡眠而等待預期磁盤和網絡響應的任務。

負載數屬於全局計數器計算,是所有CPU的總和數。由於從睡眠返回的任務可能會重新調度到不同的CPU,難以精確的每CPU計數,但累計數的准確度可以保障。顯示的平均負載代表所有的CPU。

//查看cpu核心數

[root@localhost ~]# grep 'model name' /proc/cpuinfo 
model name	: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz

一些UNIX系統僅考慮CPU使用率或運行隊列長度來指示系統負載。由於具有空閑CPU的系統可能會因為磁盤或網絡資源忙而遇到很長時間的等待,因此Linux負載平均值中包含了對I/O的考量。遇到負載平均值很高但CPU活動很低時,請檢查磁盤和網絡活動。

Linux中可以使用top、uptime顯示負載平均值的情況。

[root@localhost ~]# uptime 
 14:34:30 up 5:21, 1 user, load average: 0.00, 0.01, 0.05

//此處的load average就表示負載平均值,這三個值代表最近1、5和15分鍾的負載情況。

將顯示的負載平均值除以系統中的邏輯CPU數。當值低於1表示資源利用率較好,等待時間很短。當值高於1表示資源飽和,而且有一定的服務等待時間。

空閑CPU隊列的負載數為0。每個就緒和等待的線程使計數增加1。總隊列數為1時,資源(CPU、磁盤或網絡)正在使用中,但沒有請求把時間花在等待上。增加的請求數會累積該計數,但由於許多請求可以在時限內處理,資源使用率會很高,而等待時間則不會。

因為磁盤或網絡資源忙碌等待I/O而處於睡眠的進程包含在該計數內,而且使負載平均值增大。雖然不能表示CPU使用率,隊列數依然表明用戶和程序正在等待資源服務。

在資源飽和前,平均負載將保持在1以下,因為幾乎不會在隊列中發現等待的任務。只有資源飽和導致請求留在排隊狀態並且被負載計算例程計時,負載平均才會增大。當資源使用率接近100%時,每個增加的請求將開始遭遇服務等待時間。

8.2.實時進程監控

top用於實現全屏動態顯示系統信息

//常用選項:
    -d      //設置延遲時長,top -d 1表示每隔1秒刷新一次,默認每隔5秒刷新
    -b      //批模式翻屏顯示,默認只實時顯示一屏,若要顯示后面的進程信息則可使用-b選項,與-n #合用,可指定顯示翻#屏
    
[root@localhost ~]# top -b -n 1
top - 14:38:24 up 5:25, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 152 total, 1 running, 151 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1867024 total, 1523364 free, 151264 used, 192396 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1527400 avail Mem 

   PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  2376 root 20 0 157584 2080 1476 R 6.2 0.1 0:00.01 top
     1 root 20 0 129104 6468 2704 S 0.0 0.3 0:01.94 systemd
     2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
     3 root 20 0 0 0 0 S 0.0 0.0 0:00.39 ksoftirqd/0
     5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
     7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
     8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
     9 root 20 0 0 0 0 S 0.0 0.0 0:00.97 rcu_sched
    10 root rt 0 0 0 0 S 0.0 0.0 0:00.25 watchdog/0

load average:1分鍾,5分鍾,15分鍾
    load average    //CPU隊列中等待運行的任務的個數
cpu(s):多顆CPU平均負載,按1鍵顯示每顆CPU平均負載。
    us  //表示用戶空間;
    sy  //表示內核空間;
    ni  //表示調整nice值,CPU占用的比率;
    id  //表示空閑百分比;
    wa  //表示等待IO完成所占據的時間百分比;
    hi  //表示hard interrupt,硬件中斷占據的時間百分比;
    si  //表示軟中斷占據的時間百分比;
    st  //表示steal,被虛擬化技術偷走的時間(比如運行虛擬機)
PR      //優先級
NI      //nice值
VIRT    //虛擬內存集
RES     //常駐內存集
SHR     //共享內存大小
S       //進程狀態

//top命令交互式子命令:
    M   //根據駐留內存大小進行排序,默認根據CPU百分比排序
    P   //根據CPU使用百分比進行排序
    T   //根據累計時間(占據CPU時長)進行排序
    l   //是否顯示平均負載和啟動時間
    t   //是否顯示進程和CPU狀態相關信息
    m   //是否顯示內存相關信息
    c   //是否顯示完整的命令行信息
    q   //退出top命令
    k   //終止某個進程
    1   //顯示所有CPU的信息
    s   //修改刷新時間間隔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM