Zeromq memory leak (pyzmq)
嗨,我正尝试使用呼吸机/工作机/水槽模式通过ZeroMQ发送大型数据包。
我尝试添加工人。每次,接收器进程的内存使用量都会增加一点。然后它到达大约6或7个工作点的临界点,在这里突然的记忆力成指数增长,直到死于:
1 2 3 4 | > *** 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) |
以下是代码(仅显示工作程序/接收器模式):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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。
谢谢
Is this simply a lack of hardware resources?
好吧,让我们做一下数学。每个工作人员每10ms发送3.3MB。大约每秒300mb。现在,您添加了更多工人。到您有多达5位工作人员时,您每秒将发送约1.5GB。
我认为您已经找到了机器的性能极限。当接收器进程与所有工作进程都在同一台计算机上运行时,它每秒可以消耗1-2GB的内存。当数据传入的速度快于接收器进程中队列的建立速度,而其清空速度却快于空,从而导致内存不足。
Or is there a way of avoiding this?
发送较小的消息?不太频繁? :)或将工人和下沉过程放在不同的机器上。请记住,工作人员正在从接收器中窃取CPU资源。如果这是四核计算机,那么在接收器加上最多3个工人的情况下,操作系统可能会为每个进程分配几乎所有处理器核。
一旦添加了第4,第5,第6个工作程序,则操作系统将无法为任何进程提供100%的内核。他们必须开始共享,因此即使邮件速率加快,接收器的速度也会降低。这将解释您所看到的内存使用量成指数增长的转折点。
嗯-这表明是一个有趣的实验。您可以配置Mac,使接??收器进程真正高优先级地运行吗?那可能会带来更好的结果。我自己从未尝试过此方法,但请参见以下链接获取想法... https://discussions.apple.com/thread/1491812?start=0