Perl:写速度之谜?

时间:2009-09-07 21:27:20

标签: performance perl hard-drive

输出速率如何高于硬盘写入速率?

更新1 :我更改了以下内容:

  1. 关闭防病毒软件。没有变化。

  2. 插入新物理磁盘并使用第一个分区 为了测试。 (初始测试的磁盘是在 最后一个分区,与系统分区分开,但是 在同一个物理磁盘上。)结果:有相同的 循环模式,但系统不再 测试期间没有反应。写入速度是 稍微高一点(可能是因为使用了第一个 分区和/或不再干扰系统 划分)。初步结论:有某种 来自系统分区的干扰。

  3. 安装64位Perl。周期不见了 一切都在2秒的时间范围内保持稳定:55%的CPU开启 单核,写入速度约为65 MB / s。

  4. 使用64位Perl在原始驱动器上尝试。结果: 中间某个地方。循环8秒,CPU 20-50%, 35 - 65 MB /秒(而不是0-100%的深循环,0 - 120 MB /秒)。该系统只是略微没有反应。 写入速度为50 MB /秒。这支持干扰理论。

  5. 在Perl脚本中刷新。尚未尝试过。


  6. 好的,我超越了first hurdle。我写了一个Perl 可生成非常大的文本文件(例如20 GB)的脚本 基本上只是一些:

    print NUMBERS_OUTFILE $line;
    

    其中$ line是一个长字符串,末尾带有“\ n”。

    当Perl脚本启动时,写入速率约为120 MB / s (在脚本计算的内容之间保持一致, 进程Perl的Process Explorer和“IO Write Bytes / sec” 在性能监视器中。)和100%CPU在单核上 正在运行。我认为,这个比率高于写作率 硬盘的速度。

    然后过了一段时间(例如写入20秒和2.7 GB) 整个系统变得非常反应迟钝,CPU掉到了 0%。最后一个例如30秒。平均写入速度 这两个阶段的写入速度与写入速度一致 硬盘。这里提到的时间和大小 段落因运行而异。范围1 GB 到目前为止,已观察到第一阶段为4.3 GB。 这是transcript for the run with 4.3 GB

    9.2 GB文本文件有几个这样的周期 在测试中生成:

    Enter image description here

    发生了什么事?


    完整Perl scriptBAT driver script(HTML格式化为 预标签)。如果两个环境变量MBSIZE和 设置OUTFILE然后Perl脚本应该能够运行 在除Windows之外的其他平台上没有变化。

    平台:ActiveState的Perl 5.10.0;           (最初是32位,后来是64位);建立1004。           Windows XP x64 SP2,无页面文件,8 GB RAM,AMD四核CPU,           500 GB绿色鱼子酱硬盘(写入速度85           MB / s的?)。

4 个答案:

答案 0 :(得分:5)

在有效放置在物理磁盘中之前,所有数据都缓存在缓冲区中。来自系统的缓冲区,另一个位于磁盘内部(可能是32MB缓冲区)。当您填充这些缓冲区时,您的程序将以全速和100%CPU运行。一旦缓冲区已满,程序就会等待磁盘,这比内存和缓冲区慢得多,而这种等待会让你停止使用所有这些CPU。

也许你可以从一开始就使你的代码“等待磁盘”,使用一些等效于fflush()的Perl。

答案 1 :(得分:5)

我和其他所有人说这个问题是填充缓冲然后清空。尝试打开autoflush以避免使用缓冲区(在Perl中):

#!/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)
    }
}

如果你打算稍微打印,工作,打印一个小工作,做一些工作等等,缓冲区可能会很好。但如果你只是将数据爆破到磁盘上,它们可能会导致奇怪的行为。您可能还需要禁用文件系统正在执行的任何写缓存。

答案 2 :(得分:4)

也许操作系统尽可能快地写入磁盘(85 MB / s),并将多余的35 MB / s放入缓冲区,当它填满时,暂停应用程序以刷新缓冲区。由于缓冲区的排放速度为85 MB / s,因此您需要耗费35/85 = ~0.4倍的排水时间。如果我眯着眼睛,这与你的图表大致兼容。

您可以将缓冲区的大小估计为暂停时间和磁盘速度的乘积。

答案 3 :(得分:3)

看看图表! 绿线表示平均磁盘队列长度。在某一时刻,它达到峰值,然后CPU变为0。 IO写入也会变为0.它会恢复正常,直到显示第二个峰值。然后CPU和IO写入恢复正常。然后IO和CPU再次下降,在下一个Queue峰值再次上升。又一次,然后又一次......

可能是磁盘正在进行物理写入。但是,也可能是系统正在进行磁盘验证,读取刚写入的数据以验证写入,确保数据写入正确。

我注意到的另一件事是2.7 GB大小。因为你在Windows系统上运行它,所以我有点怀疑,因为这是关于Windows可以处理的内存量,作为32位进程。 64位Windows将为应用程序提供高达3 GB的RAM(少一点)但是它需要再次释放它。您可能希望使用Process Explorer检查正在使用的RAM量和IO读取量。

也许使用64位Perl版本......

相关问题