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のネットワークトラフィックスパイクを参照してください。
これはなぜ起こるか、それを修正しようとする可能性がありますか?
Goは、自分のシステムコールを直接作成しています。それはlibcを通らない。 – JimB
@JimB 'トリクル 'はlibcを使ったラップされたプログラムに依存していると言っていますか? –
はい。それが動作する唯一の方法(そして静的実行可能ファイルでは動作しない理由)は、LD_PRELOADを介してプリロードオブジェクトを使用して標準のlibcソケット呼び出しを独自のものに置き換えることです。 – JimB