您好我正在尝试使用呼吸机/工作人员/接收器模式使用ZeroMQ发送大数据包。
我尝试添加工人。每次,接收器进程内存使用量都会增加一点。然后它达到了大约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。
由于
答案 0 :(得分: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