亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 例行程序性能最大化

Go 例行程序性能最大化

Go
江戶川亂折騰 2021-06-17 17:04:37
我在 go 中編寫了一個數據移動器。獲取位于一個數據中心的數據并將其移動到另一個數據中心??紤]到 go 例程,認為 go 將是完美的。我注意到如果我有一個程序運行 1800 個線程,則傳輸的數據量非常低這是dstat平均超過 30 秒的打印輸出---load-avg--- ----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system-- 1m   5m  15m |usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 0.70 3.58 4.42| 10   1  89   0   0   0|   0   156k|7306k 6667k|   0     0 |  11k 6287 0.61 3.28 4.29| 12   2  85   0   0   1|   0  6963B|8822k 8523k|   0     0 |  14k 7531 0.65 3.03 4.18| 12   2  86   0   0   1|   0  1775B|8660k 8514k|   0     0 |  13k 7464 0.67 2.81 4.07| 12   2  86   0   0   1|   0  1638B|8908k 8735k|   0     0 |  13k 7435 0.67 2.60 3.96| 12   2  86   0   0   1|   0   819B|8752k 8385k|   0     0 |  13k 7445 0.47 2.37 3.84| 11   2  86   0   0   1|   0  2185B|8740k 8491k|   0     0 |  13k 7548 0.61 2.22 3.74| 10   2  88   0   0   0|   0  1229B|7122k 6765k|   0     0 |  11k 6228 0.52 2.04 3.63|  3   1  97   0   0   0|   0   546B|1999k 1365k|   0     0 |3117  2033 如果我運行 9 個程序實例,每個實例有 200 個線程,我會看到更好的性能---load-avg--- ----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system-- 1m   5m  15m |usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 8.34 9.56 8.78| 53   8  36   0   0   3|   0   410B|  38M   32M|   0     0 |  41k   26k8.01 9.37 8.74| 74  10  12   0   0   4|   0   137B|  51M   51M|   0     0 |  59k   39k8.36 9.31 8.74| 75   9  12   0   0   4|   0  1092B|  51M   51M|   0     0 |  59k   39k6.93 8.89 8.62| 74  10  12   0   0   4|   0  5188B|  50M   49M|   0     0 |  59k   38k7.09 8.73 8.58| 75   9  12   0   0   4|   0   410B|  51M   50M|   0     0 |  60k   39k平均負載有點高,但我稍后會擔心。網絡流量雖然幾乎達到了網絡潛力。我使用的是 Ubuntu 12.04、8 Gigs Ram、2.3 GHz 處理器(EC2 說:P)另外,我將文件描述符從 1024 增加到 10240我認為 go 是為這種事情設計的,還是我對這個應用程序有太多的期待?有什么我想念的微不足道的東西嗎?我是否需要配置我的系統以最大限度地發揮 Go 的潛力?
查看完整描述

2 回答

?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

您可能必須發布源代碼才能獲得任何實際輸入,但可以肯定的是,您增加了要使用的 CPU 數量?


import "runtime"


func main() {

    runtime.GOMAXPROCS(runtime.NumCPU())

}


查看完整回答
反對 回復 2021-06-21
?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

請注意,goroutines 也僅限于您的本地機器,并且通道本身沒有啟用網絡,即您的特定情況可能不是咬 go 的巧克力網站。

另外:你對將(據說)每次轉移都扔進一個 goroutine 有什么期望?IO 操作往往會遇到瓶頸,即位碰到金屬,即數據到介質的物理傳輸。可以這樣想:無論有多少線程或(在本例中為 Goroutines)嘗試寫入網卡,您仍然只有一張網卡。最有可能通過許多并發寫入調用來處理它只會減慢速度,因為所涉及的開銷會增加

如果您認為這不是問題或想要審核您的代碼以優化性能,那么 go 有簡潔的內置功能可以這樣做:分析 go 程序(官方 go 博客) 但實際瓶頸仍然可能在您的 go 程序之外和/或它與操作系統交互的方式。

不用代碼解決您的實際問題是毫無意義的猜測。發布一些,每個人都會盡力幫助你。


查看完整回答
反對 回復 2021-06-21
  • 2 回答
  • 0 關注
  • 212 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號