2016-11-02 2 views
2

httpsでOpenStack Object Storageに大量のデータをアップロードするgolangプログラムがあります。これは、golangの標準ライブラリ"net/http"に依存しています。 trickleを使用してデータのアップロードをレート制限しますが、トリクルを使用してコードを実行しても、トリクルを使用していないような効果はありません。トリクルユーティリティがダイナミックにリンクされたgolangプログラムに影響しないのはなぜですか?

どうしてですか?彼らが一緒に働くことを妨げるトリクルやゴーランにはいくつかの制限がありますか?私が考慮していないいくつかの落とし穴がありますか?

これは私の設定です:

私はtrickleのみ(トリクルドキュメントの最初の段落を参照)、動的にリンクされた実行ファイルを上の作品、私はgo build -compiler gccgo mycode.goと私のコードをコンパイルしたとldd myexecutableの出力があることを知っている:

linux-vdso.so.1 => (0x00007ffee27b8000) 
libgo.so.9 => /usr/lib/x86_64-linux-gnu/libgo.so.9 (0x00007f46062bf000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f46060a9000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4605cdf000) 
/lib64/ld-linux-x86-64.so.2 (0x000055aa4d0a4000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f4605ac2000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f46057b9000) 

私はこれをUbuntu Linux 16.04で実行しています。私はslurmを使用して、自分のコマンドが実行されるときにネットワークトラフィックを表示します。マシンは他のネットワークを必要とするジョブを実行していないので、自分のコードによって生成されたトラフィックが表示されていると確信しています。私は

trickle -s -v -u2500 myexecutable ...args 

を実行すると

は、私は約12000キロバイト/秒(ネットワークが処理できる最大)の代わりに、2500キロバイト/秒の私の限界を尊重する私のTXのネットワークトラフィックスパイクを参照してください。

これはなぜ起こるか、それを修正しようとする可能性がありますか?

+0

Goは、自分のシステムコールを直接作成しています。それはlibcを通らない。 – JimB

+0

@JimB 'トリクル 'はlibcを使ったラップされたプログラムに依存していると言っていますか? –

+0

はい。それが動作する唯一の方法(そして静的実行可能ファイルでは動作しない理由)は、LD_PRELOADを介してプリロードオブジェクトを使用して標準のlibcソケット呼び出しを独自のものに置き換えることです。 – JimB

答えて

5

トリクルは、LD_PRELOADを使用して、ネットワーク関連のすべての呼び出しをlibcを通じて独自の実装に置き換えます。これは、静的なバイナリではトリクルが動作しない理由です。

Goは、独自のすべてのシステムコールを直接作成し、libcインタフェースを使用しないため、トリクルによって提供される相互配置機能は使用されません。

関連する問題