Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 多处理内存使用和twisted/gevents_Memory_Multiprocessing_Twisted_Cpu_Gevent - Fatal编程技术网

Memory 多处理内存使用和twisted/gevents

Memory 多处理内存使用和twisted/gevents,memory,multiprocessing,twisted,cpu,gevent,Memory,Multiprocessing,Twisted,Cpu,Gevent,所以我的。。。犯错误应用程序执行以下操作: 在队列中侦听“工作” 每台服务器产生大约100个工作线程(跨越~3台服务器),每个工作线程都在队列中侦听 每个工人基本上都会做一些网络工作(ssh、snmp等)(i/o密集型),然后搅动输出(非常cpu密集型) 我在多处理下工作,效果非常好。然而:每个工作人员使用的内存都比我想要的要多(根据top,大约30MB的分辨率,450MB的VIRT)。所以我有两个问题: 对于我来说,确定开销为何如此之高的最佳方法是什么?我猜这头牛工作不太好。。。在进行多

所以我的。。。犯错误应用程序执行以下操作:

  • 在队列中侦听“工作”
  • 每台服务器产生大约100个工作线程(跨越~3台服务器),每个工作线程都在队列中侦听
  • 每个工人基本上都会做一些网络工作(ssh、snmp等)(i/o密集型),然后搅动输出(非常cpu密集型)
我在
多处理
下工作,效果非常好。然而:每个工作人员使用的内存都比我想要的要多(根据top,大约30MB的分辨率,450MB的VIRT)。所以我有两个问题:

  • 对于我来说,确定开销为何如此之高的最佳方法是什么?我猜这头牛工作不太好。。。在进行多处理之前,我可以使用哪些模块来获取所有主线程内存的快照,以便减少初始占用空间

  • 鉴于我的大多数进程都是cpu受限的,将代码移植到gevent/twisted会有好处吗?我想使用每台服务器的双十六进制内核


谢谢

CPython使用引用计数来实现所有Python对象的内存管理。其工作方式是,每个Python对象都表示为一个结构,每个结构中都有一个字段,给出引用计数。每当对对象进行新引用时,该字段中的引用计数都会增加。每当放弃对对象的引用时,该字段中的引用计数都会递减。一旦引用计数为零,解释器就可以非常确定不再需要Python对象,并且可以释放分配给表示它的结构的内存

很多事情会改变对象的引用计数。将其传递给函数或将其分配给对象的(局部或全局)变量或属性将增加引用计数(许多其他操作也是如此)。这些函数的相反方向递减引用计数:例如,从函数返回将递减所有局部变量的引用计数

与您的问题相关的原因是,它应该让您了解为什么从
fork()
中得到的写时复制行为不会帮助您节省大量内存。CPython运行时几乎立即将访问大部分内存页(写时内存拷贝的基本单元-通常为4kB,可能更大),并用3s替换大量2,或用3s替换大量4s或其他任何内容。这将强制复制进程的大部分内存


事件驱动系统将通过允许您同时执行许多I/O绑定任务来帮助实现这一点。您仍然可以使用多个进程(至少使用Twisted)来利用您拥有的额外CPU资源。单个事件驱动的进程可以完成所有必要的联网,然后将生成的数据传递给工作进程,这些工作进程可以使用其余的CPU。不过,您可以更精确地了解在这些额外进程中运行的代码。从你的问题来看,我怀疑你认为你的员工不需要你“主要”流程中加载的所有内容。使用Twisted的进程管理API,他们不必在这些事情上花费任何内存。

CPython使用引用计数来实现所有Python对象的内存管理。其工作方式是,每个Python对象都表示为一个结构,每个结构中都有一个字段,给出引用计数。每当对对象进行新引用时,该字段中的引用计数都会增加。每当放弃对对象的引用时,该字段中的引用计数都会递减。一旦引用计数为零,解释器就可以非常确定不再需要Python对象,并且可以释放分配给表示它的结构的内存

很多事情会改变对象的引用计数。将其传递给函数或将其分配给对象的(局部或全局)变量或属性将增加引用计数(许多其他操作也是如此)。这些函数的相反方向递减引用计数:例如,从函数返回将递减所有局部变量的引用计数

与您的问题相关的原因是,它应该让您了解为什么从
fork()
中得到的写时复制行为不会帮助您节省大量内存。CPython运行时几乎立即将访问大部分内存页(写时内存拷贝的基本单元-通常为4kB,可能更大),并用3s替换大量2,或用3s替换大量4s或其他任何内容。这将强制复制进程的大部分内存


事件驱动系统将通过允许您同时执行许多I/O绑定任务来帮助实现这一点。您仍然可以使用多个进程(至少使用Twisted)来利用您拥有的额外CPU资源。单个事件驱动的进程可以完成所有必要的联网,然后将生成的数据传递给工作进程,这些工作进程可以使用其余的CPU。不过,您可以更精确地了解在这些额外进程中运行的代码。从你的问题来看,我怀疑你认为你的员工不需要你“主要”流程中加载的所有内容。使用Twisted的流程管理API,他们不必在这些东西上花费任何内存。

关于Pycon的一次精彩演讲解释了这个主题。这半个小时花得真不错


归根结底,要真正了解使用了多少内存,不应该查看顶部输出,而应该检查在运行100个worker之前和之后您有多少可用内存

有一次关于Pycon的精彩演讲,解释了这个主题。这半个小时花得真不错

底线是,要真正了解使用了多少内存,不应该查看顶部输出,而是