[Armadillo:03338] Re: NAND上のファイルへのlsに時間がかかります

Yasushi SHOJI email@hidden
2008年 8月 27日 (水) 18:20:03 JST


At Wed, 27 Aug 2008 13:40:38 +0900,
fukunaga wrote:
> 
> >At Wed, 06 Aug 2008 11:38:00 +0900,
> >Yasushi SHOJI wrote:
> >というスクリプトで1日動かしてみたのですが、lsの速度は変りませんでした。
> >8時間で2400回くらいループします。
> 
> 実験していただきありがとうございます。
> こちらでも試していたのですが、マウント後にlsが遅くなる現象の
> 再現方法がわかりました。

おお、すばらしい!

> 以下のような、open,write,closeを繰り返すプログラムを作成します。
> (エラー処理は省略しています。)
> (同一ファイルに上書きするので、繰り返してもファイルサイズは変わりません。
>  書き出す内容も固定です。)
> 
> void test1( int cnt )
> {
>      int     i;
>      FILE    *file;
> 
>      for( i=0; i<cnt; i++ ){
>          file = fopen( "/mnt/nand/test.csv", "w" );
>          fputs( "1234567890", file );
>          fclose( file )
>      }
> }

なるほど。これなら速度の問題はともかくshell scriptでも再現テストができ
そうですね。

	while true; do
		echo 1234567890 > /mnt/nand/test.csv
	done

上記だと、秒間10回書けないみたいです。100万回書くにはCじゃなきゃだめか
な? C版だとどれくらいで 1万回書けました?

[...]
> ここで問題なのは、実行環境がない場合(flash_eraseall直後で
> ファイルやディレクトリがない場合)には、100万回ループさせても
> 現象は発生しません。
> ファイルやディレクトリがあることが問題となるようです。

どこまでファイルが必要か、わかりませんか?たとえば大きなファイルがある
とファイル一枚でもだめとか。なぜこんな質問をするかと言うと、
100万回という書き込み回数の場合、wear-levellingのアルゴリズムが動くの
ではないかと思っているからです。

手元で試したら 4MBの書き込みで 40secほどでした。

time dd if=/dev/urandom of=test.dat count=1024 bs=4k
real    1m 12.72s
user    0m 0.01s
sys     0m 40.49s

gcがファイルを移動するのにどれくらいの時間がかかるんでしょうね?

> 上でlsが遅くなったNANDに、さらに10万回ループを実行すると、
> マウント直後のlsが3分になりました。
> その後、一旦NANDをアンマウントしてマウントしなおすと、今度は
> 51秒になりました。マウント後のlsの前後でのdfでみた使用量をみると
> 若干減っており、ガベッジコレクトされた様子がありますが、
> その後、アンマウント、マウントを繰り返しても、lsは51秒のままで
> Usedのサイズも変化がありません。
> (詳細は下記の実験ログ)

もしかすると、完全にGCされていないんじゃないでしょうか?
test.csvを移動すると、どうなります?移動のときに mvではなくて以下のコ
マンドで移動してみてください。

	$ mv test.csv test.orig
	$ cat test.orig > test.csv
	$ rm test.orig

この後に lsするとどうなりますか?

> ちなみにループを100万回実行すると、1時間かかってもlsが返って
> こなくなりました。

100万回の書き換えって、なかなか厳しいですね。(^^;
-- 
               yashi



armadillo メーリングリストの案内