微吼云上線多路互動直播服務 加速多場景互動直播落地
766
2025-04-04
2021-03-05:go中,io密集型的應用,比如有很多文件io,磁盤io,網絡io,調大GOMAXPROCS,會不會對性能有幫助?為什么?
福哥答案2021-03-05:
這是面試中被問到的。實力有限,真正的答案還不知道。
答案1:
調節這個參數影響的是P的個數,也就影響了M(線程)干活的個數。相當于你可以有更多的執行線程。
先以網絡io來說,網絡io 在golang 里面是異步的,用epoll池做的io復用。每個網絡調用其實都是異步的,發數據給到內存,調度權就可以讓給其他goroutine了,所以,其實一個線程能處理過來的話,性能是不會差的,這個時候你加多P其實提升不大。只有你單線程處理不過來這些網絡io的時候(每個都處理很慢),加多P才有明顯提升
如果是磁盤io的話,這個有點特殊,磁盤io不是異步的,沒有aio這種方式。所以你的磁盤io調用下去就卡住M了,這個時候等sysmon發現系統調用超時才會搶占M,這一來回就耗費時間了,所以,這種情況下你干活的M多一點確實能帶來一些性能的提升,相當于并行干活的M多一些。
無論哪種情況,P的個數都不建議超過本機cpu的個數。因為多個cpu才是真正的并行執行,上層都是通過調度切換模擬出來的。
答案2:
GOMAXPROCS 用默認的,就是CPU的硬件線程數目,
對于大部分IO密集的應用是不合適的。
至少應該配置到硬件線程數目的5倍以上, 最大256。
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利用不足的開銷。
【GO語言】合理配置GOMAXPROCS提升一倍以上的性能
GOMAXPROCS你設置對了嗎?
go 協程詳解
2021-03-05:go中,io密集型的應用,比如有很多文件io,磁盤io,網絡i…如何解答呢?
Go 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。