如何提取每个核心的物理处理器和线程数? (没有文字,只有在其他地方用作输入的数字)

如何提取每个核心的物理处理器和线程数? (没有文字,只有在其他地方用作输入的数字)

我想在脚本中使用核心数,但我不确定提取数字本身的最佳方法是什么。

例如,下面提取了物理核心的数量,但是应该如何提取实际数量以便将其用作其他地方的输入?

lscpu | grep "Core(s) per socket" 
Core(s) per socket:    4

我知道 tail -c N,但是我担心在具有更多内核的机器上工作时这种方法的脆弱性。

可靠地获取物理核心数和每个核心线程数以用作其他地方的输入参数的最佳方法是什么?

答案1

我们可以使用awkorsed甚至grepPerl 正则表达式来从该行中选择数字,例如

$ lscpu | sed -n 's/^Core(s) per socket: *//p'
2

但您想要这个数字吗?一个插槽中的核心数量吗?如果机器上有多个插座怎么办:

$ lscpu |grep -i socket
Core(s) per socket:    2
Socket(s):             2

我们可以用来awk获取两个数字并将它们相乘:

$ lscpu | awk '/^Core.s. per socket:/ {cores=$NF} /^Socket.s.:/ {sockets=$NF} END {print cores * sockets}'
4

我不确定这些是否算超线程,以及我们是否需要超线程,但我们可以直接获取数字CPU(s)

lscpu | awk '/^CPU.s.:/ { print $NF; exit }'

或者使用nproc获取系统上的 CPU 总数。

$ nproc --all
4 

答案2

您可以getconf为此使用实用程序。这应该适合你

$ getconf _NPROCESSORS_ONLN
8

相关内容