linux – 当大型父进程的子叉关闭时,如何防止Perl消耗大量内存?

语境:

我有一个Linux上运行的多分叉Perl(5.16)进程.父fork加载了大量的Perl代码(通过use / require)并分配了大量的数据结构(几GB).然后它创造了许多儿童叉子,所有儿童叉子并行工作.这样做是为了减少进程运行时的内存占用,因为fork()的写时复制特性意味着子进程可以使用父进程的数据而不保留每个数据的大内存映像.

问题:

所有这一切都正常,直到我尝试关闭进程组.当我中断父节点(信号传播给所有子节点)时,运行代码的服务器上的内存立即填满,它开始交换,服务器上的其他进程停止运行.当一个copy-on-write fork关闭时,Perl似乎正在尝试重新分配父级中声明的所有内存,以便它可以免费标记它或者其他东西.

题:

如何防止这种臃肿的关机发生?有什么方法可以告诉孩子叉子只试图遍历并回收那些分配的那些分支的内存?

解决方法

内存页面的分配是由于退出时变量的重新分配.这对于调用析构函数是必要的.

调用POSIX :: _ exit()将立即退出,跳过每变量释放,但也跳过析构函数调用.

相关文章

Linux中的ARP防火墙主要用于防御ARP欺骗攻击,其效果取决于多...
insmod和modprobe加-f参数导致Invalid module format错误 这...
将ArchLinux安装到U盘 几个月前入门Arch的时候上网搜了不少安...
1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...