Linux中Perl的sysread开销

时间:2012-05-02 23:36:33

标签: linux perl

我有一个网络守护程序,它在TCP套接字上接收固定长度(44字节)的消息。

我正在尝试确定用sysread读取的最佳字节长度是多少。我当然可以做一个44字节的sysread循环,但我想提出一个最佳的大小。

我可以看到一个优势就是没有说,一个兆字节的数据要做,但我也可以看到为什么做一千个sysread调用会导致速度变慢。

是否有通过公共互联网进行sysreads的良好规模建议?

编辑: 该脚本获得了一堆44字节的消息,它们排队等候。

3 个答案:

答案 0 :(得分:2)

越大越好!只要有任何字节可用,sysread就会返回。

由于您永远不能保证获得完整的消息,并且由于您永远不能保证不会有多条消息,因此您需要在Perl端进行循环。由于你已经在Perl端有一个循环,所以你也可以一次性从系统中获取尽可能多的数据,以避免不必要的系统调用。

use constant READ_SIZE => 65*1024;

my $buf = '';
while (1) {
   my $rv = sysread($fh, $buf, READ_SIZE, length($buf));
   die if !defined($rv);
   last if !$rv;

   while ($buf =~ s/^(.{44})//s) {
      my $msg = $1;
      process_msg($msg);
   }
}

选择尺码并监控$buf的尺码。如果它经常接近READ_SIZE,请增加READ_SIZE

答案 1 :(得分:1)

我不确定开销是多少,只有你可以测量一个是否比另一个更快,但如果我要尝试一个大小的蓝色天空,我会先用4092字节。这最多可以处理93条消息,并且它处于神奇的4Kb大小之下,这听起来像是一个很好的起点。

您可以在程序运行的系统上找到page size,并进行相应调整。我将从int(PAGE_SIZE / MESSAGE_SIZE)开始,看看每条消息的效果是否优于sysread

另一方面,perl uses 8KB buffers by default

 192 /* The default buffer size for the perlio buffering layer */
 193 #ifndef PERLIOBUF_DEFAULT_BUFSIZ
 194 #define PERLIOBUF_DEFAULT_BUFSIZ (BUFSIZ > 8192 ? BUFSIZ : 8192)
 195 #endif

您可能还会发现discussion that led to the change提供信息。

答案 2 :(得分:0)

系统调用不会复制未传输的字节。如果你有一个44字节的消息perl将始终返回一个44字节的字符串。您提供的大小仅为最大值,用于调整提供给内核的缓冲区的大小。提供超过44个字节的值是,如果有多个消息排队,您将在一个系统调用中获取所有消息。