Blog Archives

[Linux]trickleを使ってプログラムごとにアドホックに帯域制御する

ネットワークの帯域制御は用途や手段に応じて様々な手段が存在する。 今回は、Linux 環境下で trickle を使ってプログラム単位でアドホックに帯域制御する方法をメモ。 trickle とは ユーザースペースで動作するトラフィックシェイパー ダイナミックローダーのプリローダー(LD_PRELOAD)を利用して socket の送受信に割り込んでトラフィックを制御 プログラム単位で制御 trickle をインストール RedHat Installation epel レポジトリからインストールする Ubuntu Installation 何も考えずに apt-get でインストールできる trickle を使う standalone mode(単一プログラムでの制御) collaborative mode(複数プログラム合算での制御) の2モードがある。 standalone mode プログラムごとにトラフィックを制御する trickle が一番得意とすると思われる用途 実行例 要は、コマンドの先頭に trickle {制御条件} を追加するだけと非常にお手軽。

Tagged with: , ,
Posted in linux

LD_PRELOADで動的ライブラリ関数を上書きする

動的リンクされたプログラムでは、同じ関数が複数のライブラリで定義されている場合、最初に見つかった関数が利用される。 環境変数 LD_PRELOAD で指定した共有ライブラリは最優先で読み込まれるため、簡単にプログラムの挙動を変えることができる。 実験用のプログラム まずは乱数を10個表示するだけの簡単なプログラム(random_num.c)を用意。 実験用プログラムの実行 コンパイルする GNU C Library(libc.so.6) とリンクされており、 実験用で利用する関数 rand もある。nm でシンボルを出力すると、 rand を確認できる。 実際に実行するとランダムに数字が10個表示される。 rand を上書きする 次に、本来はランダムな整数を返す rand 関数がつねに固定の整数 42 を返すように書き換え他プログラムを用意(unrandom.c)。 共有ライブラリとしてコンパイルする LD_PRELOAD でプログラムの実行 環境変数 LD_PRELOAD で作成した共有ライブラリ を指定し、同じプログラムを実行してみる。 rand 関数が固定値を返す自作ライブラリの関数に書き換わっているため、プログラムの実行結果もランダム性がなくなっているのがわかる。 rand を上書きする(元の関数も実行) 先ほどの例では関数の中身を完全に書き換えていたので、もう少しソフトに、本来の関数を実行しつつその前後で追加処理を入れたのが次のプログラム(myrandom.c)。 dlsym(RTLD_NEXT, “rand”)

Tagged with: , ,
Posted in linux
Archives