由于dpdk的程序利用cpu affinity机制,进程绑定在cpu上,抢占了cpu,从top命令观察cpu的使用率始终为100%,在调试dpdk多进程中,需要知道当前dpdk进程所占用的核上是否有其他的进程在运行,影响了dpdk进程的效率,可以利用ps命令结合grep命令查看。
假设dpdk的进程绑定在cpu0-14的核上:
ps -eo pid,psr,command,%cpu | egrep "^.{5}[[:space:]]+\<([0-9]|1[0-4])\>" | egrep -v "^.*\<(0.0)\>$"
即可查看。
------------------------------------------------------------------------------------------------------------------------------------------------------------
下面是关于命令简单描述,
关于ps的命令,可以通过查看man ps得知,简单描述一下,ps -eo是指用户自定义输入格式下输出:
列举上面用到几个标准格式说明符,可以man ps后搜索关键词STANDARD FORMAT SPECIFIERS查看
pid PID a number representing the process ID (alias tgid). |
psr PSR processor that process is currently assigned to. |
command COMMAND See args. (alias args, command). |
pcpu %CPU see %cpu. (alias %cpu). |
pid就是进程的id,别名是tgid,所以ps -eo pid=ps -eo tgid是等价的,psr就是指当前进程所在的核编号,command就是进程的命令包括参数,pcpu就是进程所占cpu的百分比。
egrep和grep基本相同,但egrep可以使用基本的正则表达外, 还可以用扩展表达式,还有一点需要注意,egrep一些地方取消了转义字符的使用,如:
+ 匹配一个或者多个先前的字符, 至少一个先前字符.
? 匹配0个或者多个先前字符.
a|b|c 匹配a或b或c
() 字符组, 如: love(able|ers) 匹配loveable或lovers.
(..)(..)\1\2 模板匹配. \1代表前面第一个模板, \2代第二个括弧里面的模板.
x{m,n} =x\{m,n\} x的字符数量在m到n个之间.
我觉得egrep用起来比较顺手,详细的参考博文:
https://blog.csdn.net/NewThinker_wei/article/details/8219293
egrep "^.{5}[[:space:]]+\<([0-9]|1[0-4])\>"
由于pid是占五个字符,刚开始匹配任意五个字符,紧接着至少一个空格,匹配完整单词,0-14。
egrep -v "^.*\<(0.0)\>$"
表示过滤cpu占比为0.0的进程