我一直致力于优化分析社交图数据的代码(在https://blog.golang.org/profiling-go-programs 的大量帮助下),并且我已经成功地重新编写了很多缓慢的代码。


所有数据先从db加载到内存,从那里分析数据出现CPU bound(最大内存消耗<10MB,CPU1@100%)


但是现在我的程序的大部分时间似乎都在 runtime.osyield 和 runtime.usleep 中。有什么方法可以防止?


我已经设置了 GOMAXPROCS=1 并且代码不会产生任何 goroutines(除了 golang 库可能调用的)。


这是我从 pprof 的 top10 输出


(pprof) top10

62550ms of 72360ms total (86.44%)

Dropped 208 nodes (cum <= 361.80ms)

Showing top 10 nodes out of 77 (cum >= 1040ms)

      flat  flat%   sum%        cum   cum%

   20760ms 28.69% 28.69%    20850ms 28.81%  runtime.osyield

   14070ms 19.44% 48.13%    14080ms 19.46%  runtime.usleep

   11740ms 16.22% 64.36%    23100ms 31.92%  _/C_/code/sc_proto/cloudgraph.(*Graph).LeafProb

    6170ms  8.53% 72.89%     6170ms  8.53%  runtime.memmove

    4740ms  6.55% 79.44%    10660ms 14.73%  runtime.typedslicecopy

    2040ms  2.82% 82.26%     2040ms  2.82%  _/C_/code/sc_proto.mAvg

     890ms  1.23% 83.49%     1590ms  2.20%  runtime.scanobject

     770ms  1.06% 84.55%     1420ms  1.96%  runtime.mallocgc

     760ms  1.05% 85.60%      760ms  1.05%  runtime.heapBitsForObject

     610ms  0.84% 86.44%     1040ms  1.44%  _/C_/code/sc_proto/cloudgraph.(*Node).DeepestChildren

(pprof)

_ /C_/code/sc_proto/* 函数是我的代码。


以及来自网络的输出:

http://img3.sycdn.imooc.com/61af27a700011cc106000526.jpg