1.介紹
1.什么是進程
比如: 開發寫的代碼我們稱為程序,那么將開發的代碼運行起來。我們稱為進程。
總結一句話就是: 當我們運行一個程序,那么我們將運行的程序叫進程。
PS1: 當程序運行為進程后,系統會為該進程分配內存,以及進程運行的身份和權限。
PS2: 在進程運行的過程中,系統會有各種指標來表示當前運行的狀態。
2.程序和進程的區別
1.程序是數據和指令的集合,是一個靜態的概念。比如/bin/ls、/bin/cp等二進制文件。同時程序可以長期存在系統中。
2.進程是程序運行的過程,是一個動態的概念。進程是存在生命周期的概念的,也就是說進程會隨著程序的終止而銷毀,不會永久存在系統中。
3.進程的生命周期
生命周期就是指一個對象的生老病死。用處很廣。
當父進程接收到任務調度時,會通過fock派生子進程來處理,那么子進程會繼承父進程屬性。
1.子進程在處理任務代碼時,父進程會進入等待狀態中…
2.子進程在處理任務代碼后,會執行退出,然后喚醒父進程來回收子進程的資源。
3.如果子進程在處理任務過程中,父進程退出了,子進程沒有退出,那么這些子進程就沒有父進程來管理了,就變成僵尸進程。
PS: 每個進程都父進程的PPID,子進程則叫PID。
例: 假設現在我是蔣先生(system進程)….故事持續中…..
2.監控進程狀態
程序在運行后,我們需要了解進程的運行狀態。查看進程的狀態分為: 靜態和動態兩種方式
1.使用ps命令查看當前的進程狀態(靜態)
1)示例、ps -aux常用組合,查看進程 用戶、PID、占用cpu百分比、占用內存百分比、狀態、執行的命令等
狀態 | 描述 |
---|---|
USER | 啟動進程的用戶 |
PID | 進程運行的ID號 |
%CPU | 進程占用CPU百分比 |
%MEM | 進程占用內存百分比 |
VSZ | 進程占用虛擬內存大小 (單位KB) |
RSS | 進程占用物理內存實際大小 (單位KB) |
TTY | 進程是由哪個終端運行啟動的tty1、pts/0等 ?表示內核程序與終端無關(遠程連接會通過tty打開一個bash:tty) |
STAT | 進程運行過程中的狀態 man ps (/STATE) |
START | 進程的啟動時間 |
TIME | 進程占用 CPU 的總時間(為0表示還沒超過秒) |
COMMAND | 程序的運行指令,[ 方括號 ] 屬于內核態的進程。 沒有 [ ] 的是用戶態進程。systemctl status 指令 |
2.STAT狀態的S、Ss、S+、R、R、S+等等,都是什么意思?
STAT基本狀態 | 描述 | STAT狀態+符號 | 描述 |
---|---|---|---|
R | 進程運行 | s | 進程是控制進程, Ss進程的領導者,父進程 |
S | 可中斷睡眠 | < | 進程運行在高優先級上,S<優先級較高的進程 |
T | 進程被暫停 | N | 進程運行在低優先級上,SN優先級較低的進程 |
D | 不可中斷睡眠 | + | 當前進程運行在前臺,R+該表示進程在前臺運行(正在io操作,一旦停止,數據丟失) |
Z | 僵尸進程 | l | 進程是多線程的,Sl表示進程是以線程方式運行 |
案例一、PS命令查看進程狀態切換
#1.在終端1上運行vim [root@lqz ~]# vim oldboy #2.在終端2上運行ps命令查看狀態 [root@lqz ~]# ps aux|grep oldboy #S表示睡眠模式,+表示前臺運行 root 58118 0.4 0.2 151788 5320 pts/1 S+ 22:11 0:00 oldboy root 58120 0.0 0.0 112720 996 pts/0 R+ 22:12 0:00 grep --color=auto oldboy #在終端1上掛起vim命令,按下:ctrl+z #3.回到終端2再次運行ps命令查看狀態 [root@lqz ~]# ps aux|grep oldboy #T表示停止狀態 root 58118 0.1 0.2 151788 5320 pts/1 T 22:11 0:00 vim oldboy root 58125 0.0 0.0 112720 996 pts/0 R+ 22:12 0:00 grep --color=auto oldboy
案例二、PS命令查看不可中斷狀態進程
#1.使用tar打包文件時,可以通過終端不斷查看狀態,由S+,R+變為D+ [root@lqz ~]# tar -czf etc.tar.gz /etc/ /usr/ /var/ [root@lqz ~]# ps aux|grep tar|grep -v grep root 58467 5.5 0.2 127924 5456 pts/1 R+ 22:22 0:04 tar -czf etc.tar.gz /etc/ [root@lqz ~]# ps aux|grep tar|grep -v grep root 58467 5.5 0.2 127088 4708 pts/1 S+ 22:22 0:03 tar -czf etc.tar.gz /etc/ [root@lqz ~]# ps aux|grep tar|grep -v grep root 58467 5.6 0.2 127232 4708 pts/1 D+ 22:22 0:03 tar -czf etc.tar.gz /etc/
查看進程 ps
ps [options]
支持的命令格式
unix格式:-h -e
BSD格式:a,x,u
GNU長格式:--help
選項
[root@s22 ~]#ps PID TTY TIME CMD 28019 pts/4 0000 ps 83674 pts/4 0000 bash pid 終端 當前命令占用cpu的時間 命令 a 所有的終端 x 包括不連接終端的終端 u 顯示進程詳細信息 f 顯示進程樹 k 指定排序方式 ,默認是遞增,如果想遞減,則需要在排序的字段上加上- o 指定顯示的屬性,不能跟u同時使用 L 獲取支持的選項, -L 顯示線程 -e 相當于 ax -f 顯示詳細信息,相當于u -F 顯示更詳細信息 -H 顯示樹狀結構 -U username 獲取指定的用戶信息 常用選項: aux -ef -eFH
ps輸出屬性
VSZ 虛擬內存(程序認為可以獲取到的)
RSS 實際內存
psr cpu編號
STAT 狀態
%cpu cpu的占用率
%mem 內存的占用率
根據名稱來查詢進程
pidof name [root@s22 ~]#pidof python 1169 825
2.使用top命令查看當前的進程狀態(動態)
任務 | 含義 |
---|---|
Tasks: 129 total | 當然進程的總數 |
1 running | 正在運行的進程數 |
128 sleeping | 睡眠的進程數 |
0 stopped | 停止的進程數 |
0 zombie | 僵尸進程數 |
%Cpu(s) | 平均cpu使用率,按1 查看每個cup具體狀態 |
0.7 us | 用戶進程占用cpu百分比 |
0.7 sys | 內核進程占用百分比 |
0.0 ni | 優先級進程占用cpu的百分比 |
98.7 id | 空閑cup |
0.0 wa | CPU等待IO完成的時間,大量的io等待,會變高 |
0.0 hi | 硬中斷,占的CPU百分比 |
0.0 si | 軟中斷,占的CPU百分比 |
0.0 st | 虛擬機占用物理CPU的時間 |
# w load average:平均負載 一分鐘,5分鐘,15分鐘 04:05:43 up 11:35, 3 users, load average: 0.00, 0.01, 0.05 # uptime 04:06:21 up 11:35, 3 users, load average: 0.00, 0.01, 0.05
PS: 如何理解中斷這個東西
top 常見指令
字母 | 含義 |
---|---|
h | 查看幫出 |
1 | 數字1,顯示所有CPU核心的負載 |
z | 以高亮顯示數據 |
b | 高亮顯示處于R(進行中)狀態的進程 |
M | 按內存使用百分比排序輸出 |
P | 按CPU使用百分比排序輸出 |
q | 退出top |
# 第三方top htop,top高級:yum install htop -y iftop網卡流量:yum install iftop -y glances,直觀的顯示:yum install glances -y -rz上傳文件,可以動態看到,網卡情況
下載新repo 到/etc/yum.repos.d/
wget-O/etc/yum.repos.d/epel.repohttps://mirrors.aliyun.com/repo/epel-7.repo
Epel 鏡像,第三方軟件庫
# 第三方top htop,top高級:yum install htop -y iftop網卡流量:yum install iftop -y glances,直觀的顯示:yum install glances -y -rz上傳文件,可以動態看到,網卡情況
uptime
[root@s22 ~]#uptime 09:17:40 up 1 day, 22:19, 5 users, load average: 2.14, 1.59, 0.84 當前時間 當前服務器運行時長 當前的在線用戶數 cpu的負載 1分鐘 5分鐘 15分鐘 cpu平均負載:在特定時間之內cpu運行的平均進程數,不超過cpu核心數的2倍認為為良好
top
首部信息
uptime信息 l 顯示與隱藏
tasks :進程總數,運行,睡眠數,停止數,僵尸進程 t
cpu信息:%Cpu(s): 0.3 us, 4.6 sy, 0.0 ni, 95.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
用戶空間 系統空間 nice值 空閑 等待 硬中斷 軟中斷 虛擬機偷走時間
內存信息 m
cpu分別顯示 1(數字)
排序:
模式是cpu的占用率 P
M:內存占用率
T: cpu的占用時間
退出:q
修改刷新頻率:s,默認是3秒
殺死進程:k,默認是第一個
W 保存文件
選項:
-d 刷新時間
-b 顯示所有的信息
-n # 指定刷新#次后退出
htop
epel源
3. 系統工具(epel三方庫下載),性能分析
free
顯示內存
-b 字節 -k kb -m mb -g gb -h 人類易讀方式 -c # 刷新次數
vmstat
vmstat [options] [delay [count]] [root@s22 ~]#vmstat 1 3 每秒刷新一次,刷新3次 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 37028 162708 0 808588 0 0 8 6 34 34 0 2 97 0 0 0 0 37028 162560 0 808588 0 0 0 0 4535 6893 1 5 95 0 0 0 0 37028 162544 0 808588 0 0 0 0 4463 6772 0 5 95 0 0 procs: r:正在運行的進程個數 b:阻塞隊列的長度 memory: swapd: 虛擬內容大小 free: 空閑物理內存的大小 buff:用于buff的大小 cache:用戶cache的大小 swap: si:從磁盤交換到內存的數據速率(kb/s) so: 從內存交換到磁盤的數據速率(kb/s) io: bi: 從磁盤讀取到系統的速率(kb/s) bo: 從系統寫入到磁盤的速率(kb/s) system: in:中斷頻率 cs:進程之前切換的頻率 cpu: us sy id wa st
iostat
查看磁盤讀寫速度
iostat 1 10
dstat 查看所有
-c cpu -d 硬盤 -m 內存 -n 網絡 -p 進程 -r io請求 -s swap --top-cpu 顯示占用cpu最多的進程 --top-io 顯示占用io最多的進程 --top-mem 顯示占用內存最多的進程 --tcp 顯示tcp的信息 --udp 顯示udp的信息
iftop 顯示網卡的流量
4.管理進程狀態,進程的管理工具
當程序運行為進程后,如果希望停止進程,怎么辦呢? 那么此時我們可以使用linux的kill命令對進程發送關閉信號。當然除了kill、還有killall,pkill
1.使用kill -l列出當前系統所支持的信號
雖然linux支持信號很多,但是我們僅列出我們最為常用的3個信號
數字編號 | 信號含義 | 信號翻譯 |
---|---|---|
1 | SIGHUP | 通常用來重新加載配置文件,重新讀取一次參數的配置文件 (類似 reload) |
9 | SIGKILL | 強制殺死進程(有狀態的服務(存磁盤的,如mysql)強制停止可能會導致下次起不來) |
15 | SIGTERM | 終止進程,默認kill使用該信號 |
1.我們使用kill命令殺死指定PID的進程。
#1.給 vsftpd 進程發送信號 1,15 [root@lqz ~]# yum -y install vsftpd [root@lqz ~]# systemctl start vsftpd [root@lqz ~]# ps aux|grep vsftpd #2.發送重載信號,例如 vsftpd 的配置文件發生改變,希望重新加載 [root@lqz ~]# kill -1 9160 #3.發送停止信號,當然vsftpd 服務有停止的腳本 systemctl stop vsftpd [root@lqz ~]# kill 9160 #4.發送強制停止信號,當無法停止服務時,可強制終止信號 [root@lqz ~]# kill -9 9160
2.Linux系統中的killall、pkill命令用于殺死指定名字的進程。
我們可以使用kill命令殺死指定進程PID的進程,如果要找到我們需要殺死的進程,我們還需要在之前使用ps等命令再配合grep來查找進程,而killall、pkill把這兩個過程合二為一,是一個很好用的命令。
#例0、通過服務名稱殺掉進程 [root@lqz ~]# vim nginx.conf # 修改為worker_processes 10; [root@lqz ~]# kill -1 26093 # 平滑reload nginx,可以看到很多ngixn進程 [root@lqz ~]# kill 26121 # 殺掉一個子進程,會迅速的被master啟動起來,只是id號不一致了 [root@lqz ~]# kill 26093 # 主進程,子進程都會被殺掉 #例1、通過服務名稱殺掉進程 [root@lqz ~]# pkill nginx [root@lqz ~]# killall nginx #例2、使用pkill踢出從遠程登錄到本機的用戶,終止pts/0上所有進程, 并且bash也結束(用戶被強制退出) [root@lqz ~]# pkill -9 bash # 一般程序都會有自己的啟動和停止 /usr/local/nginx/sbin/nginx -h
kill
向進程發送信號,實現對進程的管理,每個信號,對應不同的值,對應不同的含義,不區分大小寫
查詢可用信號:kill -l
常用信號:
1) sighub 不需要關閉程序,重新加載配置文件
2)sigint 終止進程,相當于ctrl+c
9) sigkill 強制殺死進程
15)sigterm 終止正在運行的進程
18)sigcont 繼續運行
19)sigstop 后臺休眠
按照pid: kill-n pid
按照名稱:killall -n name
按照名稱:pkill -n name
5.管理后臺進程,作業管理
1.什么是后臺進程
通常進程都會在終端前臺運行,一旦關閉終端,進程也會隨著結束,那么此時我們就希望進程能在后臺運行,就是將在前臺運行的進程放入后臺運行,這樣及時我們關閉了終端也不影響進程的正常運行。
2.我們為什么要將進程放入后臺運行
比如:我們此前在國內服務器往國外服務器傳輸大文件時,由于網絡的問題需要傳輸很久,如果在傳輸的過程中出現網絡抖動或者不小心關閉了終端則會導致傳輸失敗,如果能將傳輸的進程放入后臺,是不是就能解決此類問題了。
3.使用什么工具將進程放入后臺
早期的時候大家都選擇使用&符號將進程放入后臺,然后在使用jobs、bg、fg等方式查看進程狀態,但太麻煩了。也不直觀,所以我們推薦使用screen。
1.jobs、bg、fg的使用(強烈不推薦,了解即可)
[root@lqz ~]# sleep 3000 & //運行程序(時),讓其在后臺執行 [root@lqz ~]# sleep 4000 //^Z,將前臺的程序掛起(暫停)到后臺 [2]+ Stopped sleep 4000 [root@lqz ~]# ps aux |grep sleep [root@lqz ~]# jobs //查看后臺作業 [1]- Running sleep 3000 & [2]+ Stopped sleep 4000 [root@lqz ~]# bg %2 //讓作業 2 在后臺運行 [root@lqz ~]# fg %1 //將作業 1 調回到前臺 [root@lqz ~]# kill %1 //kill 1,終止 PID 為 1 的進程 [root@lqz ~]# (while :; do date; sleep 2; done) & //進程在后臺運行,但輸出依然在當前終端 [root@lqz ~]# (while :; do date; sleep 2; done) &>/dev/null &
2.screen的使用(強烈推薦,生產必用)
#1.安裝 [root@oldboy ~]# yum install screen -y #2.開啟一個screen窗口,指定名稱 [root@oldboy ~]# screen -S wget_mysql #3.在screen窗口中執行任務即可 [root@oldboy ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz --no-check-certificate #4.平滑的退出screen,但不會終止screen中的任務。注意: 如果使用exit 才算真的關閉screen窗口 ctrl+a+d #5.查看當前正在運行的screen有哪些 [root@oldboy ~]# screen -list There is a screen on: 22058.wget_mysql (Detached) 1 Socket in /var/run/screen/S-root. #6.進入正在運行的screen [root@oldboy ~]# screen -r wget_mysql [root@oldboy ~]# screen -r 22058 #7 終止(ctrl+d),退出才能停止screen exit
前臺作業:一直占用終端的作業
后臺作業:不占用當前的終端
讓作業運行于后臺:
ctrl+z 對于啟動中
command & 也會輸出到終端,還是會終端顯示
nohup ping www.baidu.com &
脫離終端:
nohup command &>/dev/null &(黑洞)
nohup ping www.baidu.com &>/dev/null &
screen
-list 查看所有的screen窗口 -r 進入
6.進程的優先級[進階]
1.什么優先級
優先級指的是優先享受資源,比如排隊買票時,軍人優先、老人優先。等等
2.為什么要有系統優先級
舉個例子: 海底撈火鍋正常情況下響應就特別快,那么當節假日來臨時人員突增則會導致處理請求特別慢,那么假設我是海底撈VIP客戶(最高優先級),無論門店多么繁忙,我都不用排隊,海底撈人員會直接服務于我,滿足我的需求。至于沒有VIP的人員(較低優先級)則進入排隊等待狀態。(PS: 至于等多久,那…..)
3.系統中如何給進程配置優先級?
在啟動進程時,為不同的進程使用不同的調度策略。nice 值越高: 表示優先級越低,例如+19,該進程容易將CPU 使用量讓給其他進程。nice 值越低: 表示優先級越高,例如-20,該進程更不傾向于讓出CPU。
使用top或ps命令查看進程的優先級
#1.使用top可以查看nice優先級。 NI: 實際nice級別,默認是0。 PR: 顯示nice值,-20映射到0,+19映射到39 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1083 root 20 0 298628 2808 1544 S 0.3 0.1 2:49.28 vmtoolsd 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:+ #2.使用ps查看進程優先級 [root@m01 ~]# ps axo command,nice |grep sshd|grep -v grep /usr/sbin/sshd -D 0 sshd: root@pts/2 0
nice指定程序的優先級。語法格式 nice -n 優先級數字 進程名稱
#1.開啟vim并且指定程序優先級為-5 [root@m01 ~]# nice -n -5 vim & [1] 98417 #2.查看該進程的優先級情況 [root@m01 ~]# ps axo pid,command,nice |grep 98417 98417 vim
-5
renice命令修改一個正在運行的進程優先級。語法格式 renice -n 優先級數字 進程pid
#1.查看sshd進程當前的優先級狀態 [root@m01 ~]# ps axo pid,command,nice |grep 折疊shd 70840 sshd: root@pts/2 0 98002 /usr/sbin/sshd -D 0 #2.調整sshd主進程的優先級 [root@m01 ~]# renice -n -20 98002 98002 (process ID) old priority 0, new priority -20 #3.調整之后記得退出終端 [root@m01 ~]# ps axo pid,command,nice |grep 折疊shd 70840 sshd: root@pts/2 0 98002 /usr/sbin/sshd -D -20 [root@m01 ~]# exit #4.當再次登陸sshd服務,會由主進程fork子進程(那么子進程會繼承主進程的優先級) [root@m01 ~]# ps axo pid,command,nice |grep 折疊shd 98002 /usr/sbin/sshd -D -20 98122 sshd: root@pts/0 -20
生產案例、Linux出現假死,怎么辦,又如何通過nice解決?
7.系統平均負載[進階]
每次發現系統變慢時,我們通常做的第一件事,就是執行 top 或者 uptime 命令,來了解系統的負載情況。比如像下面這樣,我在命令行里輸入了 uptime 命令,系統也隨即給出了結果。
[root@m01 ~]# uptime 04:49:26 up 2 days, 2:33, 2 users, load average: 0.70, 0.04, 0.05 #我們已經比較熟悉前面幾列,它們分別是當前時間、系統運行時間以及正在登錄用戶數。 # 而最后三個數字呢,依次則是過去 1 分鐘、5 分鐘、15 分鐘的平均負載(Load Average)。
1.什么是平均負載
平均負載不就是單位時間內的 CPU 使用率嗎?上面的 0.70,就代表 CPU 使用率是 70%。其實上并…..那到底如何理解平均負載: 平均負載是指單位時間內,系統處于可運行狀態和不可中斷狀態的平均進程數,也就是平均活躍進程數, PS: 平均負載與 CPU 使用率并沒有直接關系。
2.可運行狀態和不可中斷狀態是什么
1.可運行狀態進程,是指正在使用 CPU 或者正在等待 CPU 的進程,也就是我們ps 命令看到處于 R 狀態的進程。
2.不可中斷進程,(你做什么事情的時候是不能打斷的?) 系統中最常見的是等待硬件設備的 I/O 響應,也就是我們ps 命令中看到的 D 狀態(也稱為 Disk Sleep)的進程。
例如: 當一個進程向磁盤讀寫數據時,為了保證數據的一致性,在得到磁盤回復前,它是不能被其他進程或者中斷打斷的,這個時候的進程就處于不可中斷狀態。如果此時的進程被打斷了,就容易出現磁盤數據與進程數據不一致的問題。所以,不可中斷狀態實際上是系統對進程和硬件設備的一種保護機制。
劃重點,因此你可以簡單理解為,平均負載其實就是單位時間內的活躍進程數。
3.那平均負載為多少時合理
最理想的狀態是每個 CPU 上都剛好運行著一個進程,這樣每個 CPU 都得到了充分利用。所以在評判平均負載時,首先你要知道系統有幾個 CPU,這可以通過 top 命令獲取,或grep 'model name' /proc/cpuinfo
例1、假設現在在 4、2、1核的CPU上,如果平均負載為 2 時,意味著什么呢?
Q1.在4 個 CPU 的系統上,意味著 CPU 有 50% 的空閑。
Q2.在2 個 CPU 的系統上,意味著所有的 CPU 都剛好被完全占用。
Q3.而1 個 CPU 的系統上,則意味著有一半的進程競爭不到 CPU。
PS: 平均負載有三個數值,我們應該關注哪個呢?
實際上,我們都需要關注。就好比上海4月的天氣,如果只看晚上天氣,感覺在過冬天呢。但如果你結合了早上、中午、晚上三個時間點的溫度來看,基本就可以全方位了解這一天的天氣情況了。
1.如果 1 分鐘、5 分鐘、15 分鐘的三個值基本相同,或者相差不大,那就說明系統負載很平穩。
2.但如果 1 分鐘的值遠小于 15 分鐘的值,就說明系統最近 1 分鐘的負載在減少,而過去 15 分鐘內卻有很大的負載。
3.反過來,如果 1 分鐘的值遠大于 15 分鐘的值,就說明最近 1 分鐘的負載在增加,這種增加有可能只是臨時性的,也有可能還會持續上升,所以就需要持續觀察。
PS: 一旦 1 分鐘的平均負載接近或超過了 CPU 的個數,就意味著系統正在發生過載的問題,這時就得分析問題,并要想辦法優化了
在來看個例子3、假設我們在有2個 CPU 系統上看到平均負載為 2.73,6.90,12.98
那么說明在過去1 分鐘內,系統有 136% 的超載 (2.73/2=136%)
而在過去 5 分鐘內,有 345% 的超載 (6.90/2=345%)
而在過去15 分鐘內,有 649% 的超載,(12.98/2=649%)
但從整體趨勢來看,系統的負載是在逐步的降低。
4.那么在實際生產環境中,平均負載多高時,需要我們重點關注呢?
當平均負載高于 CPU 數量 70% 的時候,你就應該分析排查負載高的問題了。一旦負載過高,就可能導致進程響應變慢,進而影響服務的正常功能。
但 70% 這個數字并不是絕對的,最推薦的方法,還是把系統的平均負載監控起來,然后根據更多的歷史數據,判斷負載的變化趨勢。當發現負載有明顯升高趨勢時,比如說負載翻倍了,你再去做分析和調查。
5.平均負載與 CPU 使用率有什么關系
在實際工作中,我們經常容易把平均負載和 CPU 使用率混淆,所以在這里,我也做一個區分。可能你會疑惑,既然平均負載代表的是活躍進程數,那平均負載高了,不就意味著 CPU 使用率高嗎?
我們還是要回到平均負載的含義上來,平均負載是指單位時間內,處于可運行狀態和不可中斷狀態的進程數。所以,它不僅包括了正在使用 CPU 的進程,還包括等待 CPU 和等待 I/O 的進程。
而 CPU 使用率,是單位時間內 CPU 繁忙情況的統計,跟平均負載并不一定完全對應。比如:
CPU 密集型進程,使用大量 CPU 會導致平均負載升高,此時這兩者是一致的;
I/O 密集型進程,等待 I/O 也會導致平均負載升高,但 CPU 使用率不一定很高;
大量等待 CPU 的進程調度也會導致平均負載升高,此時的 CPU 使用率也會比較高。
6.平均負載案例分析實戰
下面,我們以三個示例分別來看這三種情況,并用 stress、mpstat、pidstat 等工具,找出平均負載升高的根源。
stress 是 Linux 系統壓力測試工具,這里我們用作異常進程模擬平均負載升高的場景。
mpstat 是多核 CPU 性能分析工具,用來實時查看每個 CPU 的性能指標,以及所有 CPU 的平均指標。
pidstat 是一個常用的進程性能分析工具,用來實時查看進程的 CPU、內存、I/O 以及上下文切換等性能指標。
#如果出現無法使用mpstat、pidstat命令查看%wait指標建議更新下軟件包 wget http://pagesperso-orange.fr/sebastien.godard/sysstat-11.7.3-1.x86_64.rpm rpm -Uvh sysstat-11.7.3-1.x86_64.rpm
場景一:CPU 密集型進程
1.首先,我們在第一個終端運行 stress 命令,模擬一個 CPU 使用率 100% 的場景:
[root@m01 ~]# stress --cpu 1 --timeout 600
2.接著,在第二個終端運行 uptime 查看平均負載的變化情況
# 使用watch -d 參數表示高亮顯示變化的區域(注意負載會持續升高) [root@m01 ~]# watch -d uptime 17:27:44 up 2 days, 3:11, 3 users, load average: 1.10, 0.30, 0.17
3.最后,在第三個終端運行 mpstat 查看 CPU 使用率的變化情況
# -P ALL 表示監控所有 CPU,后面數字 5 表示間隔 5 秒后輸出一組數據 [root@m01 ~]# mpstat -P ALL 5 Linux 3.10.0-957.1.3.el7.x86_64 (m01) 2019年04月29日 _x86_64_ (1 CPU) 17時32分03秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 17時32分08秒 all 99.80 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17時32分08秒 0 99.80 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00 #單核CPU所以只有一個all和0
4.從終端二中可以看到,1 分鐘的平均負載會慢慢增加到 1.00,而從終端三中還可以看到,正好有一個 CPU 的使用率為 100%,但它的 iowait 只有 0。這說明,平均負載的升高正是由于 CPU 使用率為 100% 。那么,到底是哪個進程導致了 CPU 使用率為 100% 呢?可以使用 pidstat 來查詢
# 間隔 5 秒后輸出一組數據 [root@m01 ~]# pidstat -u 5 1 Linux 3.10.0-957.1.3.el7.x86_64 (m01) 2019年04月29日 _x86_64_(1 CPU) 17時33分21秒 UID PID %usr %system %guest %CPU CPU Command 17時33分26秒 0 110019 98.80 0.00 0.00 98.80 0 stress #從這里可以明顯看到,stress 進程的 CPU 使用率為 100%。
場景二:I/O 密集型進程
1.首先還是運行 stress 命令,但這次模擬 I/O 壓力,即不停地執行 sync
[root@m01 ~]# stress --io 1 --timeout 600s
2.然后在第二個終端運行 uptime 查看平均負載的變化情況:
[root@m01 ~]# watch -d uptime 18:43:51 up 2 days, 4:27, 3 users, load average: 1.12, 0.65, 0.00
3.最后第三個終端運行 mpstat 查看 CPU 使用率的變化情況:
# 顯示所有 CPU 的指標,并在間隔 5 秒輸出一組數據 [root@m01 ~]# mpstat -P ALL 5 Linux 3.10.0-693.2.2.el7.x86_64 (bgx.com) 2019年05月07日 _x86_64_ (1 CPU) 14時20分07秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 14時20分12秒 all 0.20 0.00 82.45 17.35 0.00 0.00 0.00 0.00 0.00 0.00 14時20分12秒 0 0.20 0.00 82.45 17.35 0.00 0.00 0.00 0.00 0.00 0.00 #會發現cpu的與內核打交道的sys占用非常高
4.那么到底是哪個進程,導致 iowait 這么高呢?我們還是用 pidstat 來查詢
# 間隔 5 秒后輸出一組數據,-u 表示 CPU 指標 [root@m01 ~]# pidstat -u 5 1 Linux 3.10.0-957.1.3.el7.x86_64 (m01) 2019年04月29日 _x86_64_(1 CPU) 18時29分37秒 UID PID %usr %system %guest %wait %CPU CPU Command 18時29分42秒 0 127259 32.60 0.20 0.00 67.20 32.80 0 stress 18時29分42秒 0 127261 4.60 28.20 0.00 67.20 32.80 0 stress 18時29分42秒 0 127262 4.20 28.60 0.00 67.20 32.80 0 stress #可以發現,還是 stress 進程導致的。
場景三:大量進程的場景
當系統中運行進程超出 CPU 運行能力時,就會出現等待 CPU 的進程。
1.首先,我們還是使用 stress,但這次模擬的是 4 個進程
[root@m01 ~]# stress -c 4 --timeout 600
2.由于系統只有 1 個 CPU,明顯比 4 個進程要少得多,因而,系統的 CPU 處于嚴重過載狀態
[root@m01 ~]# watch -d uptime 19:11:07 up 2 days, 4:45, 3 users, load average: 4.65, 2.65, 4.65
3.然后,再運行 pidstat 來看一下進程的情況:
# 間隔 5 秒后輸出一組數據 [root@m01 ~]# pidstat -u 5 1 平均時間: UID PID %usr %system %guest %wait %CPU CPU Command 平均時間: 0 130290 24.55 0.00 0.00 75.25 24.55 - stress 平均時間: 0 130291 24.95 0.00 0.00 75.25 24.95 - stress 平均時間: 0 130292 24.95 0.00 0.00 75.25 24.95 - stress 平均時間: 0 130293 24.75 0.00 0.00 74.65 24.75 - stress
可以看出,4 個進程在爭搶 1 個 CPU,每個進程等待 CPU 的時間(也就是代碼塊中的 %wait 列)高達 75%。這些超出 CPU 計算能力的進程,最終導致 CPU 過載。
分析完這三個案例,我再來歸納一下平均負載與CPU
平均負載提供了一個快速查看系統整體性能的手段,反映了整體的負載情況。但只看平均負載本身,我們并不能直接發現,到底是哪里出現了瓶頸。所以,在理解平均負載時,也要注意:
平均負載高有可能是 CPU 密集型進程導致的;
平均負載高并不一定代表 CPU 使用率高,還有可能是 I/O 更繁忙了;
當發現負載高的時候,你可以使用 mpstat、pidstat 等工具,輔助分析負載的來源
安全
防火墻
綠盟
深信服
啟明星辰
飛塔
思科
華為
華三
(網關處的硬件防火墻)
4表5鏈 iptables -L 查看 防火墻策略 iptables -F 清空 防火墻 systemctl disable firewalld 開機并啟動 systemctl stop firewalled
selinux
美國國家安全局
配置文件 /etc/selinux/config
SELINUX=disabled # 關掉防火墻
setenforce 0 臨時生效
getenforce 查看selinux的狀態
紅帽認證:
rhcea
rhce
rhca
思考認證:
ccnp
ccie
ccia
orcal認證:
ocp
鏈接:https://www.cnblogs.com/coderxueshan/p/17950646
-
內存
+關注
關注
8文章
3025瀏覽量
74042 -
程序
+關注
關注
117文章
3787瀏覽量
81038 -
代碼
+關注
關注
30文章
4788瀏覽量
68603 -
進程
+關注
關注
0文章
203瀏覽量
13961
原文標題:安全
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論