2013-08-16 172 views
0

計算如何運行的隊列長度我試圖獲得來自Linux內核可運行的進程數。 sar -q很容易提供這些信息。但是我試圖從/ proc文件系統獲取這個值。/proc中沒有直接給出該值的文件,那麼runq-sz是如何計算的。 維基頁面http://en.wikipedia.org/wiki/Load_(computing)提供了一些洞察基於ldavg值是如何運行隊列長度計算的,但目前還不清楚。 有人可以提供更多關於這方面的指針。乾杯在Linux proc文件系統

回答

0

正如GCLA說你的貓使用

cat /proc/loadavg 

,以從內核中讀取的loadavarage - 但嚴格來說,它不是一個隊列長度。

看一看

grep procs_running /proc/stat 

grep procs_blocked /proc/stat 

首先是一個實際運行隊列和第二個是一個數阻塞磁盤IO處理的。負載平均值是兩者之和的函數。

0

這裏是在SYSSTAT守護進程提供信息SAR打印出功能:

https://github.com/sysstat/sysstat/blob/master/rd_stats.c#L392

if ((fp = fopen(LOADAVG, "r")) == NULL) 
     return; 

/* Read load averages and queue length */ 
fscanf(fp, "%d.%d %d.%d %d.%d %ld/%d %*d\n", 
     &load_tmp[0], &st_queue->load_avg_1, 
     &load_tmp[1], &st_queue->load_avg_5, 
     &load_tmp[2], &st_queue->load_avg_15, 
     &st_queue->nr_running, 
     &st_queue->nr_threads); 

/proc/loadavg,這是由這個內核功能填充的讀取

http://lxr.free-electrons.com/source/fs/proc/loadavg.c#L13

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; 
} 

nr_running()功能提供了總的兩當前正在運行的任務和準備在CPU上運行的任務;這是一個即時的措施。我相信,這將排隊與sarrunq-sz變量。

格雷厄姆