是否可以增加Perls套接字的QUEUE SIZE值?

时间:2009-06-15 17:57:38

标签: perl sockets

Perl的典型套接字代码如下:

bind(Server, sockaddr_in($port, INADDR_ANY))    || die "bind: $!";
listen(Server,SOMAXCONN)                || die "listen: $!";

this page中所述,实际允许的最大值大约为5.这太低了!我正在使用unix域文件套接字并期望非常高的吞吐量。有没有办法增加最大队列长度?

4 个答案:

答案 0 :(得分:2)

从您提供的文档中,听起来限制不是Perl,而是操作系统。那就是说,你试过调整它并将其设置为高于5吗?您链接到的出版物是在1996年写的 - 从那以后Perl和操作系统发生了很多变化。

此外,如果您想要一个更加面向对象的Perl套接字接口,您可能需要查看IO :: Socket(和IO :: Socket :: UNIX)。

答案 1 :(得分:2)

队列是未完成的非accept()ed连接的数量。您确定要有大量未决连接吗?这不是活动或使用中连接的数量。据推测,您正在尽快将已接受的连接传递给工作人员,而不是在接受循环中处理它们。

你的accept()处理程序应该是一个非常短的操作,它接受一个新的连接并将它传递给你的连接处理程序。然后返回并尝试接受()更多连接。您只需要一个足够深的队列来容纳通过此循环所需的时间。

答案 2 :(得分:2)

Perl的Socket module使您的平台socket.h中的常量可用,因此Perl会让您指定一个积压深度,例如C程序可以。考虑:

$ perl -MSocket -le 'print SOMAXCONN'
128

答案 3 :(得分:1)

CentOS linux和MAC OS X将限制报告为128.这些限制适用于高吞吐量的Web服务器等,因此您应该没问题。你只需要使用像IO :: Poll这样的东西来监视你有数据的套接字,以及你正在监听的套接字。