我有一个在Linux上运行的多分叉Perl(5.16)进程.父fork加载了大量的Perl代码(通过use / require)并分配了大量的数据结构(几GB).然后它创造了许多儿童叉子,所有儿童叉子并行工作.这样做是为了减少进程运行时的内存占用,因为fork()的写时复制特性意味着子进程可以使用父进程的数据而不保留每个数据的大内存映像.
问题:
所有这一切都正常,直到我尝试关闭进程组.当我中断父节点(信号传播给所有子节点)时,运行代码的服务器上的内存立即填满,它开始交换,服务器上的其他进程停止运行.当一个copy-on-write fork关闭时,Perl似乎正在尝试重新分配父级中声明的所有内存,以便它可以免费标记它或者其他东西.
题:
如何防止这种臃肿的关机发生?有什么方法可以告诉孩子叉子只试图遍历并回收那些分配的那些分支的内存?
解决方法 内存页面的分配是由于退出时变量的重新分配.这对于调用析构函数是必要的.调用POSIX :: _ exit()将立即退出,跳过每变量释放,但也跳过析构函数的调用.
总结以上是内存溢出为你收集整理的linux – 当大型父进程的子叉关闭时,如何防止Perl消耗大量内存?全部内容,希望文章能够帮你解决linux – 当大型父进程的子叉关闭时,如何防止Perl消耗大量内存?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)