有客戶反饋他們的一臺ECS週期性地load升高,他們的業務流量並無上升,須要咱們排查是什麼緣由形成的,是否由於底層異常?函數
要弄清Linux虛機load高,咱們要搞清楚Linux top命令中Load的含義。spa
在使用top
命令檢查系統負載的時候,能夠看到Load averages
字段,可是這個字段並非表示CPU的繁忙程度,而是度量系統總體負載。線程
Load averages
採樣是從/proc/loadavg
中獲取的:code
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的計算函數:對象