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

問題描述

有客戶反饋他們的一臺ECS週期性地load升高,他們的業務流量並無上升,須要咱們排查是什麼緣由形成的,是否由於底層異常?函數

要弄清Linux虛機load高,咱們要搞清楚Linux top命令中Load的含義。spa

Load average的值從何而來

在使用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的計算函數:對象

相關文章
相關標籤/搜索