linux – 当大型父进程的子叉关闭时,如何防止Perl消耗大量内存?
发布时间:2020-12-14 02:23:15 所属栏目:Linux 来源:网络整理
导读:语境: 我有一个在Linux上运行的多分叉Perl(5.16)进程.父fork加载了大量的Perl代码(通过use / require)并分配了大量的数据结构(几GB).然后它创造了许多儿童叉子,所有儿童叉子并行工作.这样做是为了减少进程运行时的内存占用,因为fork()的写时复制特性意味着
语境:
我有一个在Linux上运行的多分叉Perl(5.16)进程.父fork加载了大量的Perl代码(通过use / require)并分配了大量的数据结构(几GB).然后它创造了许多儿童叉子,所有儿童叉子并行工作.这样做是为了减少进程运行时的内存占用,因为fork()的写时复制特性意味着子进程可以使用父进程的数据而不保留每个数据的大内存映像. 问题: 所有这一切都正常,直到我尝试关闭进程组.当我中断父节点(信号传播给所有子节点)时,运行代码的服务器上的内存立即填满,它开始交换,服务器上的其他进程停止运行.当一个copy-on-write fork关闭时,Perl似乎正在尝试重新分配父级中声明的所有内存,以便它可以免费标记它或者其他东西. 题: 如何防止这种臃肿的关机发生?有什么方法可以告诉孩子叉子只试图遍历并回收那些分配的那些分支的内存? 解决方法
内存页面的分配是由于退出时变量的重新分配.这对于调用析构函数是必要的.
调用POSIX :: _ exit()将立即退出,跳过每变量释放,但也跳过析构函数的调用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |