加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:26:57 所属栏目:大数据 来源:网络整理
导读:我使用IO :: Socket :: INET使用Perl创建了一个客户端 – 服务器程序.我通过基于CGI的站点访问服务器.我的服务器程序将作为守护程序运行,并将接受多个同时连接.我的服务器进程占用大约100MB的内存空间(9个大型阵列,许多阵列……).我希望这些哈希驻留在内存中
我使用IO :: Socket :: INET使用Perl创建了一个客户端 – 服务器程序.我通过基于CGI的站点访问服务器.我的服务器程序将作为守护程序运行,并将接受多个同时连接.我的服务器进程占用大约100MB的内存空间(9个大型阵列,许多阵列……).我希望这些哈希驻留在内存中并共享它们,这样我就不必为每个连接创建它们.哈希创建需要10-15秒.

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

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

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

谢谢.

解决方法

而不是分叉,还有另外两种方法来处理并发连接.要么使用线程,要么使用轮询方法.

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

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

进一步研究这两个选项,并决定哪一个最适合你.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读