Perl的典型套接字代码如下:
bind(Server, sockaddr_in($port, INADDR_ANY)) || die "bind: $!";
listen(Server,SOMAXCONN) || die "listen: $!";
如this page中所述,实际允许的最大值大约为5.这太低了!我正在使用unix域文件套接字并期望非常高的吞吐量。有没有办法增加最大队列长度?
答案 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这样的东西来监视你有数据的套接字,以及你正在监听的套接字。