他の方法では再構築できなかった障害のある 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 を再構成することはできません。 、私は何かを台無しにしてデータを失う危険を冒したくありませんが、可能性はわずかです。