我有一个网络守护程序,它在TCP套接字上接收固定长度(44字节)的消息。
我正在尝试确定用sysread读取的最佳字节长度是多少。我当然可以做一个44字节的sysread循环,但我想提出一个最佳的大小。
我可以看到一个优势就是没有说,一个兆字节的数据要做,但我也可以看到为什么做一千个sysread调用会导致速度变慢。
是否有通过公共互联网进行sysreads的良好规模建议?
编辑: 该脚本获得了一堆44字节的消息,它们排队等候。
答案 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个字节的值是,如果有多个消息排队,您将在一个系统调用中获取所有消息。