Why? 有一天上司問我某個機器上有多少cpu,記憶體啥的,結果我檢視了/proc/cpuinfo | grep "cpu cores"的資訊,就告訴了上司。結果我往上看了其它資訊,發現為什麼上面core id 有8個呢?我就覺得不對勁,趕緊先收回來剛報給上司的話,然後就有了此文,希望大家也多多注意一下。😅
一、關于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
下圖是上述處理器的詳細資訊,如果你也對你的伺服器核數不确定時,可以先去官網進行查詢:
另外補充下,如何在系統内判斷主機是否開啟了超線程(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/
每個人都應是守望者,守望我們的心智,我們的理想,以防它在生活中不知不覺地墜落、被操控和被自己遺忘。。。