GNU sort
でいくつかの大きなファイル(27ファイル全体で91GB)を並べ替えていたときに、iostat -dxk 3
の読み取り速度が5MB/sから10MB/sの間で、100%と非常に遅いことに気付きました。ディスク使用率。 cat large-file > /dev/null
を試してみましたが、同様のパフォーマンスが得られましたが、わずかに高くなっています。 cp large-file /tmp/
についても同じですが、/tmp
は別のディスクにあります。 vim
も同じように経験します。また、Rubyで記述したスクリプトは、ファイルの読み取りに役立ちます。ただし、書き込み速度は問題なく高速です。
編集:これらの操作は特定のディレクトリ内のファイルでのみ遅いようです。兄弟ディレクトリ(同じディスクパーティション)内の他のファイルでの同じ操作は、90MBPSを超える読み取り速度で高速になります。これこれらのファイルの作成方法が原因である可能性がありますか?他の多くのファイルを読み取り、最初の文字に応じて各行を適切な「バケットファイル」に書き込むことで作成しました。そのため、数千のファイルを読み取りながら、8つのプロセスを通じて27のファイルに一度に1つずつ、ほぼ同時に行を追加していました。これにより、ブロックが順番に並べられる可能性があります。代わりにファイルが故障していることを表しますか?したがって、その後の遅いシーケンシャル読み取り?
ただし、fio
を使用して順次読み取りパフォーマンスを測定しようとすると、73 MB/sでクロックインされました。また、同じマシンからFTP経由でいくつかのファイルをダウンロードすると、上司が適切な読み取り速度を取得したことも注目に値します。
ですから、これはどこかの構成の問題だと思いますが、どこにあるのかわかりません。理由は何で、どうすれば修正できますか?
編集:このマシンはCitrixXen仮想化で実行されています。
編集:sort
が大きなファイルをバッファーにロードしている間のiostat -dxk
の出力(cat/cpについても同様の出力を取得):
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
xvdb 0.00 0.00 1000.00 0.00 6138.61 0.00 12.28 24.66 24.10 0.99 99.41
xvdb1 0.00 0.00 1000.00 0.00 6138.61 0.00 12.28 24.66 24.10 0.99 99.41
xvda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
xvda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
編集:数時間後にさらにパフォーマンスが低下します(sort
の処理中にディスクが中断されました)。ほぼランダムIOのように見えますが、実行されているソート操作は1つだけで、他のプロセスはIOを実行していないため、読み取りはシーケンシャルである必要があります= /:
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
xvdb 0.00 0.00 638.00 0.00 2966.67 0.00 9.30 25.89 40.62 1.57 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
xvdb 0.33 0.00 574.67 0.00 2613.33 0.00 9.10 27.82 47.55 1.74 100.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
xvdb 0.00 0.00 444.33 0.00 1801.33 0.00 8.11 28.41 65.27 2.25 100.00
遅いファイルは非常に断片化されていますか?実行/usr/sbin/filefrag -v
filename
調べてください。次のような出力が得られます。
Checking big.file
Filesystem type is: ef53
Filesystem cylinder groups is approximately 4272
Blocksize of file big.file is 4096
File size of big.file is 96780584 (23629 blocks)
First block: 88179714
Last block: 88261773
Discontinuity: Block 6 is at 88179742 (was 88179719)
Discontinuity: Block 12233 is at 88192008 (was 88191981)
Discontinuity: Block 17132 is at 88197127 (was 88196911)
Discontinuity: Block 17133 is at 88255271 (was 88197127)
big.file: 5 extents found, perfection would be 1 extent
またはおそらくはるかに悪い。
システムが仮想化の下で実行されているとおっしゃいました。このアクセスは仮想ディスクイメージファイルを使用していますか?
スー、これはRAMが足りないという単純なケースだと思います...
RAM(「fio」テストのようにすべてが高速です。)よりも小さいファイルの読み取り/書き込みを行う場合の開始点です。)
OSがキャッシュできるよりも大きいデータで作業を開始すると、OSキャッシュがスワップを開始します(場合によってはディスクにさえ)(実際、4MBの読み取り速度がある場合はRAMの使用状況を確認する必要があります)
これまでの経験のように聞こえますが、このような大きなファイルの読み取り速度が遅くなっています。(DBがRAM)に収まらない大きなインデックスを使用していたときにまったく同じことをするのを見ました)
VM(これは私にとって非常に典型的なように聞こえます)での作業のオーバーヘッドも考えると)
ディスクがスワッピングされていないか、アクティブなメモリがいっぱいでないことを確認します(そして私に知らせてください):D