有一回面試,面試官提了一個問題,cpu 使用率不高,可是 Load (平均負載) 很高,你如何查找問題?面試
當時我不明白 Load 的意思,面試官解釋說這個指標反映不可中斷狀態的進程比較多。我遂根據過日後端開發經驗,回答可能系統中 io 阻塞比較多,多發於網絡 io 問題,用命令 netstat -tnp
看看 tcp 鏈接中 time_wait 狀態多很少...shell
我知道個人回答很片面,過後複習,作筆記。後端
熟悉 Linux 者知道,使用 top
uptime
命令能夠查看 load average
指標。網絡
使用 man uptime
查看 Load average 解釋:tcp
System load averages is the average number of processes that are either in a runnable or uninterruptable state. A process in a runnable state is either using the CPU or waiting to use the CPU. A process in uninterruptable state is waiting for some I/O access, eg waiting for disk. The averages are taken over the three time intervals. Load averages are not normalized for the number of CPUs in a system, so a load average of 1 means a single CPU system is loaded all the time while on a 4 CPU system it means it was idle 75% of the time.
理解關鍵地方,平均負載是指,在單位時間內,系統中處於 可運行狀態 與 不可中斷狀態 的平均進程數,簡稱平均活躍進程數。值得注意的是,它與 CPU 使用率沒有直接關係工具
使用命令 ps aux
能夠查看進程的狀態 stat,如本文要注意的:性能
D 狀態爲什麼不可打斷呢,舉個例子,系統調用起硬件設備的 I/O 響應,爲了保證數據的一致性,在磁盤設備返回數據前,它是不能倍其餘進程或者中斷打斷的,若是被打斷,就容易形成磁盤數據與進程數據不一致的問題。因而,不可中斷(D)狀態是系統對進程與硬件設備的一種保護機制。測試
平均活躍進程數,嚴格意義上,它是活躍進程數的指數衰減平均值(某個量的降低速度和它的值成比例)。一般狀況下,理解爲單位時間上的活躍進程數便可。spa
從 CPU 角度來講,Load average 只是反映單位時間內佔用 CPU 的進程數量,而 CPU 利用率與進程數量沒有直接關係,咱們可使用命令 top
vmstat
查看 CPU 的利用率,有如下幾個指標:線程
通常來說,Load average 低於 CPU 數量的話,機器性能知足服務需求,超出一些也不要緊,Load average 不直接表明 CPU 利用率,多是 io 阻塞比較多。當 Load average 高於 CPU 數量的 70%,就可能致使進程響應變慢,進而影響服務的正常功能。
通常來說,top
uptime
提供 load average 三個時間點的指標,分別是:1分鐘、5分鐘、15分鐘。這反映了系統最近的狀態變化趨勢。在實際生產環境中,咱們須要作長期的監控記錄。若是有異常的數值變化,好比平均負載數是CPU的兩倍,須要分析調查問題。
兩類指標的不一樣,組合出如下幾種可能狀況:
咱們如何分析平衡負載與 CPU 利用率這兩類指標不一樣組合的案例,尋找形成指標變化的來源?
如下環境爲 Linux Arch 4.19 / 4 CPU / 8G Memory
stress
系統壓力測試工具sysstat
性能分析工具包:
mpstat
多核 CPU 分析性能工具,mp 的意思是 multi processors (多處理器)pidstat
進程性能分析工具,pid 意爲進程 ID。它用於查看進程的 CPU、內存、I/O以及上下文切換等指標使用 stress 能夠模擬如下場景
# 模擬一個進程, 對 cpu 使用率 100%,限時 600s stress --cpu 1 --timeout 600
stress 的 -i
選項,spawn N workers spinning on sync()
# 模擬一個進程不停的執行 sync stress -i 1 --timeout 600
# 模擬16個進程, 對 cpu 使用率 100%,限時 600s stress --cpu 16 --timeout 600
mpstat -P ALL 5
監控全部 CPU,每隔5秒輸出一組數據,注意指標 %usr
使用率,%iowait
IO 阻塞時間,從這能夠判斷是 CPU 密集型仍是 IO 密集型pidstat -u 5 1
統計間隔5秒內,使用過 CPU 的進程的數據,注意指標 %usr
使用率,%wait
等待使用 CPU 的時間,從這能夠判斷是否進程(線程)過多