こんにちは、人工呼吸器/ワーカー/シンク パターンを使用して、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
これは単なるハードウェア リソースの不足ですか? データのバックログ?または、これを回避する方法はありますか?
OSX Mountain Lion を 16 GB メモリで、Python 2.7 を zmq 2.2.0.1 で実行しています。
ありがとう