runplat的作用在调度性能分析这块十分的重要,其作用是主要检测一个tasks从运行队列中到运行需要等待的时延。
老样子,先从help说起:
usage: runqlat.py [-h] [-T] [-m] [-P] [--pidnss] [-L] [-p PID] [interval] [count] Summarize run queue (scheduler) latency as a histogram positional arguments: interval output interval, in seconds #输出间隔时间 count number of outputs #输出次数 optional arguments: -h, --help show this help message and exit -T, --timestamp include timestamp on output #时间戳 -m, --milliseconds millisecond histogram # 毫秒形式线上 -P, --pids print a histogram per process ID #显示每一个进程PID的时延情况的矩形图 --pidnss print a histogram per PID namespace #显示每一个 -L, --tids print a histogram per thread ID #显示每一个线程ID的柱形图 -p PID, --pid PID trace this PID only #仅跟踪某一个pid的时延·
./runqlat -m 5 3
以每5秒的形式时延情况,一共线上三次
Tracing run queue latency... Hit Ctrl-C to end. msecs : count distribution 0 -> 1 : 3818 |****************************************| 2 -> 3 : 39 | | 4 -> 7 : 39 | | 8 -> 15 : 62 | | 16 -> 31 : 2214 |*********************** | 32 -> 63 : 226 |** | msecs : count distribution 0 -> 1 : 3775 |****************************************| 2 -> 3 : 52 | | 4 -> 7 : 37 | | 8 -> 15 : 65 | | 16 -> 31 : 2230 |*********************** | 32 -> 63 : 212 |** | msecs : count distribution 0 -> 1 : 3816 |****************************************| 2 -> 3 : 49 | | 4 -> 7 : 40 | | 8 -> 15 : 53 | | 16 -> 31 : 2228 |*********************** | 32 -> 63 : 221 |** |
./runqlat -mp 4505 1
仅显示pid为4505的时延,并且每1毫秒线上一次。
Tracing run queue latency... Hit Ctrl-C to end. msecs : count distribution 0 -> 1 : 1 |* | 2 -> 3 : 2 |*** | 4 -> 7 : 1 |* | 8 -> 15 : 0 | | 16 -> 31 : 25 |****************************************| 32 -> 63 : 3 |**** | msecs : count distribution 0 -> 1 : 0 | | 2 -> 3 : 2 |** | 4 -> 7 : 0 | |
为了对比,这里采用pidstat指令跟踪下其cpu消耗情况
pidstat -p 4505 1 Linux 4.4.0-virtual (bgregg-xxxxxxxx) 02/08/2016 _x86_64_ (8 CPU) 08:56:11 AM UID PID %usr %system %guest %CPU CPU Command 08:56:12 AM 0 4505 9.00 3.00 0.00 12.00 0 bash 08:56:13 AM 0 4505 7.00 5.00 0.00 12.00 0 bash 08:56:14 AM 0 4505 10.00 2.00 0.00 12.00 0 bash 08:56:15 AM 0 4505 11.00 2.00 0.00 13.00 0 bash 08:56:16 AM 0 4505 9.00 3.00 0.00 12.00 0 bash
从上面的对比可以看出,pid为4505的进程,只利用了12%cpu,其余时间其都在运行队列中等待被运行(不考虑睡眠问题)
./runqlat 5 1 Tracing run queue latency... Hit Ctrl-C to end. usecs : count distribution 0 -> 1 : 2250 |******************************** | 2 -> 3 : 2340 |********************************** | 4 -> 7 : 2746 |****************************************| 8 -> 15 : 418 |****** | 16 -> 31 : 93 |* | 32 -> 63 : 28 | |
同样为了分析,什么样的时延才是我们需要的,其实是希望时延越小越好,所以希望矩形图处于0-1区间的数目越多越好。
./runqlat -P
显示每一个进程的矩形图
pid = 0 usecs : count distribution 0 -> 1 : 351 |******************************** | 2 -> 3 : 96 |******** | 4 -> 7 : 437 |****************************************| 8 -> 15 : 12 |* | pid = 12929 usecs : count distribution 0 -> 1 : 1 |****************************************| 2 -> 3 : 0 | | 4 -> 7 : 1 |****************************************| pid = 12930 usecs : count distribution 0 -> 1 : 0 | | 2 -> 3 : 0 | | 4 -> 7 : 0 | | 8 -> 15 : 0 | | 16 -> 31 : 1 |****************************************| pid = 12931 usecs : count distribution 0 -> 1 : 0 | | 2 -> 3 : 0 | | 4 -> 7 : 1 |******************** |
./runqlat -L
显示每一个线程ID的矩形图
tid = 0 usecs : count distribution 0 -> 1 : 593 |**************************** | 2 -> 3 : 829 |****************************************| 4 -> 7 : 300 |************** | 8 -> 15 : 321 |*************** | 16 -> 31 : 132 |****** | 32 -> 63 : 58 |** | 64 -> 127 : 0 | | 128 -> 255 : 0 | | 256 -> 511 : 13 | | tid = 7 usecs : count distribution 0 -> 1 : 8 |******** | 2 -> 3 : 19 |******************** | 4 -> 7 : 37 |****************************************| [...]
./runqlat --pidnss -m
显示每一个进程的命名空间,并且打印其矩形图
pidns = 4026532870 msecs : count distribution 0 -> 1 : 40 |****************************************| 2 -> 3 : 1 |* | 4 -> 7 : 0 | | 8 -> 15 : 0 | | 16 -> 31 : 0 | | 32 -> 63 : 2 |** | 64 -> 127 : 5 |***** | pidns = 4026532809 msecs : count distribution 0 -> 1 : 67 |****************************************|