1

他の方法では再構築できなかった障害のある RAID5 アレイからデータを読み取って再構築するための簡単な Python スクリプトを作成していました。私のスクリプトは実行されていますが、ゆっくりです。私の元のスクリプトは約 80MB/分で実行されました。その後、スクリプトを改善し、毎分 550MB で実行していますが、それでも少し低いようです。Python スクリプトは 100% の CPU を使用しているため、ディスク制限ではなく CPU のように見えます。これは、最適化の機会があることを意味します。スクリプトはそれほど長くないため、効果的にプロファイリングすることができません。そのため、何がすべてを食い尽くしているのかわかりません。これが現在の私のスクリプトです(または少なくとも重要な部分)

disk0chunk = disk0.read(chunkSize)
#disk1 is missing, bad firmware
disk2chunk = disk2.read(chunkSize)
disk3chunk = disk3.read(chunkSize)
if (parityDisk % 4 == 1): #if the parity stripe is on the missing drive
  output.write(disk0chunk + disk2chunk + disk3chunk)
else: #we need to rebuild the data in disk1
  # disk0num = map(ord, disk0chunk) #inefficient, old code
  # disk2num = map(ord, disk2chunk) #inefficient, old code
  # disk3num = map(ord, disk3chunk) #inefficient, old code
  disk0num = struct.depack("16384l", disk0chunk) #more efficient new code
  disk2num = struct.depack("16384l", disk2chunk) #more efficient new code
  disk3num = struct.depack("16384l", disk3chunk) #more efficient new code
  magicpotato = zip(disk0num,disk2num,disk3num)
  disk1num = map(takexor, magicpotato)
  # disk1bytes = map(chr, disk1num) #inefficient, old code
  # disk1chunk = ''.join(disk1bytes) #inefficient, old code
  disk1chunk = struct.pack("16384l", *disk1num) #more efficient new code

  #output nonparity to based on parityDisk

def takexor(magicpotato):
  return magicpotato[0]^magicpotato[1]^magicpotato[2]

この巨大なテキスト ブロック内の実際の質問を太字で示します。

これをより速く/より良くするためにできることはありますか? 何も思い浮かばない場合、これが遅くなる原因をよりよく調査するためにできることはありますか? (行ごとのレベルで python をプロファイリングする方法さえありますか?) 私はこれを正しい方法で処理していますか、それとも大量のバイナリ データを処理するためのより良い方法がありますか?

私が尋ねる理由は、3 TB ドライブの再構築があり、正常に動作しているにもかかわらず (イメージ ro、loop をマウントし、ファイルを正常に参照できます)、長い時間がかかっているためです。古いコードでは 1 月中旬までかかると測定しましたが、今ではクリスマスまでかかるようになっています (したがって、はるかに良くなっていますが、それでも予想よりは遅いです。)

質問する前に、これは mdadm RAID5 (64kb ブロックサイズ、左対称) ですが、mdadm メタデータが何らかの形で欠落しており、mdadm ではメタデータをディスクに書き換えずに RAID5 を再構成することはできません。 、私は何かを台無しにしてデータを失う危険を冒したくありませんが、可能性はわずかです。

4

2 に答える 2

3
  1. map(takexor, magicpotato) - これはおそらく直接反復で行う方がよいでしょう。map は、他の python コードの AFAIK を呼び出す必要がある場合は効率的ではありません。呼び出しを実行するには、16384 フレーム オブジェクトを構築して破棄する必要があります。

  2. 構造体の代わりに配列モジュールを使用する

  3. それでも遅すぎる場合は、cython でコンパイルし、いくつかの静的型を追加します (おそらく 2 ~ 3 桁高速になります)。

于 2010-12-22T09:08:24.327 に答える
0

Google for: widefinder python。メモリ マッピング IO など、Python エントリで説明されているテクニックの一部が役立つ場合があります。

于 2010-12-22T09:06:50.517 に答える