Linux進程管理

[Toc] #Linux進程管理 ##1.進程基本概述 進程是已啓動的可執行程序的運行中實例。shell

/proc目錄下以數字爲名的目錄,每個目錄表明一個進程,保存着進程的屬性信息。每個進程的PID是惟一的,就算進程退出了,其它進程也不會佔用其PID。安全

###1.1.進程的組成部分 已分配內存的地址空間 安全屬性,包括全部權憑據和特權 程序代碼的一個或多個執行線程 進程狀態 ###1.2.進程的環境 本地和全局變量 當前調度上下文 分配的系統資源,如文件描述符和網絡端口 ###1.3.進程的產生 現有的(父)進程複製本身的地址空間(fork)來建立一個新的(子)進程結構。 每一個新進程分配有一個惟一的進程ID(PID),知足跟蹤和安全性之需。PID與父進程ID(PPID)是新進程環境的元素。 任何進程可建立子進程。全部進程都是第一個系統進程的後代。RHEL7上,第一個系統進程是systemd。 bash

經過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 低優先級進程app

  • 前臺進程組中的進程 | 多線程進程 s 會話進程首進程 ##3.進程優先級 ###3.1.Linux進程調度與多任務 現代計算機系統中既包含每次只能執行一個指令的低端處理器,也包含高性能超級計算機,這些超級計算機每臺配備數百個CPU,每一個CPU上具備多個核心,它們能夠並行執行數以百計的指令。可是全部這些系統每每具備一個共同點:它們須要運行的進程數量老是超出實際具備的核心數。

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

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

###3.2.進程優先級ide

進程優先級範圍: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就表示負載平均值,這三個值表明最近一、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   //修改刷新時間間隔
相關文章
相關標籤/搜索