天天看點

如何用正确的姿勢檢視 主機系統的CPU資訊

Why? 有一天上司問我某個機器上有多少cpu,記憶體啥的,結果我檢視了/proc/cpuinfo | grep "cpu cores"的資訊,就告訴了上司。結果我往上看了其它資訊,發現為什麼上面core id 有8個呢?我就覺得不對勁,趕緊先收回來剛報給上司的話,然後就有了此文,希望大家也多多注意一下。😅

如何用正确的姿勢檢視 主機系統的CPU資訊

一、關于CPU的幾個概念

CPU的作用

計算機中的中央處理單元(CPU)執行基本的計算工作 -- 運作程式。但是,一個單核的CPU同一時間隻能一次執行一個任務,為了提高計算機的處理能力,也就出現了多CPU,超線程(HT)和多核CPU的技術。

大多數計算機隻有一個實體CPU。單個CPU可能具有多個核心或超線程技術,但是仍然隻有一個實體CPU插入主機闆上的單個CPU插槽。在超線程和多核CPU出現之前,人們試圖通過添加額外的CPU,為計算機增加額外的處理能力。這需要一個帶有多個CPU插槽的主機闆 --将多個CPU插入不同的插槽。主機闆還需要額外的硬體将這些CPU插槽連接配接到RAM和其他資源。這裡有很多開銷 -- 如果CPU需要互相通信,則會有額外的延遲,具有多個CPU的系統将消耗更多的電力,并且主機闆需要更多的插座和硬體以及電路。

在個人pc上,有多顆cpu的不多,不過在如今的伺服器上,實體cpu一般都是2顆标配。因為伺服器需要更多的處理能力

 超線程(Hyper-Threading,簡稱“HT”)”技術。超線程技術就是利用特殊的硬體指令,把兩個邏輯核心模拟成兩個實體晶片,讓單個處理器都能使用線程級并行計算,進而相容多線程作業系統和軟體,減少了CPU的閑置時間,提高的CPU的運作效率。

CPU之超線程(HT)

超線程技術是在一顆CPU同時執行多個程式而共同分享一顆CPU内的資源,理論上要像兩顆CPU一樣在同一時間執行兩個線程,雖然采用超線程技術能同時執行兩個線程,但它并不象兩個真正的CPU那樣,每個CPU都具有獨立的資源。CPU 仍然是單個CPU,而作業系統則看到了2個CPU,當兩個線程都同時需要某一個資源時,其中一個要暫時停止,并讓出資源,直到這些資源閑置後才能繼續。是以超線程的性能并不等于兩顆CPU的性能。

多核CPU

最初,CPU隻有有一個核心。這意味着實體CPU有一個單一的中央處理單元。為了提高性能,制造商添加額外的“核心”或中央處理單元。雙核CPU有兩個中央處理單元,是以作業系統看起來是兩個CPU。不同的程序可以同時使用每個核心。這樣可以加快系統處理速度,因為這時的計算機可以同時執行多項任務。

與超線程不同,雙核CPU在 CPU 晶片上實際上有兩個中央處理單元,四核CPU有四個中央處理單元,八核CPU有八個中央處理單元,等等。這有助于顯著提高處理的性能,同時保持實體CPU單元的小型化,使其更适合單個插槽。隻需要單個CPU插槽即可插入一個CPU單元 --- 而不是四個不同的CPU插槽,四個不同的CPU,每個都需要自己的電源,冷卻和其他硬體的連接配接消耗。因為它們都在同一個晶片上,所有具有更少的延遲,核心可以更快的通信。

本文屬于原創内容,轉載還請注明出處以及連結!飛走不可:http://www.cnblogs.com/hanyifeng/p/6556161.html

二、如何正确檢視主機上的cpu相關數量呢?

總核心數 = 實體CPU顆數 * 每顆CPU上核心數

總線程數(邏輯CPU數) = 實體CPU顆數 * 每顆CPU上核心數 * 每顆核心數上的線程  或者 總線程數(邏輯CPU數) = 總核心數 * 每顆核心數上的線程

注意:此處的 ‘線程’ 和 ‘作業系統内的線程’ 不是一回事,從cpu的角度來看,一個線程(“thread of execution”的簡寫)隻是一個有序的指令序列,告訴計算機該做什麼。

第一種方式:

檢視主機上實體cpu的顆數

[root@localhost ~]# cat /proc/cpuinfo |grep "physical id" | sort -u |wc -l
2      

檢視主機上每顆cpu上的核心數

[root@localhost ~]# cat /proc/cpuinfo |grep "cpu cores"|sort -u
cpu cores    : 4      

檢視主機上總邏輯CPU數量(方式1)

[root@localhost ~]# cat /proc/cpuinfo |grep "core id"|wc -l
8      

快速檢視主機上總邏輯CPU數量(方式2)

[root@localhost ~]# nproc --all
8      

快速檢視主機上總邏輯CPU數量(方式3)

[root@localhost ~]# getconf _NPROCESSORS_ONLN
8      

快速檢視主機上總邏輯CPU數量(方式4)

[root@localhost ~]# cat /sys/devices/system/cpu/online
0-7      

備注:0-7 :  從第0個到第7個

第二種方式:

使用lscpu 指令

[root@localhost ~]# lscpu 
...省略輸出
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             2
...省略輸出
Model name:            Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz      

從上面可以看出以下資訊:

  Socket(s) : 實體cpu 顆數  2顆

  Core(s) per socket : 每顆CPU上核心數   4個

  Thread(s) per core : 每個核心的線程數  1個

  CPU(s): 總的邏輯CPU數

是以該機器上最大的線程數(邏輯CPU數)就是: 2 CPU * 4 Cores * 1 threads = 8 threads

上面是沒有開啟超線程技術,如果開啟超線程(HT)後,則應該是 2 CPU * 4 Cores * 2 threads = 16 threads 

下圖是上述處理器的詳細資訊,如果你也對你的伺服器核數不确定時,可以先去官網進行查詢:

如何用正确的姿勢檢視 主機系統的CPU資訊
如何用正确的姿勢檢視 主機系統的CPU資訊

另外補充下,如何在系統内判斷主機是否開啟了超線程(HT)技術呢?請繼續往下看

lscpu指令

[root@localhost ~]# lscpu 
...省略輸出
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             2
...省略輸出      

 Thread(s) per core 為1 則表示禁用了超線程或者該CPU不支援超線程,如果為2 則表示啟用了HT

第二種方式

[root@niunyun ~]# grep -E "cpu cores|siblings|physical id" /proc/cpuinfo |xargs -n 11 |sort -u
physical id : 0 siblings : 8 cpu cores : 4
physical id : 1 siblings : 8 cpu cores : 4      

從這裡看下, siblings 是 cpu cores 的 2倍,這說明啟用了超線程。如果沒啟用HT,則是相同的數字。

本文隻是淺談了cpu如何檢視核心數、線程數等方法,更深的還有線程SMP 、NUMA架構。如果文中有錯别觀點之處,還請大家及時指出,我會及時改正哈。希望有更深的探讨。文章有些參考内容均在文末有連結。

文中參考連結:

https://www.howtogeek.com/194756/cpu-basics-multiple-cpus-cores-and-hyper-threading-explained/

https://arstechnica.com/business/2011/04/ask-ars-what-is-a-cpu-thread/

http://insidehpc.com/2016/12/best-threads-per-core/

每個人都應是守望者,守望我們的心智,我們的理想,以防它在生活中不知不覺地墜落、被操控和被自己遺忘。。。