找到Linux虛機Load高的"元凶"
阿新 • • 發佈:2018-11-29
問題描述
有客戶反饋他們的一臺ECS週期性地load升高,他們的業務流量並沒有上升,需要我們排查是什麼原因造成的,是否因為底層異常?
要弄清Linux虛機load高,我們要搞清楚Linux top命令中Load的含義。
Load average的值從何而來
在使用top
命令檢查系統負載的時候,可以看到Load averages
欄位,但是這個欄位並不是表示CPU的繁忙程度,而是度量系統整體負載。
Load averages
取樣是從/proc/loadavg
中獲取的:
0.00 0.01 0.05 1/161 29703 每個值的含義依次為: lavg_1 (0.00) 1-分鐘平均負載 lavg_5 (0.01) 5-分鐘平均負載 lavg_15(0.05) 15-分鐘平均負載 nr_running (1) 在取樣時刻,執行佇列的任務的數目,與/proc/stat的procs_running表示相同意思,這個數值是當前可執行的核心排程物件(程序,執行緒)。 nr_threads (161) 在取樣時刻,系統中活躍的任務的個數(不包括執行已經結束的任務),即這個數值表示當前存在系統中的核心可排程物件的數量。 last_pid(29703) 系統最近建立的程序的PID,包括輕量級程序,即執行緒。 假設當前有兩個CPU,則每個CPU的當前任務數為0.00/2=0.00 如果你看到load average數值是10,則表明平均有10個程序在執行或等待狀態。有可能系統有很高的負載但是CPU使用率卻很低,或者負載很低而CPU利用率很高,因為這兩者沒有直接關係。
Linux 原始碼中關於這一塊的說明:
static int loadavg_proc_show(struct seq_file *m, void *v) { unsigned long avnrun[3]; get_avenrun(avnrun, FIXED_1/200, 0); seq_printf(m, "%lu.%02lu %lu.%02lu %lu.%02lu %ld/%d %d\n", LOAD_INT(avnrun[0]), LOAD_FRAC(avnrun[0]), LOAD_INT(avnrun[1]), LOAD_FRAC(avnrun[1]), LOAD_INT(avnrun[2]), LOAD_FRAC(avnrun[2]), nr_running(), nr_threads, task_active_pid_ns(current)->last_pid); return 0; }
Load的計算函式: