2012-12-04 33 views
0

嗨我想用ZeroMQ使用呼吸机/工人/接收器模式发送大型数据包。Zeromq内存泄漏(pyzmq)

我尝试添加工人。每次,接收器进程内存使用量都会增加一点。然后它达到在大约6或7的工人一个临界点,其中呈指数突然存储器增加,直到它死亡与:

> *** error: can't allocate region 
> *** set a breakpoint in malloc_error_break to debug Assertion failed: (msg_->flags | ZMQ_MSG_MASK) == 0xff (zmq.cpp:211) 
> Python(42410,0xaccb8a28) malloc: *** mmap(size=3559424) failed (error 
> code=12) 

下面是代码(仅示出工人/汇图案):

import sys 
import resource 
import zmq 
import time 

context = zmq.Context() 


if sys.argv[1] == 'worker': 
    # Socket to send messages to 

    sender = context.socket(zmq.PUSH) 
    sender.connect("tcp://localhost:5558") 

    while True: 
     msg = 'x' * 3559333 
     time.sleep(.01) 
     sender.send(msg) 
else: 
    # Socket to receive messages on 

    receiver = context.socket(zmq.PULL) 
    receiver.bind("tcp://*:5558") 
    while True: 
     msg = receiver.recv() 

     print msg[0:5], len(msg), resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 

这仅仅是缺乏硬件资源吗?积压的数据?或者有没有办法避免这种情况?

我正在运行带有16GB内存的OSX Mountain Lion和带有zmq 2.2.0.1的Python 2.7。

感谢

回答

2

这是一个简单的缺乏硬件资源的?

那么,让我们来做数学。每个工作人员每10ms发送3.3MB。或约300mb一秒。现在你添加更多的工人。当你达到5个工作者时,你每秒发送大约1.5GB的数据。

我认为你已经找到了你的机器的性能限制。当接收器进程与所有工作器件在同一台机器上运行时,它可以消耗每秒1-2GB的能量。当数据进入的速度超过队列在接收进程中建立的速度时,它们可能会被清空并且内存不足。

或者有没有办法避免这种情况?

发送小消息?不太经常? :)或者将工人和水槽工艺放在不同的机器上。请记住,工作人员正在窃取接收器的CPU资源。如果这是一台四核心机器,那么在接收器加上多达3名工人的情况下,操作系统可能将几乎所有的处理器核心分配给每个进程。

一旦添加了第4,5,6个工作者,操作系统就无法将100%的内核交给任何进程。他们必须开始共享,所以即使消息速度加快,汇点也会减慢。这将解释您看到内存使用量呈指数增长的临界点。

嗯 - 这表明一个有趣的实验。你可以配置你的mac,以便接收器进程运行在一个非常高的优先级?这可能会带来更好的结果。我从来没有尝试过这个,但看到以下链接的想法... https://discussions.apple.com/thread/1491812?start=0&tstart=0

+0

感谢您的这一点。我尝试了nicing,它并没有帮助,但是它是一个缺乏网络。正如你所说,我可能会沉没在一个单独的盒子里。如有必要,我甚至可能会有多个接收器。 – user1556658

+0

这确实表明,尽管我最好不要在多个盒子中传播这个。相对于网络传输限制,计算时间太少。我最好选择ec2上的20个计算单元箱中的一个,并在那里完成所有工作。我想知道这种情况发生的频率如何,在一个将hadoop作为所有这些任务的解决方案出售的世界里。 – user1556658

+0

这当然比以上更多,但不会比分隔标签文本和计算和过滤更多。 – user1556658