Go 实现常规性能最大化
我正在用go编写一个数据移动器。获取位于一个数据中心的数据并将其移动到另一个数据中心。考虑到围棋的惯例,围棋将是完美的选择 我注意到,如果有一个程序运行1800个线程,则传输的数据量非常低 这是30秒内平均的Go 实现常规性能最大化,go,Go,我正在用go编写一个数据移动器。获取位于一个数据中心的数据并将其移动到另一个数据中心。考虑到围棋的惯例,围棋将是完美的选择 我注意到,如果有一个程序运行1800个线程,则传输的数据量非常低 这是30秒内平均的dstat打印输出 ---load-avg--- ----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system-- 1m 5m 15m |usr sys idl wai hiq siq| read wri
dstat
打印输出
---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 26k
8.01 9.37 8.74| 74 10 12 0 0 4| 0 137B| 51M 51M| 0 0 | 59k 39k
8.36 9.31 8.74| 75 9 12 0 0 4| 0 1092B| 51M 51M| 0 0 | 59k 39k
6.93 8.89 8.62| 74 10 12 0 0 4| 0 5188B| 50M 49M| 0 0 | 59k 38k
7.09 8.73 8.58| 75 9 12 0 0 4| 0 410B| 51M 50M| 0 0 | 60k 39k
7.40 8.62 8.54| 75 9 12 0 0 4| 0 137B| 52M 49M| 0 0 | 61k 40k
7.96 8.63 8.55| 75 9 12 0 0 4| 0 956B| 51M 51M| 0 0 | 59k 39k
7.46 8.44 8.49| 75 9 12 0 0 4| 0 273B| 51M 50M| 0 0 | 58k 38k
8.08 8.51 8.51| 75 9 12 0 0 4| 0 410B| 51M 51M| 0 0 | 59k 39k
平均负载有点高,但我以后会担心的。然而,网络流量几乎正在影响网络潜力
我在Ubuntu 12.04上,
8千兆内存,
2.3 GHz处理器(称为EC2:P)
此外,我还将文件描述符从1024增加到10240
我以为go是为这类东西设计的,还是我对go的期望太高了
我有没有遗漏一些琐碎的东西?我是否需要配置我的系统以最大限度地发挥go的潜力
编辑
我想我的问题还不够清楚。很抱歉我不是在要求围棋有魔力,我知道电脑的处理能力有限。
所以我要重新措辞。为什么一个实例有1800个go例程!=9个实例,每个实例有200个线程?与9个实例相比,1个实例的go例程数量相同,性能显著降低 请注意,goroutines也仅限于您的本地maschine,并且频道不是本机网络启用的,即您的特定情况可能不会影响go的巧克力网站 另外:你对每一笔转会都投入到一场精彩的比赛中有什么期待?IO操作往往会在位碰到金属的地方出现瓶颈,即数据到介质的物理传输。这样想:无论有多少线程或(在本例中是goroutine)尝试写入Networkcard,您仍然只有一个Networkcard。最有可能的情况是,使用多个并发写调用来实现它只会降低速度,因为所涉及的开销会增加 如果您认为这不是问题所在,或者希望审核代码以获得优化的性能,go具有简洁的内置功能: 但实际的瓶颈很可能在围棋程序之外,或者在围棋程序与操作系统交互的方式上
不用代码解决实际问题是毫无意义的猜测。发布一些,每个人都会尽力帮助您。您可能需要发布源代码才能获得真正的输入,但为了确保,您增加了要使用的CPU数量
import "runtime"
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
}
您使用的构建系统是什么(go构建、gccgo)?你增加了GOMAXPROCS吗?简单地生成goroutines并不能使您的程序并行。@杰夫:在一个问题上抛出更多的线程和/或goroutine可能是正确的,因为这可能是一个坏主意,也是减慢速度的原因,具体取决于问题及其具体实现。没有“更多线程-更多吞吐量”的东西。当没有代码可供查看时,您希望从我们那里听到什么?(-1)-Jsor谢谢你抽出时间。正是我需要的。如果你把它作为回答,我会接受的。另外,谢谢你的礼貌:)