2009-09-07 12 views
9

出力レートはどのようにハードディスクの書き込みレートよりも高くなる可能性がありますか?Perl:書き込み速度の謎?

アップデート1:私は、次のように変更されました:

アンチウイルスをオフにして
  1. 。変化なし。

  2. テスト用に新しい物理ディスクを挿入し、最初のパーティション を使用しました。 (最初のテストのディスクは、システムパーティションとは別の最終パーティション でしたが、同じ物理ディスク上の です)。結果:同じ 周期パターンがありますが、システムはで、 が応答なしではなくなりました。書き込み速度は、最初に パーティションを使用しているか、システム パーティションに干渉していないことが原因である可能性があります。 がやや高いです。予備的な結論:システムパーティションから何らかの種類の干渉がありました( )。

  3. インストール済み64ビットPerl。サイクルは終了し、 はすべて2秒のタイムスケールで安定しています。 の55%CPU、シングルコアの書き込み速度は約65 MB /秒です。

  4. 64ビットPerlで元のドライブを試しました。結果: の中間です。 8秒のサイクル、CPU20-50%、 35 - 65MB /秒(0-100%の深度サイクルの代わりに、0 - 120MB /秒)システムは軽度に応答しません。 書き込み速度は50 MB /秒です。これは干渉理論を支持する。

  5. Perlスクリプトでのフラッシュ。まだ試していない。


OK、私はfirst hurdleを過ぎました。私はPerlを書いた 非常に大きなテキストファイルを生成することができ、スクリプト(例えば、20 GB)と は、本質的にちょうど数である:

$ラインはでは「\ n」は、長い文字列です
print NUMBERS_OUTFILE $line; 

終わり。

Perlスクリプトは、書き込み速度は約120 MB/sの で開始する(スクリプトによって計算されたものとの間の一貫性、 Process ExplorerおよびパフォーマンスモニタでプロセスのPerl は、「IOは、バイト/秒を書く」。)と100単一コア上の%CPUそれは が実行されています。このレートは、私が信じているのは、ハードディスクの速度を と書くよりも高いです。

その後、システム全体が非常に応答しなくなり、CPUが 0%に降下します(たとえば、20秒と2.7GBが書き込まれた後) 。例えば、 30秒。これらの2つの段階での平均書き込み速度は、 で、ハードディスクの書き込み速度は と一致しています。この の段落に記載されている時間とサイズは、実行ごとに大きく異なります。これまでのところ、第1段階の1GB 〜4.3GBの範囲が観測されています。 ここにはtranscript for the run with 4.3 GBがあります。

これらのサイクルのいくつかのテストで生成された9.2ギガバイトのテキストファイル のためにあります。

Enter image description here

何が起こっていますか?


Perl scriptBAT driver script( preタグでフォーマットHTML)。 2つの環境変数MBSIZEと OUTFILEが設定されている場合、PerlスクリプトはWindows以外のプラットフォームでは を変更せずに実行できるはずです。

プラットフォーム:Perl 5.10.0 from ActiveState; (最初は32ビット、後で64ビット)。 Windows XP x64 SP2、ページファイルなし、8 GB RAM、AMDクアッドコアCPU、 500 GB Green Caviarハードディスク(書き込み速度85 MB/s?)。

答えて

5

私はこの問題は、バッファ充填した後、空にされていることを言っている皆と思います。バッファはあなたが少しを印刷しようとしている場合は、そうなど、いくつかの作業を行う、リッテを印刷し、働いています良いことができます

#!/usr/bin/perl 

use strict; 
use warnings; 

use IO::Handle; 

my $filename = "output.txt"; 

open my $numbers_outfile, ">", $filename 
    or die "could not open $filename: $!"; 

$numbers_outfile->autoflush(1); 

#each time through the loop should be 1 gig 
for (1 .. 20) { 
    #each time though the loop should be 1 meg 
    for (1 .. 1024) { 
     #print 1 meg of Zs 
     print {$numbers_outfile} "Z" x (1024*1024) 
    } 
} 

しかし、もし:(Perlで)バッファを避けるためにautoflushをオンにしてみてくださいデータをディスクに吹き飛ばしているだけで、奇妙な動作を引き起こす可能性があります。また、ファイルシステムが行っている書き込みキャッシュを無効にする必要があるかもしれません。

+0

ありがとう。私は64ビットPerlを試しましたが(更新された質問を参照してください)、次のステップはautoflushを有効にすることです。 –

+0

バッファーを保持している場合は、ファイルシステムを変更する必要があるかもしれません。 –

+1

autoflushはすべてのprint要素の後にシステムコールを行います。あなたの例では、一度に1 MBなので、パフォーマンスは良いでしょう。しかし、 'a'、 'b'、 'c'、 'd'を印刷すると、それぞれ1つの文字の4つのシステムコールがあるので、非常に悪いことになります。 –

5

すべてのデータは、物理ディスクに効果的に配置される前にバッファにキャッシュされます。システムからのバッファー、ディスク自体のバッファー(おそらく32MBのバッファー)。これらのバッファを埋める間、プログラムは最高速度と100%CPUで実行されます。バッファーがいっぱいになると、プログラムはディスクを待つことになります。これはメモリーやバッファーよりもはるかに遅く、この待機はこのCPUをすべて消費するのを止めさせます。

fflush()に相当するPerlを使って、コードを "ディスクを待つ"ようにすることができます。

+0

ファイルバッファがあると思います。しかし数GBのサイズではありません(?) –

+4

Linuxシステムでは、バッファは通常ほとんどすべての空きRAMに広がるように設定されています。 –

+0

彼はLinuxを使用していません... –

4

OSはできるだけ早くディスクに書き込み(85 MB /秒)、余分な35 MB /秒をバッファに入れて、いっぱいになるとバッファをフラッシュするようにアプリケーションを一時停止しています。バッファは85 MB/sで排水されているので、排水するのに35/85 =〜0.4倍の時間がかかります。私が十分に細かく見れば、それはあなたのグラフと広く互換性があります。

バッファのサイズは、一時停止時間とディスク速度の積として推定できます。

3

グラフを見てください! 緑色の線は、平均ディスクキューの長さを示します。ある時点でピークに達し、CPUはその後0になります。 IO書き込みは0にもなります。2番目のピークが表示されるまで通常に戻ります。その後、CPUとIOは通常に戻ります。その後、IOとCPUの両方が再び降下し、次のキューピークで再び上昇します。そしてもう一度、もう一度上げてください。

その時点で、ディスクに物理的な書き込みが行われている可能性があります。しかし、システムがその時点でディスク検証を行い、書き込みを検証するために書き込んだデータを読み込み、データが正しく書き込まれていることを確認することもできます。

私が気づく別のものは、2.7 GBのサイズです。これをWindowsシステム上で実行しているので、私は32ビットプロセスとしてWindowsが処理できるメモリ量について疑問に思っています。 64ビットWindowsはアプリケーションに最大3 GBのRAMを提供しますが、もう一度リリースする必要があります。 Process Explorerを使用して、使用中のRAMの量とIOの読み込み量を確認することができます。

、おそらく64ビットPerlのバージョンを使用して...

+0

2.7 GBについて:私は3GB以上が可能かどうかは分かりませんが、すでに1GBで発生する可能性があります。例えば、私がこれを書いた直前に、私はそれをもう一度実行し、最初のフェーズは1.2 GB(1139 MBと1273 MBの間のどこか)で終了しました。 –

+0

RAMの量はどういう意味ですか? Perlプロセスの量? Perlプロセスの "Private bytes"は、実行中に4 MBで一定のままです。スクリプトを開始すると、約6.3 GBのRAMが解放されます。 –

+0

もう一度試しました。今回は、第1段階が約4.3GBで終了しました(4.19GBから4.41GB [4288.3 MB; 4513.7 MB]の間)。以下は実行の記録です:http://www.pil.sdu.dk/1/until2039-12-31/PerlPerfTranscript_2009-09-07b.txt –

関連する問題