2006/02/24(金)coLinux+samba > Windows+ファイル共有?
2006/02/24 18:00
・ファイルサーバ側(WinXP SP1)、クライアント側(WinXP SP1)
・クライアント側からNBTでサーバ側のディレクトリにアクセスしたときに発生
・サーバ側のファイル数は600程度で日本語を含む
・ファイルの列挙(要はdir/ls)にかかる時間は4秒程度
・ファイルの列挙に時間がかかるだけで、転送速度そのものが遅くなっているわけではない
・パケットをキャプチャしてみたが余計なパケットは飛んでいないように見える
・dirで確認すると一定の転送量ごとに何かがつっかえている感じ
・サーバー側・クライアント側入れ替えても発生
・クライアント側からLinux+sambaの自宅サーバにアクセスするとこの現象は発生しない
フォーカスが移るたびに読み直すファイラー(春M)でアクセスするから困るのであって、実はエクスプローラだとそんなに問題はない。また、1ディレクトリに100も200もファイルを置いている方がおかしいと言われればそれまで。レジストリの調整で解決できそうな予感はあるのだが、情報としては発見できなかった。
一応実験としてcoLinuxをサーバ側にインストールし、sambaで共有して速度が向上するか確認することにする。coLinuxのネットワークはホストマシンのNICとブリッジ接続にする。coLinuxからcofsでホストマシンのディレクトリをマウントし、sambaで共有させた。
結論から言うと、ファイル名の列挙に関しては速度が向上したが、根本的なアクセス速度が落ちた。netperfによる簡易計測であるが、クライアント側からスループットを比較したところホスト側(WinXP)では90~92Mbps、ゲスト側(coLinux)では47~48Mbpsとなった。なんと2倍近い差がある。アクセス速度に関しては、1000Mbpsで繋げば簡単に向上するかもしれないが、実験していない。これはそのうち追試。またこの方法の問題として、日本語ファイル名を下位に含むディレクトリではcofsで総ファイルサイズが取得できない(dfからしてinput/output Errorとなる)。結局魔法のステッキにはなってくれないようである。
win32版sambaとかあればなあ……(バカ)
暫定的な解決手段としては、ディレクトリ整理と春Mをあきらめてエクスプローラを使う。ただもう春Mからは離れられそうにないのでさっさと整理が一番正しい。
2006/02/24(金)Rubyでコンソールから1文字入力
2006/02/24 22:00
・解決案1(不採用) 添付ライブラリcursesを使う。Winでもunixでも動くには動きそうだが、表示とかが機種依存ぽいので止め。
・解決案2(採用) Win32API+crtdll.dllを使う。もちろんwin32限定だが、その範囲に限れば最も機種依存度低そう。(msvcrt.dllよりもcrtdll.dllの方が汎用性高いという認識で合ってるよね?)
ということで解決案2でGO。
こんなふうに書いてみた。
require 'Win32API' func_getch = Win32API.new('crtdll.dll', '_getch', 'v', 'i') str = "Do you like skate? [y/N]\n" print str while true do x = func_getch.call.chr.downcase case x when 'y' #yesの時の処理 print "Ok!\n" break when 'n', "\r" #noの時の処理(デフォルト) print "Terrible!\n" break when "\C-c" #getchでコンソールを奪うと中断出来ないので exit else print str end end如何にも古い人のコードだが気にしないで欲しい。
Win32API->crtdll.dll経由で_getchを呼び出す。_getchはエコーしないのであとは入力された文字で処理を分けてやるだけ。
意外と簡単に書けたけど…… こんなの使うのかな?
[参考URL]
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/6991