本篇是Linux性能實戰筆記java
咱們使用uptime
命令來查看平均負載。mysql
通常來講,會由三種場景緻使平均負載的升高。一種是存在CPU密集型的進程,一種是存在IO密集型的進程,還有一種是存在大量的進程致使CPU頻繁切換。sql
Linux機器準備,我這裏準備了一臺CentOs的機器。機器是1核心2GB內存的。docker
安裝stress
和sysstat
在CentOS
下可使用以下命令安裝stress
centos
sudo yum install stress sysstat
複製代碼
使用uptime
命令查看系統初始的負載狀況。bash
uptime
複製代碼
能夠獲得以下結果。工具
[jack@VM_31_196_centos ~]$ uptime
16:44:06 up 126 days, 21:39, 1 user, load average: 0.01, 0.05, 0.05
複製代碼
1分鐘,5分鐘,15分鐘的平均負載都在5%之內。性能
在第一個終端,使用stress
,模擬一個CPU使用率100%的場景spa
stress --cpu 1 --timeout 600
複製代碼
這裏使用stress
命令來對一個CPU形成100%壓力,持續時間爲600秒。code
在第二個終端中,使用uptime
來查看系統的負載狀況。
watch -d uptime
16:54:40 up 126 days, 21:49, 3 users, load average: 2.76, 2.07, 1.05
複製代碼
使用watch
命令表示每隔2秒輸出一個uptime的結果。能夠看到當前1分鐘的CPU的使用率已經達到了276%。不過我估計這個值也不是很是準確。仍是下面的mpstat來的更加準確一些。
在第三個終端使用mpstat來查看CPU使用的具體狀況。
[jack@VM_31_196_centos ~]$ mpstat -P ALL 5
Linux 3.10.0-693.el7.x86_64 (VM_31_196_centos) 09/22/2019 _x86_64_ (1 CPU)
04:49:27 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
04:49:32 PM all 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
04:49:32 PM 0 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
複製代碼
mpstat -P ALL 5
中-P ALL
表示監控全部的CPU,5表示每隔5秒輸出一組數據。
從終端三中能夠看到序號爲0的CPU的使用率是100%,可是iowait確實0。說明平均負載的升高是因爲CPU的使用率致使的。
那麼如何找到使得平均負載升高的進程呢?可使用pidstat來找到這個進程。
[jack@VM_31_196_centos ~]$ pidstat -u 5 1
Linux 3.10.0-693.el7.x86_64 (VM_31_196_centos) 09/22/2019 _x86_64_ (1 CPU)
05:01:24 PM UID PID %usr %system %guest %CPU CPU Command
05:01:29 PM 27 5834 0.20 0.00 0.00 0.20 0 mysqld
05:01:29 PM 1000 8814 99.00 0.00 0.00 99.00 0 stress
05:01:29 PM 1000 8829 0.20 0.00 0.00 0.20 0 watch
05:01:29 PM 0 27330 0.20 0.00 0.00 0.20 0 java
05:01:29 PM 0 28977 0.20 0.00 0.00 0.20 0 barad_agent
複製代碼
能夠看到stress
佔用了99%的CPU資源。
首先仍是使用stress
來模擬IO密集的狀況。
stress -i 1 --timeout 600
複製代碼
上面表示不停的進行sync,而且持續600秒的時間。
在第二個終端上面執行uptime
。
watch -d uptime
複製代碼
能夠看到平均負載也不斷升高到了1.56。
使用mpstat來查看各個CPU的狀況。
[jack@VM_31_196_centos ~]$ mpstat -P ALL 5
Linux 3.10.0-693.el7.x86_64 (VM_31_196_centos) 09/22/2019 _x86_64_ (1 CPU)
05:04:10 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
05:04:15 PM all 1.21 0.00 63.31 35.48 0.00 0.00 0.00 0.00 0.00 0.00
05:04:15 PM 0 1.21 0.00 63.31 35.48 0.00 0.00 0.00 0.00 0.00 0.00
複製代碼
能夠看到序號爲0的CPU的sys爲63,而iowait是35,能夠認爲是iowait太高致使,平均負載上升。
仍是使用pidstat命令來查看是哪個進程致使CPU的平均負載太高?
[jack@VM_31_196_centos ~]$ pidstat -u 5 1
Linux 3.10.0-693.el7.x86_64 (VM_31_196_centos) 09/22/2019 _x86_64_ (1 CPU)
05:04:35 PM UID PID %usr %system %guest %CPU CPU Command
05:04:40 PM 0 258 0.00 0.20 0.00 0.20 0 jbd2/vda1-8
05:04:40 PM 0 366 0.00 0.40 0.00 0.40 0 kworker/0:1H
05:04:40 PM 0 1642 0.00 0.20 0.00 0.20 0 kworker/u2:2
05:04:40 PM 1000 8829 0.20 0.20 0.00 0.40 0 watch
05:04:40 PM 1000 9300 0.00 65.12 0.00 65.12 0 stress
05:04:40 PM 0 11852 0.20 0.00 0.00 0.20 0 YDService
05:04:40 PM 0 27330 0.00 0.20 0.00 0.20 0 java
05:04:40 PM 0 28978 0.00 0.20 0.00 0.20 0 barad_agent
複製代碼
能夠看到仍是stress進程致使的。
使用stress模擬4個進程,由於當前機器只有一個CPU,因此確定是大大查過當前CPU所能處理的繼承的數量的。
使用pidstat來查看哪一個進程佔用了大量的CPU資源。
[jack@VM_31_196_centos ~]$ pidstat -u 5 1
Linux 3.10.0-693.el7.x86_64 (VM_31_196_centos) 09/22/2019 _x86_64_ (1 CPU)
05:17:48 PM UID PID %usr %system %guest %CPU CPU Command
05:17:53 PM 0 7255 0.20 0.00 0.00 0.20 0 dockerd
05:17:53 PM 1000 8829 0.20 0.00 0.00 0.20 0 watch
05:17:53 PM 1000 11248 24.90 0.00 0.00 24.90 0 stress
05:17:53 PM 1000 11249 24.50 0.00 0.00 24.50 0 stress
05:17:53 PM 1000 11250 24.50 0.00 0.00 24.50 0 stress
05:17:53 PM 1000 11251 24.70 0.00 0.00 24.70 0 stress
05:17:53 PM 0 11852 0.00 0.20 0.00 0.20 0 YDService
05:17:53 PM 0 27330 0.20 0.00 0.00 0.20 0 java
05:17:53 PM 0 28978 0.20 0.00 0.00 0.20 0 barad_agent
複製代碼
能夠看到4個stress進程佔用了全部的CPU資源。不過不知道爲何沒有像專欄中存在wait列?
iowait沒法升高的問題,是由於案例中stress使用的是 sync() 系統調用,它的做用是刷新緩衝區內存到磁盤中。對於新安裝的虛擬機,緩衝區可能比較小,沒法產生大的IO壓力,這樣大部分就都是系統調用的消耗了。因此,你會看到只有系統CPU使用率升高。解決方法是使用stress的下一代stress-ng,它支持更豐富的選項,好比 stress-ng -i 1 --hdd 1 --timeout 600(--hdd表示讀寫臨時文件)。
pidstat輸出中沒有%wait的問題,是由於CentOS默認的sysstat稍微有點老,源碼或者RPM升級到11.5.5版本之後就能夠看到了。而Ubuntu的包通常都比較新,沒有這個問題。
mpstat沒法觀測的問題,案例中是等待5秒後輸出1次結果就中止了,更好的作法是持續監控一段時間,好比持續觀測20次:mpstat -P ALL 5 20
"百天"寫做計劃下半部。
每週更新一篇碎碎念。
每週3、週六更新一篇儘可能全面,詳細的文章。
可能時長突破了百天,可是又有什麼關係呢?提升寫做水平,造成寫做的習慣纔是最終的目的。
若是這篇文章給你帶來了一些幫助,能夠動動手指點個贊,順便關注一波就更好了。
若是上面都沒有,那麼寫下讀完以後最想說的話?有效的反饋和你的鼓勵是對我最大的幫助。
另外打算把博客給從新撿起來了。歡迎你們來訪問吃西瓜。
我是shane。今天是2019年9月22日。"百天"寫做計劃下半部,53/100。