我為什麼關掉了超執行緒
最近在一個服務的伺服器進行機型置換時,又碰到了關於執行緒數、多核CPU、超執行緒的問題。
我之前已經在 ofollow,noindex" target="_blank">《執行緒數與多核CPU的關係》 中討論過物理核與超執行緒的關係,並且建議計算密集型任務,應該將執行緒數設定為物理核數。
但是,這次機型替換,還是出現了問題。
多核與主頻
原來我們服務使用的是一款單CPU,4物理核,8邏輯核(超執行緒,HTT)的伺服器,主頻3.4G。這次替換的新機型是雙CPU,每個CPU20物理核,40邏輯核(HTT),一共是80核的伺服器,但是主頻只有2.5G。
考慮到這個服務是一個時延敏感的服務,看到主頻這裡,我的心是涼的。但是網路上也有很多說法表明(主要是Intel的官方宣傳文章),在更小製程更新架構的情況下,較低主頻的新版CPU也可以取得打平甚至超過舊版高主頻CPU的效能表現。
至於為什麼多核CPU反而主頻更低呢?這主要是功耗上的考慮。40個物理核密集布在一塊板上,高主頻會帶來高功耗,散熱就是一個大問題了。因此,目前市面上的這種幾十核的CPU,主頻基本都在2.xG左右。
第二個擔憂是為了充分利用多核CPU的效能,程式的執行緒數需要大大提高,那這裡會不會帶來鎖的爭用從而導致效能下降?好在之前,《使用雙buffer無鎖化》已經解決了大部分鎖的問題,現在的服務基本是一個無鎖的計算密集型程式。
超執行緒
那麼部署、測試、壓測、上線。
請求量變大,新機器上的時延直接飆到原來的兩倍還多。
請教了經常配置使用這種新機型的運維同學,告訴我可以嘗試關閉超執行緒試試。果然,關閉超執行緒後,時延只比原來的8核機高不到10%,且隨著負載增加沒有明顯變化,符合上游服務的時延要求。
那為什麼關閉超執行緒有效呢?
首先,我們要了解什麼是超執行緒。
超執行緒,是一種用於提升CPU計算並行度的處理器技術,用一個物理核模擬兩個邏輯核。 這兩個邏輯核擁有自己的中斷、狀態,但是共用物理核的計算資源。 超執行緒技術旨在提高CPU計算資源的使用率,從而提高計算並行度。
超執行緒技術基於這樣一個現實,那就是大多數程式執行時,CPU資源並沒有得到充分的利用。比如CPU快取未命中、分支預測錯誤或者等待資料時,CPU中的計算資源其實是閒置的。超執行緒技術,可以通過硬體指令,將這些閒置的CPU資源,排程給其他的指令,從而整體上提高CPU的資源利用率。
那麼為什麼我們程式關閉了超執行緒,反而時延效能提升了呢?
可能有以下幾個方面的原因:
-
超執行緒帶來的效率提升絕對趕不上新增一個獨立的物理核,因為超執行緒沒有增加任何的計算資源,而是允許兩個任務共享同一個物理核的現有計算資源。所以如果處理器有充足的計算資源未被充分利用時,超執行緒可以帶來比較大的提升,另一個執行緒可以在某些計算資源空閒時,插入執行。這樣在同一個時鐘週期內,可以計算更多的任務。這裡帶來的效能提升,更大的是吞吐量的提升,而非單任務計算時延的提升。如果應用程式前後依賴少,可以編譯成獨立的指令執行,CPU層面的吞吐量提升也可以帶來應用程式層面的計算時延下降;但是,滿足這樣要求的業務太少,大部分應用程式都是有前後依賴的。
-
超執行緒的利用率是否高,和作業系統有關。如果作業系統不理解超執行緒(如Linux2.6之前,windows server2003等),那麼就有可能將本來可以分發給兩個物理核的計算任務,分發給了同一個物理核上的兩個超執行緒。這樣的話,反而會帶來效能損失。
-
有研究表明,超執行緒依賴於作業系統對CPU的排程。但是如果應用程式開啟了CPU繫結功能,則有可能破壞這種排程的完整性,反而帶來效能損失。不幸的是,由於我們應用程式內部邏輯需要,必須要開啟CPU繫結功能。這裡可能是個比較主要的問題。
-
為了實現超執行緒技術,物理核中需要多加一個邏輯處理單元。即使沒有指令給超執行緒出來的那個邏輯核計算時,這個新增的邏輯處理單元,也會佔據一定的物理核資源,帶來效能影響。
另外,超執行緒程式會帶來耗電量的大幅提升。這在伺服器程式來說,可能帶來功耗的提升導致散熱問題從而降頻,而對於目前智慧手機來說,電池續航也會是一個嚴重的問題。
總結
超執行緒技術,目前基本上是伺服器CPU的標配了。但是具體能夠帶來多大的效能提升,還是要取決於具體的應用程式與作業系統。
如果你發現伺服器效能不達標,不妨將超執行緒關掉試試。
轉載請註明出處: http://blog.guoyb.com/2018/12/01/disable-htt/
歡迎使用微信掃描下方二維碼,關注我的微信公眾號TechTalking,技術·生活·思考:
