perl - 如何在内存占用大的Perl守护程序中处理多个套接字?

标签 perl multithreading sockets ipc multiprocessing

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

每当通过套接字接受新连接时,我都会派生一个新进程来处理接收到的每个连接的处理。由于父进程很大,因此每次我 fork 时,处理器都会尝试为新的子代分配内存,但是由于内存有限,生成新的子代会花费大量时间,从而增加了响应时间。很多时候,即使是单个连接,它也会挂掉。

父进程会创建9个大哈希。对于每个 child ,我需要以只读模式引用一个或多个哈希。我不会通过 child 更新哈希。我想使用写时复制之类的方法,通过它我可以与所有 child 共享整个100mb或由父级创建的整个全局变量?或任何其他机制,例如线程。我希望服务器每秒至少可以收到100个请求,并且它应该能够并行处理所有请求。平均而言,一个 child 会在2秒内退出。

我在只有1GB RAM的Windows XP上使用Cygwin。我没有找到解决此问题的任何方法。你能建议点什么吗?如何共享变量并每秒创建100个子进程,并对其进行管理和同步,

谢谢。

最佳答案

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

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

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

对这两种选择进行进一步研究,并确定哪种最适合您。

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

关于perl - 如何在内存占用大的Perl守护程序中处理多个套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/359093/

相关文章:

perl - 在将请求从安全服务器重定向到非安全服务器期间,来自 PERL 脚本的 HTTP 错误 508

arrays - Perl 可以检测数组吗?

perl - 在 Windows 7 上设置 Active Perl 5.8.6

java - 为什么我的线程不同时启动? java

Linux 应用程序在没有套接字的情况下发送 UDP

perl - 如何在 Perl 中读取固定长度的记录?

c - C : do we need to set unused thread to NULL? 中的多线程

c++ - pthread_join 是一个瓶颈

c - 这个数据报套接字有什么问题?

linux - emacs套接字的位置