语境:
我有一个在Linux上运行的多分叉Perl(5.16)进程.父fork加载了大量的Perl代码(通过use / require)并分配了大量的数据结构(几GB).然后它创造了许多儿童叉子,所有儿童叉子并行工作.这样做是为了减少进程运行时的内存占用,因为fork()的写时复制特性意味着子进程可以使用父进程的数据而不保留每个数据的大内存映像.
问题:
所有这一切都正常,直到我尝试关闭进程组.当我中断父节点(信号传播给所有子节点)时,运行代码的服务器上的内存立即填满,它开始交换,服务器上的其他进程停止运行.当一个copy-on-write fork关闭时,Perl似乎正在尝试重新分配父级中声明的所有内存,以便它可以免费标记它或者其他东西.
题:
如何防止这种臃肿的关机发生?有什么方法可以告诉孩子叉子只试图遍历并回收那些分配的那些分支的内存?