如何在内存使用量较大的Perl守护程序中处理多个套接字?

5 sockets perl multithreading ipc multiprocessing

我使用IO :: Socket :: INET使用Perl创建了一个客户端 - 服务器程序.我通过基于CGI的站点访问服务器.我的服务器程序将作为守护程序运行,并将接受多个同时连接.我的服务器进程占用大约100MB的内存空间(9个大型阵列,许多阵列......).我希望这些哈希驻留在内存中并共享它们,这样我就不必为每个连接创建它们.哈希创建需要10-15秒.

每当通过套接字接受新连接时,我会分叉一个新进程来处理收到的每个连接的处理.由于父进程很大,每次我分叉时,处理器都会尝试为新的子进程分配内存,但是由于内存有限,需要很长的时间来生成一个新的子进程,从而增加了响应时间.很多时候,即使是单个连接,它也会挂起.

父进程创建9个大哈希.对于每个孩子,我需要以只读模式引用一个或多个哈希.我不会通过孩子更新哈希.我想使用像copy-on-write这样的东西,通过它我可以与所有孩子共享整个100mb或由父母创建的全局变量?或任何其他机制,如线程.我希望服务器每秒至少得到100个请求,它应该能够并行处理所有这些请求.平均而言,孩子将在2秒内退出.

我在Windows XP上使用Cygwin只有1GB的RAM.我没有找到任何方法来克服这个问题.你能提出什么建议吗?如何共享变量并每秒创建100个子进程并管理它们并同步它们,

谢谢.

小智 4

除了分叉之外,还有另外两种方法来处理并发连接。您可以使用线程或轮询方法。

在线程方法中,每个连接都会创建一个新线程来处理套接字的 I/O。线程在创建进程的同一虚拟内存中运行,并且可以访问其所有数据。确保正确使用锁来同步数据的写入访问。

更有效的方法是通过 select() 使用轮询。在这种情况下,单个进程/线程处理所有套接字。这是在假设大多数工作都是 I/O 并且等待 I/O 请求完成的时间都花在处理其他套接字上的假设下工作的。

进一步研究这两个选项并决定哪一个最适合您。

例如,请参见: http: //www.perlfect.com/articles/select.shtml