[toc] 進程的優先順序 那麼在系統中如何給進程配置優先順序 在啟動進程時,為不同的進程使用不同的調度策略。 nice值越高:表示優先順序越低,例如19,該進程容易將CPU使用量讓給其他進程。 nice值越低:表示優先順序越高,例如 20,該進程更不傾向於讓出CPU。 遠程連接不上操作步驟 網路 埠 用 ...
目錄
進程的優先順序
那麼在系統中如何給進程配置優先順序
在啟動進程時,為不同的進程使用不同的調度策略。
nice值越高:表示優先順序越低,例如19,該進程容易將CPU使用量讓給其他進程。
nice值越低:表示優先順序越高,例如-20,該進程更不傾向於讓出CPU。
遠程連接不上操作步驟
網路
ping 10.0.0.100
埠
telnet 10.0.0.150 22 tcping 10.0.0.150 22
用戶
root
密碼
1
使用nice命令指定進程優先順序
#打開一個終端
[root@zls ~]# nice -n -5 vim zls
#打開另一個終端,查看進程的優先順序
[root@zls ~]# ps aux|grep [v]im
root 2342 0.1 0.2 151720 5212 pts/1 S<+ 19:49 0:00 vim zls
[root@zls ~]# ps axo command,nice|grep [v]im
vim zls -5
使用renice調整已運行程式的優先順序
#先查看sshd的優先順序
[root@zls ~]# ps axo pid,command,nice|grep 摺疊shd
869 /usr/sbin/sshd -D 0
1194 sshd: root@pts/0 0
1307 sshd: root@pts/1 0
1574 sshd: root@pts/2 0
#設置sshd的優先順序為-20
[root@zls ~]# renice -n -20 869
869 (進程 ID) 舊優先順序為 0,新優先順序為 -20
#再次查看sshd的優先順序
[root@zls ~]# ps axo pid,command,nice|grep 摺疊shd
869 /usr/sbin/sshd -D -20
1194 sshd: root@pts/0 0
1307 sshd: root@pts/1 0
1574 sshd: root@pts/2 0
#一定要退出終端重新連接
[root@zls ~]# exit
登出
#再檢查,就可以看到當前終端的優先順序變化了
[root@zls ~]# ps axo pid,command,nice|grep sshd
869 /usr/sbin/sshd -D -20
1194 sshd: root@pts/0 0
1574 sshd: root@pts/2 0
2361 sshd: root@pts/1 -20
企業案例,linux假死
什麼是假死
所謂假死,就是能ping通,但是ssh不上去;任何其他操作也都沒反應,包括上面部署的nginx也打不開頁面。
假死如何實現
有一個確定可以把系統搞成假死的辦法是:主進程分配固定記憶體,然後不停的fork,並且在子進程裡面sleep(100)。
也就是說,當主進程不停fork的時候,很快會把系統的物理記憶體用完,當物理記憶體不足時候,系統會開始使用swap;那麼當swap不足時會觸發oom killer進程;
當oom killer殺掉了子進程,主進程會立刻fork新的子進程,並再次導致記憶體用完,再次觸發oom killer進程,於是進入死迴圈。而且oom killer是系統底層優先順序很高的內核線程,也在參與死迴圈。
系統假死為何能ping同無法連接
此時機器可以ping通,但是無法ssh上去。這是由於ping是在系統底層處理的,沒有參與進程調度;sshd要參與進程調度,但是優先順序沒oom killer高,總得不到調度。
怎樣解決
其實建議使用nice將sshd的進程優先順序調高。這樣當系統記憶體吃緊,還能勉強登陸sshd,進入調試。然後分析故障
後臺進程管理
後臺進程
通常進程都會在終端前臺運行,但是一旦關閉終端,進程也會隨著結束,那麼此時我們就希望進程能在後臺運行,就是將在前臺運行的進程放到後臺運行,這樣即使我們關閉了終端也不影響進程的正常運行。
為什麼要把進程放到後臺運行
企業中很多時候會有一些需求:
1.傳輸大文件,由於網路問題需要傳輸很久
2.我們之前的國外業務,國內到國外,網速很慢,我們需要選擇節點做跳板機,那麼就必須知道,哪個節點到其他地區網速最快,丟包率最低。
3.有些服務沒有啟動腳本,那麼我們就需要手動運行,並把他們放到後臺
後臺進程管理
jobs:查看後臺進程
bg:永久放到後臺
fg:調出後臺任務
screen
#安裝screen命令
[root@zls ~]# yum install -y screen
#安裝redis
[root@zls ~]# yum install -y redis
#啟動redis
[root@zls ~]# redis-server
#放到後臺ctrl + z
[1]+ 已停止 redis-server
#關閉終端,redis進程就沒有了
#下載mysql安裝包
[root@zls ~]# wget https://downloads.mysql.com/archives/get/file/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
#使用screen
[root@zls ~]# screen -S download_mysqld
#ctrl + a + d放置後臺
[detached from 3567.download_mysqld]
#查看screen列表
[root@zls ~]# screen -list
There is a screen on:
3567.download_mysqld (Detached)
1 Socket in /var/run/screen/S-root.
#打開screen終端
[root@zls ~]# screen -r 3567
系統平均負載
每次發現系統變慢時,我們通常做的第一件事,就是執行top或者uptime命令,來瞭解系統的負載情況。
[root@zls ~]# uptime
20:45:42 up 8:56, 3 users, load average: 0.01, 0.03, 0.05
#我們已經比較熟悉前面幾個例子,他們分別是當前時間,系統運行時間,以及正在登陸用戶數
#後面三個數依次是:過去1分鐘,5分鐘,15分鐘的平均負載(Load Average)
平均負載
那到底如何理解平均負載:平均負載是指,單位時間內,系統處於可運行狀態和不可中斷狀態的平均進程數,也就是平均活躍進程數
PS:平均負載與CPU使用率並沒有直接關係。
可運行狀態和不可中斷狀態是什麼?
1.可運行狀態進程,是指正在使用CPU或者正在等待CPU的進程,也就是我們用PS命令看的處於R狀態的進程
2.不可中斷進程,(你在做什麼事情的時候是不能被打斷的呢?...不可描述)系統中最常見的是等待硬體設備的IO相應,也就是我們PS命令中看到的D狀態(也成為Disk Sleep)的進程。
例如:當一個進程向磁碟讀寫數據時,為了保證數據的一致性,在得到磁碟回覆前,他是不能被其他進程或者中斷程式打斷的,這個是後續的進程就處於不可中斷的狀態,如果此時進程強制被打斷,kill -9 ... perfect準備好護照吧,有多遠,走多遠,千萬別回來了。不可中斷狀態實際上是系統對進程和硬體設備的一種保護機制
因此,可以簡單理解為,平均負載其實就是單位時間內的活躍進程數。
平均負載與CPU的使用率有什麼關係
在十幾工作中,我們經常容易把平均負載和CPU使用率混淆,所以在這裡,我也做一個區分,可能你會感覺到疑惑,既然平均負載代表的是活躍進程數,那平均負載搞了,不就意味著CPU使用率高嘛?
我們還是要回到平均負載的含義上來,平均負載指的是每單位時間內,處於可運行狀態和不可中斷狀態的進程數,所以,它不僅包括了正在使用CPU的進程數,還包括等待CPU和等待IO的進程數。
而CPU的使用率是單位時間內,CPU繁忙情況的統計,跟平均浮現在並不一定完全對應。
比如:
CPU密集型進程,使用大量的CPU會導致平均負載升高,此時這兩者是一致的。
IO密集型進程,等待IO也會導致平均負載升高,但CPU使用率不一定很高。
大量等待CPU的進程調度也會導致平均負載升高,此時的CPU使用率也會比較高。
但是CPU的種類也分兩種:
CPU密集型
IO密集型
例如MySQL伺服器,就需要儘量選擇使用IO密集型CPU
平均負載案例分析實戰
下麵我們以三個示例分別來看這三中情況,並用:stress、mpstat、pidstat等工具找出平均負載升高的根源
stress
是Linux系統壓力測試工具,這裡我們用作異常進程模擬平均負載升高的場景。
mpstat
是多核CPU性能分析工具,用來實時檢查每個CPU的性能指標,以及所有CPU的平均指標。
pidstat
是一個常用的進程性能分析工具,用來實時查看進程的CPU,記憶體,IO,以及上下文切換等性能指標。
#安裝stress,命令sysstat
yum provides strees #找尋安裝包
[root@zls ~]# yum install -y stress
[root@zls ~]# yum install -y sysstat
案例一:CPU密集型
我們在第一個中斷運行stress命令,模擬一個CPU使用率100%的場景:
#第一個終端執行
[root@zls ~]# stress --cpu 1 --timeout 600
#第二個終端查看
[root@zls ~]# uptime
22:04:12 up 10:15, 4 users, load average: 1.98, 0.57, 0.22
#高亮顯示變化區域
[root@zls ~]# watch -d uptime
Every 2.0s: uptime Sun Jul 14 22:05:16 2019
22:05:16 up 10:16, 4 users, load average: 2.84, 1.05, 0.41
使用mpstat查看CPU使用率的變化情況
[root@zls ~]# mpstat -P ALL 5
Linux 3.10.0-862.el7.x86_64 (zls) 2019年07月14日 _x86_64_ (1 CPU)
22時08分51秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
22時08分56秒 all 99.20 0.00 0.80 0.00 0.00 0.00 0.00 0.00 0.00 0.00
22時08分56秒 0 99.20 0.00 0.80 0.00 0.00 0.00 0.00 0.00 0.00 0.00
22時08分56秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
22時09分01秒 all 99.60 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 0.00
22時09分01秒 0 99.60 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 0.00
從終端2可以看到,1分鐘平均負載會慢慢增加到2.00,而從終端三中還可以看到,正好有一個CPU的使用率為100%,但他的IOwait只有0,這說明平均負載的升高正式由於CPU使用率為100%,那麼到底哪個進程導致CPU使用率為100%呢?可以使用pidstat來查詢
#間隔5秒輸出一組數據
[root@zls ~]# pidstat -u 5 1
Linux 3.10.0-862.el7.x86_64 (zls) 2019年07月14日 _x86_64_ (1 CPU)
22時14分00秒 UID PID %usr %system %guest %CPU CPU Command
22時14分05秒 0 8349 0.00 0.20 0.00 0.20 0 kworker/0:3
22時14分05秒 0 9903 99.60 0.00 0.00 99.60 0 stress
平均時間: UID PID %usr %system %guest %CPU CPU Command
平均時間: 0 8349 0.00 0.20 0.00 0.20 - kworker/0:3
平均時間: 0 9903 99.60 0.00 0.00 99.60 - stress
案例二:I/O密集型
還是使用stress命令,但是這次模擬IO的壓力
[root@zls ~]# stress --io 1 --timeout 600s
在第二個終端運行uptime查看平均負載的變化情況
[root@zls ~]# watch -d uptime
Every 2.0s: uptime Sun Jul 14 22:17:38 2019
22:17:38 up 10:28, 4 users, load average: 2.47, 2.25, 1.61
在第三個終端運行mpstat查看CPU使用率的變化情況
[root@zls ~]# mpstat -P ALL 5
Linux 3.10.0-862.el7.x86_64 (zls) 2019年07月14日 _x86_64_ (1 CPU)
22時19分32秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
22時19分37秒 all 2.78 0.00 97.22 0.00 0.00 0.00 0.00 0.00 0.00 0.00
22時19分37秒 0 2.78 0.00 97.22 0.00 0.00 0.00 0.00 0.00 0.00 0.00
22時19分37秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
22時19分42秒 all 3.01 0.00 96.99 0.00 0.00 0.00 0.00 0.00 0.00 0.00
22時19分42秒 0 3.01 0.00 96.99 0.00 0.00 0.00 0.00 0.00 0.00 0.00
#發現CPU與內核打交道的sys占用非常高
那麼到底哪個進程導致iowait這麼高呢?
[root@zls ~]# pidstat -u 5 1
Linux 3.10.0-862.el7.x86_64 (zls) 2019年07月14日 _x86_64_ (1 CPU)
22時20分59秒 UID PID %usr %system %guest %CPU CPU Command
22時21分04秒 0 6900 0.00 0.20 0.00 0.20 0 kworker/0:0
22時21分04秒 0 10104 2.76 83.07 0.00 85.83 0 stress
22時21分04秒 0 10105 0.00 10.63 0.00 10.63 0 kworker/u256:2
平均時間: UID PID %usr %system %guest %CPU CPU Command
平均時間: 0 6900 0.00 0.20 0.00 0.20 - kworker/0:0
平均時間: 0 10104 2.76 83.07 0.00 85.83 - stress
平均時間: 0 10105 0.00 10.63 0.00 10.63 - kworker/u256:2
這時候發現看到的數據比較少,需要更新一下命令:
#下載新版本的包
[root@zls ~]# wget http://pagesperso-orange.fr/sebastien.godard/sysstat-11.7.3-1.x86_64.rpm
#升級到新版本
[root@zls ~]# rpm -Uvh sysstat-11.7.3-1.x86_64.rpm
準備中... ################################# [100%]
正在升級/安裝...
1:sysstat-11.7.3-1 ################################# [ 50%]
正在清理/刪除...
2:sysstat-10.1.5-17.el7 ################################# [100%]
然後再次查看結果,明顯顯示的數據多了
[root@zls ~]# pidstat -u 5 1
Linux 3.10.0-862.el7.x86_64 (zls) 2019年07月14日 _x86_64_ (1 CPU)
22時24分40秒 UID PID %usr %system %guest %wait %CPU CPU Command
22時24分45秒 0 281 0.00 0.20 0.00 0.40 0.20 0 xfsaild/sda3
22時24分45秒 0 10104 2.99 82.67 0.00 0.00 85.66 0 stress
22時24分45秒 0 10105 0.00 8.76 0.00 92.43 8.76 0 kworker/u256:2
22時24分45秒 0 10118 0.20 0.40 0.00 0.00 0.60 0 watch
22時24分45秒 0 10439 0.00 3.98 0.00 94.82 3.98 0 kworker/u256:3
22時24分45秒 0 11007 0.00 0.20 0.00 0.00 0.20 0 pidstat
平均時間: UID PID %usr %system %guest %wait %CPU CPU Command
平均時間: 0 281 0.00 0.20 0.00 0.40 0.20 - xfsaild/sda3
平均時間: 0 10104 2.99 82.67 0.00 0.00 85.66 - stress
平均時間: 0 10105 0.00 8.76 0.00 92.43 8.76 - kworker/u256:2
平均時間: 0 10118 0.20 0.40 0.00 0.00 0.60 - watch
平均時間: 0 10439 0.00 3.98 0.00 94.82 3.98 - kworker/u256:3
平均時間: 0 11007 0.00 0.20 0.00 0.00 0.20 - pidstat
案例三:大量進程的場景
當系統運行進程超出CPU運行能力時,就會出現等待CPU的進程。
1.首先,我們還是使用stress命令,模擬的是多個進程
[root@zls ~]# stress -c 4 --timeout 600
2.由於系統只有一個CPU,明顯比4個進程要少的多。因此,系統的CPU處於嚴重過載狀態
[root@zls ~]#
Every 2.0s: uptime Sun Jul 14 22:28:50 2019
22:28:50 up 10:39, 4 users, load average: 3.96, 3.89, 3.00
3.在運行pidstat命令來查看一下進程的情況
[root@zls ~]# pidstat -u 5 1
Linux 3.10.0-862.el7.x86_64 (zls) 2019年07月14日 _x86_64_ (1 CPU)
22時31分12秒 UID PID %usr %system %guest %wait %CPU CPU Command
22時31分17秒 0 11317 24.75 0.00 0.00 75.05 24.75 0 stress
22時31分17秒 0 11318 24.95 0.00 0.00 75.45 24.95 0 stress
22時31分17秒 0 11319 24.75 0.00 0.00 75.25 24.75 0 stress
22時31分17秒 0 11320 24.75 0.00 0.00 75.45 24.75 0 stress
22時31分17秒 0 11381 0.20 0.40 0.00 0.00 0.60 0 watch
22時31分17秒 0 11665 0.00 0.20 0.00 0.00 0.20 0 pidstat
平均時間: UID PID %usr %system %guest %wait %CPU CPU Command
平均時間: 0 11317 24.75 0.00 0.00 75.05 24.75 - stress
平均時間: 0 11318 24.95 0.00 0.00 75.45 24.95 - stress
平均時間: 0 11319 24.75 0.00 0.00 75.25 24.75 - stress
平均時間: 0 11320 24.75 0.00 0.00 75.45 24.75 - stress
平均時間: 0 11381 0.20 0.40 0.00 0.00 0.60 - watch
平均時間: 0 11665 0.00 0.20 0.00 0.00 0.20 - pidstat
總結
1.平均負載高有可能是CPU密集型進程導致的
2.平均負載高並不一定代表CPU的使用率就一定高,還有可能是I/O繁忙
3.當發現負載高時,可以使用mpstat、pidstat等工具,快速定位到,負載高的原因,從而做出處理