【GO語言】合理配置GOMAXPROCS提升一倍以上的效能

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

GOMAXPROCS 用預設的,就是CPU的硬體執行緒數目,

對於大部分IO密集的應用是不合適的。

至少應該配置到硬體執行緒數目的5倍以上, 最大256。

具體參見。

這是為什麼呢?

我們來複習下Go的執行緒模式,M/P/G 三種對象,分別代表 作業系統線程、協程執行令牌、協程;

在任何情況下,Go運行時並行執行(注意,不是並發)的goroutines數量是小於等於P的數量的。

如果一個持有P的M,由於P當前執行的G調用了syscall而導致M被阻塞,那麼:

注意

注意

注意

關鍵點:此時,GO的調度器是遲鈍的,它很可能什麼時都沒做,直到M阻塞了想當長時間以後,才會發現有一個P/M被syscall阻塞了。然後,才會用閒置M來強這個P。

補充說明:調度器遲鈍不是M遲鈍,M也就是作業系統線程,是非常的敏感的,只要阻塞就會被作業系統調度(除了極少數自旋的情況)。但是GO的調度器會等待一個時間間隔才會行動,這也是為了減少調度器幹預的次數。也就是說,如果一個M調用了什麼API導致了作業系統線程阻塞了,作業系統立刻會把這個線程M調度走,掛起等阻塞解除。這時候,Go調度器不會馬上把這個M持有的P搶走。這就會導致一定的P被浪費了。

這就是為何,GOMAXPROCS 太小,也就是P的數量太少,會導致IO密集(或者syscall較多)的go程式運行緩慢的原因。

那麼,GOMAXPROCS 很大,超過硬體執行緒的8倍,會不會有開銷呢?

答案是,開銷是有的,但是遠小於Go運行時遲鈍的調度M來搶奪P而導致CPU利用不足的開銷。

P.S.

本文至少對Go 1.8版本是有效。

 

 

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.