关于python 2.7:Zeromq内存泄漏(pyzmq)

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