入出力性能の計測#

はじめに#

この課題以降は参考情報のみを提示しますので,各自で実験方法から検討して課題を進めてください.

実験に必要なツール・アプリケーションについても必須課題で作成したソースコードを参考に自作してください.

レポートにまとめるにあたって以下の5つの情報は必須になります.

  • 実験環境

  • 実験手順

  • 計測結果のグラフ

  • グラフから言えることとその理由

  • 実験に用いたソースコード

共通のヒント#

時間計測を行うサンプルコード#

POSIX標準ではナノ秒単位で時間を扱うことができるライブラリが提供されています. POSIX標準のライブラリは,ANSI標準には含まれませんのでビルド時に -std=c11 のようにANSIベースでのC99仕様に基づくビルドを指定している場合には,以下のライブラリは利用できません. そこで,C99仕様にPOSIX標準及びGNU拡張を追加した -std=gnu11 を利用するようMakefileを修正しておいてください.

#include <stdio.h>
#include <unistd.h>
#include <time.h>

double get_current_timecount() {
  struct timespec ts;
  clock_gettime(CLOCK_MONOTONIC, &ts);
  return ts.tv_sec + ts.tv_nsec*1e-9;
}

int main( int argc, char* argv[] ) {
  double t1 = get_current_timecount();

  // do something
  sleep(3);

  double t2 = get_current_timecount();
  printf("%lf\n", t2-t1);
  return 0;
}

任意のサイズのファイル作成方法#

実験のために任意のサイズのファイルを作成するには,ddコマンドを使うと良いでしょう.

きれいなグラフの作成方法#

グラフを作成するソフトウェアは多く存在しますが,例えばmjographなどを使うときれいなグラフを作ることができます.

[必須課題1] バッファサイズを変更した場合のファイルコピー性能#

ユーザプログラム中のバッファサイズを変更した場合のread,writeとfread,fwriteの性能を比較してください.

正確な計測・比較のために行った工夫を整理し報告してください.その上で,性能の差について要因を調査して考察を行ってください.

他グループの報告するグラフとの性能比較を容易にするために,今回の性能比較のグラフを作成する場合には,横軸をバッファサイズ,縦軸をファイルのコピーに要した時間としてください(その際,実験条件の検討や記載が不十分ですと,公平な実験条件での結果かどうか不明確になりますのでご注意ください).

Hint

ファイル入出力プログラミングの「必須課題6 ファイルのコピー」のソースコードを拡張します. このプログラムでは char buf[] が,アプリケーション層でのバッファになっています.

Hint

更に先に進む人向け

標準ライブラリのファイル入出力関数 (先頭が f で始まる入出力関数群)は,関数内でバッファリング処理を行っています. もし,計測したread/write, fread/fwrite の性能に違いがあるとしたら,関数内でのバッファリングの違いによるものかもしれません. このアプリケーション層でのバッファのサイズを様々に変更して,より深い計測・分析を進めることで read/write, fread/fwrite の違い(関数内でのバッファリング処理との関係)やその理由を更にはっきりさせることができるでしょう. 以下のサイト等も参考にしながら実際に試してみて結果を分析し深く考察してみてください.

[必須課題2] バッファサイズを変更した場合の通信性能#

ユーザプログラム中のバッファサイズを変更した場合のread,writeとrecv,sendの性能を比較してください.

正確な計測・比較のために行った工夫を整理し報告してください.その上で,性能の差について要因を調査して考察を行ってください.

他グループの報告のグラフとの比較を容易にするために,今回の性能比較のグラフを作成する場合には,横軸をバッファサイズ,縦軸をファイルの送信あるいは受信に要した時間としてください(その際,実験条件の検討や記載が不十分ですと,公平な実験条件での結果かどうか不明確になりますのでご注意ください).

Hint

ネットワーク入出力プログラミングの「必須課題9 ファイル送受信」のソースコードを拡張します. このプログラムでは char buf[] がアプリケーション層でのバッファになっています.

Hint

さらに先に進む人向け

必須課題1と同様にソケットに関しても,その内部にバッファを持っています. その設定値について調査し,どのような条件で観測を行ったのかを明らかにすると良いでしょう. また,設定値を変更し,ソケット側のバッファ量による影響について分析してみても良いでしょう.

Caution

以下のサイトで紹介されている変更は,現在動作しているKernelのパラメータを変更するものです. 変更の結果は,OSの挙動に影響を及ぼします.自分だけではなく,OS自体やサーバ上で動作しているサービス類,同じサーバにログインしている他の人にも影響することになりますので注意してください.