使用Perl的高性能套接字服务器

Nic*_*ckD 2 sockets linux perl

我需要使用perl编写一个套接字服务器,它将在64位linux(2.6x内核)上运行.是否有一个库来支持IO完成端口和Linux上的一些等价物?

我需要听多个端口.8000-8100是否有这样做的聪明方法?

协议必须使用长度字节.

你推荐什么线程库?我在Windows上使用基于协作式多任务处理的threadscheduler编写了类似的东西.我的意思是我想避免为每个套接字创建一个线程来处理超过10,000个同时的连接.

提前致谢.

mie*_*war 5

通常不建议使用Perl中的线程.

相反,为了获得高性能,您应该考虑调查non blockingevent driven programming.

使用常规套接字,您的进程会阻止每个IO操作,即从未准备好的套接字读取将使您的进程进入休眠状态,直到数据可用.在非阻塞/事件驱动的情况下,当套接字准备好被读取或写入时,您可以轮询套接字并获得回调,因此单个进程可以在许多套接字上进行多路复用,从而提供良好的可伸缩性能,因为您不需要分叉新的处理更多客户的流程.

Perl中有许多基于事件的好框架,例如POEAnyEvent POE是一个具有大量模块和功能的特定事件循环,AnyEvent是一个抽象层,允许您在同一代码中使用多个事件循环.

您还应该研究一下类似于POE的libev,但开销要少得多.

编写事件驱动的代码起初有点棘手,因为你需要小心你所拥有的阻塞代码,例如cpu密集型操作,或者使用非阻塞的库.因为你只有一个进程,如果它忙于做某事,它就不能做任何事情 - 比如在套接字上轮询并发出回调.

因此,如果您需要非阻塞和密集计算,一种方法是创建工作分叉并使用非阻塞管道在它们与事件循环之间进行通信,这对于上述库来说非常简单.