Awk

如何提取每個核心的物理處理器和執行緒數?(沒有文字,只有在別處用作輸入的數字)

  • June 26, 2017

我想在腳本中使用核心數,但我不確定提取數字本身的最佳方法是什麼。

例如,下面提取物理核心的數量,但是應該如何提取實際數量以便可以將其用作其他地方的輸入?

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

我知道tail -c N,但是我擔心這種方法在處理具有更多核心的機器時會變得脆弱。

可靠地獲取每個核心的物理核心數和執行緒數以用作其他地方的輸入參數的最佳方法是什麼?

我們可以使用awksedgrep至使用 Perl 正則表達式來選擇該行中的數字,例如

$ 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 

引用自:https://unix.stackexchange.com/questions/373250