ストレージのスピードの計り方
よくベンチマークソフトとかで、ローカルドライブやらネットワークドライブやらのスピードを計るツールあったりして、なにげにそれを頼りにしてたりしました。実際に使うシーンを考えると大小さまざまなファイルのコピーをする必要があるわけで、シーケンシャルやら、4kぴったりの数千個のファイルなんてコピーしなかったりする。
んで、もっと実際に近い形でどうにかならないかなぁと思って作ってみました。
機能一覧
- fromパスとtoパスを指定出来る。
- toパスは複数指定できる。
- 指定されたfromパスを丸ごとtoパスにコピーする。
- コピーした後にファイルは消す
- コピー開始から消されるまでの時間を計測する
- 計測したデータは、指定したパスに好きな名前で保存できる。
- ファイル名には、ホスト名を含むことが出来る。
- コピー+削除を繰り返すループ機能付き(回数指定可能)
- ループした場合には、全体、個別、平均時間をログに残す
- 複数のPCから同時にコピーを開始できる
- 特定のフォルダに“goFLG"ファイルをtouchすることでコピーが開始する
- フラグファイルが生成されるまで何もしない
- 0.1秒間隔でフラグファイルが出来るかどうかを監視する
- goフラグファイルが出来たら、goフラグファイルのチェックをやめる
- loopFLGファイルが消去されたらgoFLGファイルのチェックをやめる
ソース
#!/usr/bin/env python import shutil import time import os flagDir = 'D://test' fromDir = 'D://src_bench' toDir = ['Z://tmp/benchmark', 'Q://tmp/benchmark'] logfile = 'R://tmp/logBench_%s.txt'%(getHostName()) looptime = 3 # コピー先確保 for i in toDir: if os.path.exists(i): shutil.rmtree(i) # コピーと削除 def copyFunc(fd, td): shutil.copytree(fd, td) shutil.rmtree(td) def copyGo(fd, td): t1 = time.time() copyFunc(fd, td) t2 = time.time() return t2-t1 def getHostName(): cmd = 'tracert -w 10 -h 1 localhost' p = os.popen2(cmd) host = p[1].read() return host.split('.')[0][19:] for td in toDir: timeArr = [0] while os.path.exists(flagDir + '/loopFLG'): if os.path.exists(flagDir + '/goFLG'): for i in range(looptime): timeArr.append(copyGo(fromDir, td)) break else: print 'do nothing' time.sleep(0.1) total = 0 ave = 0 for j in timeArr: total += j if len(timeArr) > 2: ave = total/(len(timeArr)-1) # ログ生成 log = [] log.append(time.strftime("%Y/%m/%d %H:%M:%S", time.localtime())) log.append(' ' + getHostName()) log.append(' from ' + fromDir + ' to ' + td) log.append(' ' + str(ave)) log.append(' ' + str(timeArr)) f = open(logfile, 'a') f.writelines(log) f.write("\n") f.close()
nutsにLog生成の部分手伝ってもらいました。
os.path.existsのデイデアは、HIGEに貰いました。
ありがとやす