2016-02-02 9 views
8

私はソーシャルグラフデータを解析するコードを最適化する作業を行っています(多くの助けを借りてhttps://blog.golang.org/profiling-go-programs)、私は多くの遅いコード。runtime.osyieldとruntime.usleepで最も時間を費やすgolangプログラムを最適化する方法

すべてのデータはデシベル最初からメモリにロードされ、そこからデータ解析は、(@ 100%最大メモリ消費< 10メガバイト、CPU1)CPUバインド

表示されます。しかし、今、私のプログラムの時間のほとんどはであると思われますruntime.osyieldとruntime.usleep。それを防ぐ方法は何ですか?

私はGOMAXPROCS = 1を設定しました。コードはgolangライブラリが呼び出すもの以外のゴルーチンを生成しません。

これは_/C_ /コード/ sc_proto/*関数が私のコードですpprof

(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) 

から私のTOP10出力です。

とWEBからの出力: output from web

(ここでは、グラフのより良い、SVGのバージョン:https://goo.gl/Tyc6X4

答え自分自身が見つかり
+1

グラフが判読不能です。あなたはあなたのプログラムが何をしているか教えてくれません。 [最小、完全、および検証可能なサンプルを作成する方法](http://stackoverflow.com/help/mcve) – peterSO

+0

cgoを使用していますか? – JimB

+0

@JimBはcgoを使用していません。すべて純粋なGo – Aaron

答えて

5

ので、私が持っている他の誰のためにここにこれを掲示しています同様の問題。そして私を正しい道に導いてくれた@JimBに特別な感謝をします。

グラフから分かるように、osyieldおよびusleepにつながるパスはガベージコレクションルーチンです。このプログラムはリンクリストを使用していましたが、多くのポインタが生成されていました.GCのために多くの作業が作成されました。

最終的にこの問題の解決策はhttps://software.intel.com/en-us/blogs/2014/05/10/debugging-performance-issues-in-go-programs(これはすばらしいリソースでした)から来ました。私はメモリプロファイラについての指示に従った。そして私のガベージコレクションの問題を解決したスライスでポインタのコレクションを置き換えることをお勧めします。私のコードは今ではずっと速くなりました

+0

どのSQLドライバですか? (BTW、私は累積的な出力が有用であることも分かります。なぜなら、関数呼び出しの時間は呼び出しスタックのようになります) – JimB

+0

ドライバはGo-SQLドライバです:https://github.com/go-sql -driver/mysql データベースドライバがhttp:// localhost:6060/debug/pprof/goroutineの出力のために降伏していたスレッドであるという結論に至りましたか?デバッグ= 1です。 '1 @ 0x43079c 0x43086b 0x40487d 0x4043bb 0x5451ec 0x45f0e1 0x5451ec \tデータベース/ sql。(* DB).connectionOpener + 0x4c \t C:/ Go/src/database/sql/sql。行く:727'私のゴルーチンと一緒に (次のコメント) – Aaron

+0

'1 0x441d10 0x53447a 0x48ba79 0x48d7f7 0x48cfe5 0x49b7da 0x48dc02 0x49a8db 0x480e9f 0x45f0e1 #\t 0x53447a \t _/C_ /コード/ sc_proto/cloudgraph @(*ノード).AddChild + 0x8a \t C:/code/sc_proto/cloudgraph/cloudgraph.go:/code/sc_proto/main.go:887 #\t 0x49b7da \t _/C_ /コード/ sc_proto.main.func3 + 0x7Aの\t \t \t C 92 # \t 0x48dc02 \t _/C_ /コード/ sc_proto.main + 0x1d2 \t \t \t \t C:/code/sc_proto/main.go:908 #\t 0x49a8db \t _/C_ /コード/ sc_proto.Test_main +として0x1B \t \t \t C:/code/sc_proto/main_test.go:1002 #\t 0x480e9f \t testing.tRunner + 0x9f \t \t \t \t \t C:/ GO/SRC /testing/testing.go:473' – Aaron

関連する問題