1、 taskset
设置,查看进程的cpu亲和性
#taskset -c <cpu-list> <command> 运行程序command,并设置cpu亲和性(CPU affinity)
taskset -c 0 image_search
taskset -c 0-6 image_search
#taskset -c -p <cpu-list> pid 显示进程pid的cpu亲和性设置
taskset -c -p pid
#taskset -c -p <cpu-list> pid 修改进程pid的cpu亲和性设置
taskset -c -p 0-6 pid
使用实例参考:https://diego.assencio.com/?index=4515794de9f941c632d593384ca39dea
查看所有进程的cpu亲和性:
for pid in $(ps -eLf | awk '{print $2}');
do taskset -c -p $pid;
done
多数不允许在系统的所有逻辑核心中运行的线程(不包括用户设置的CPU亲缘关系的线程)是内核线程。 要验证这一点,请使用以下ps命令+PID的输出,以查找不允许在所有CPU上运行的某个进程:
ps -up <pid>
如果进程名称(COMMAND列)显示在方括号内(例如[kdmflush]),则它是内核线程。
2、lscpu
查看CPU的系列,型号等的基本信息,始终基于第一个CPU。
[zxy@host233186 ~]$ lscpu
Architecture: x86_64 #cpu架构
CPU op-mode(s): 32-bit, 64-bit #是否支持64位
Byte Order: Little Endian #小字节序
CPU(s): 16 #16个cpu核心
On-line CPU(s) list: 0-15 #cpulist编号
Thread(s) per core: 1 #是否支持超线程,如果是这里应该是2
Core(s) per socket: 8 #用插槽数表示有少个物理CPU,每个物理cpu可以有多个core核心
Socket(s): 2 #两颗物理cpu
NUMA node(s): 2 #cpu 编号分两段
Vendor ID: GenuineIntel
CPU family: 6
Model: 63
Model name: Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz
Stepping: 2
CPU MHz: 2399.906
BogoMIPS: 4809.15
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 20480K
NUMA node0 CPU(s): 0-7
NUMA node1 CPU(s): 8-15
3、Top 查看线程信息
top -H -p <pid> #查看指定进程号的线程信息,包括cpu和内存利用率
[root@snisspreweb02 ~]# top -H -p 30786
top - 10:36:18 up 840 days, 18:49, 11 users, load average: 14.59, 9.47, 4.33
Tasks: 31 total, 16 running, 15 sleeping, 0 stopped, 0 zombie
Cpu(s): 10.2%us, 34.7%sy, 0.0%ni, 46.5%id, 0.0%wa, 0.0%hi, 0.0%si, 8.6%st
Mem: 65973656k total, 57390508k used, 8583148k free, 2285332k buffers
Swap: 10485752k total, 2603892k used, 7881860k free, 26622400k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
31016 root 20 0 1096m 319m 6512 S 47.5 0.5 0:14.72 python
31014 root 20 0 1096m 319m 6512 S 46.1 0.5 0:14.09 python
31017 root 20 0 1096m 319m 6512 S 45.5 0.5 0:15.14 python
31013 root 20 0 1096m 319m 6512 S 45.1 0.5 0:14.24 python
31015 root 20 0 1096m 319m 6512 S 44.1 0.5 0:15.01 python
31019 root 20 0 1096m 319m 6512 S 42.5 0.5 0:14.91 python
31012 root 20 0 1096m 319m 6512 S 41.8 0.5 0:13.87 python
31018 root 20 0 1096m 319m 6512 S 41.5 0.5 0:15.19 python
31009 root 20 0 1096m 319m 6512 S 40.8 0.5 0:13.50 python
31010 root 20 0 1096m 319m 6512 S 40.8 0.5 0:14.02 python
31008 root 20 0 1096m 319m 6512 S 37.2 0.5 0:13.72 python
31004 root 20 0 1096m 319m 6512 S 36.8 0.5 0:12.43 python
31006 root 20 0 1096m 319m 6512 S 36.5 0.5 0:12.61 python
31005 root 20 0 1096m 319m 6512 S 35.8 0.5 0:12.81 python
31007 root 20 0 1096m 319m 6512 S 35.8 0.5 0:13.29 python
31110 root 20 0 1096m 319m 6512 R 6.6 0.5 0:01.73 python
31113 root 20 0 1096m 319m 6512 R 6.6 0.5 0:01.74 python
30786 root 20 0 1096m 319m 6512 R 6.3 0.5 0:02.45 python
查看指定指定进程名的线程信息使用命令
ps -ef | grep "042_faiss" | grep -v 'grep'| awk '{print $2}' | xargs -i -t top -b -H -p {}
注意: top -b 表示使用batch model,xargs不支持交互操作,不用-b选项会提示错误: “top: failed tty get”。如果要像top命令一样自动刷新,可以尝试下面的命令:
top -H -p $(ps aux | awk '/ProgramName/ && ! /awk/ { print $2; exit; }')
首先执行$()包括的命令,至于为什么,可以看下面的下一张的解释。括号里用的是awk命令,用法牛爆了,正则匹配项有两部分,一个要求包含ProtramName,一个要求不包含awk字样,两者使用&&连接,找到这样的句子执行打印进程号,并awk的操作。后面还得专门总结一下awk的用法,确实很好用。
或者使用pgrep配合top使用,命令更简单
top -H -p $(pgrep ProgameName | head -n 1)
4、shell中的$()和${}
#小括号$(),表示要执行的命令,多个命令使用分号分割,最后一个命令的输出做出$()的输出值
for pid in $(pgrep -f test.py);
#大括号${}表示引用变量
do ps -ef | grep ${pid};
done
5、 awk命令
awk可以使用三种选项组合模式:
- 两种模式用逗号分隔,表示范围搜索。匹配第一个模式的行为起始行,符合第二个模式的终止行,返回起始行和终止行的间的全部内容。继续搜索时将从终止行+1的位置开始匹配。例如:
# awk '/begin/,/end/' test.txt
begin
1 2 3 4
end
begin
5 6 7 8
end
返回与包含字符串 “begin” 的记录以以及包含字符串 “end” 之间的所有记录(包含包括字符串 end 的记录)。文件中查找到两个组这样内容。
- 括号 ( ) 将模式组合在一起。
- 布尔运算符 ||(或)&&(和)以及 !(不)将模式组合成如果它们求值为真则匹配,否则不匹配的表达式。例如,模式:
$1 == "al" && $2 == "123"
与第一个字段是 al 且第二个字段是 123 的记录匹配。