1. 程式人生 > >找到Linux虛機Load高的"元凶"

找到Linux虛機Load高的"元凶"

問題描述

有客戶反饋他們的一臺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的計算函式: