nfsのアクセスが遅そうなので調べてみた

nfsのアクセスが遅そうなのでphpを使って調べてみた。

nfsサーバAは

FreeBSD 7.1 (古い・・・)
500GBのHDDをRAID1で接続してある。(ハードウェアRAID)

サーバBは

FreeNAS 0.72 (freebsd 7.2)
2TB*6のHDDをzfsでraidzしてる。

クライアントは

FreeBSD 8.2
CPU Xeon3330

すべてGbEで接続されている。

テストコード。 nfs上のファイル、ローカルのHDD上のファイルそれぞれに読み出しをかける。

100,000回 (10万回)実行の時間を計る。

<?php
main();

function openRead($filename){
 define(READ_BUF, 1024);
 if(FALSE === ($handle = fopen($filename, "r"))){
   echo 'file open error: ' . $filename . "\n";
   exit(1);
 }
 while(!feof($handle)){
   $str = fread($handle, READ_BUF);
   //echo $str;
 }
 fclose($handle);
}

function main(){
 define(ATTEMPT, 100*1000); // 100,000回
 $filenames = array
 ('/mnt/sa/test.txt', '/mnt/sb/test.txt', '/tmp/test.txt');
 foreach($filenames as $filename){
   echo 'to ' . $filename . "\n";
   $time = microtime(true);
   for($i = 0; $i < ATTEMPT; $i++){
     if(!($i%1000)){
       if(!($i%10000)){
         echo $i;
       }else{
         echo '.';
       }
     }else{
       //echo $i."\n";
     }
       openRead($filename);
   }
   echo "\n". 'elapsed time: ' . (microtime(true) - $time) . 'seconds'."\n\n";
 }
}


shell> php filetouch.php
to /mnt/sa/test.txt
0.........10000.........20000.........30000.........40000.........50000.........60000.........70000.........80000.........90000.........
elapsed time: 36.0750498772seconds

to /mnt/sb/test.txt
0.........10000.........20000.........30000.........40000.........50000.........60000.........70000.........80000.........90000.........
elapsed time: 18.9572398663seconds

to /tmp/test.txt
0.........10000.........20000.........30000.........40000.........50000.........60000.........70000.........80000.........90000.........
elapsed time: 3.80465817451seconds

ううーん、かなり差が出てる。ローカルのHDD早いなぁ。

マウントオプションを変えてみる。 noatime付与。



shell> mount
sa:/tmp/hoge on /mnt/sa (nfs, noatime)
sb:/tmp/hoge on /mnt/sb (nfs, noatime)

shell> php filetouch.php
to /mnt/sa/test.txt elapsed time: 34.3628730774seconds
to /mnt/sb/test.txt elapsed time: 18.9743080139seconds
to /tmp/test.txt elapsed time: 3.80826997757seconds

うーん、変わらず、noatimeってあまり効果が出ないのか・・・。

noatime自体が有効じゃないのかと疑って、ファイルのアクセス日時を確認してみたけどちゃんと更新されていませんでした。

続いてファイルの非同期読み書きオプションのasyncをつけてみる。


shell> mount
sb:/usr/home on /mnt/sa (nfs, asynchronous)
sb:/mnt/main_pool/common/backup on /mnt/sb (nfs, asynchronous)

time php filetouch.php
to /mnt/sa/test.txt elapsed time: 33.7545938492seconds
to /mnt/sb/test.txt elapsed time: 18.9745950699seconds
to /tmp/test.txt elapsed time: 3.80167484283seconds

こちらも大して結果がよくならない。

この辺で興味が薄れてきたので終了。

まとめ

サーバ構成など

サーバ名 OS HDD
NFSサーバA (sA) FreeBSD 7.1 500GB * 2 (hardware RAID1)
NFSサーバB (sB) FreeNAS 0.72 2TB * 6 with zfs raidz
NFSクライアント (c) FreeBSD 8.2 160GB ST3160023AS

100,000回の読み出しにかかった時間

やったこと オプション 時間
c -> c の読み出し(ローカルでのアクセス) /dev/ad6s1e on /tmp (ufs, local, soft-updates) 3.80 sec
sA -> cの読み出し デフォルトのマウント 36.07 sec
sB -> cの読み出し デフォルトのマウント 18.95 sec
sA -> cの読み出し noatime 34.36 sec
sB -> cの読み出し noatime 18.97 sec
sA -> cの読み出し async 33.75 sec
sB -> cの読み出し async 18.97 sec

考察

どうやったらはやくなるのかなあ!

コメントを残す