0

您好我正在尝试使用呼吸机/工作人员/接收器模式使用 ZeroMQ 发送大数据包。

我尝试添加工人。每次,sink 进程内存使用量都会增加一点。然后它在大约 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。

谢谢

4

1 回答 1

2

这仅仅是缺乏硬件资源吗?

好吧,让我们算一下。每个工作人员每 10 毫秒发送 3.3MB。或大约每秒 300mb。现在你添加了更多的工人。当您最多有 5 个工作人员时,您每秒发送大约 1.5GB。

我认为您已经找到了机器的性能限制。当 sink 进程与所有 worker 在同一台机器上运行时,它每秒能够消耗 1-2GB 之间的数据。当数据进入的速度比接收器进程中队列的建立速度快于它们被清空的速度时,您就会耗尽内存。

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

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

一旦添加了第 4、5、6 个 worker,操作系统就无法将 100% 的核心分配给任何进程。他们必须开始共享,因此即使消息速度加快,接收器也会变慢。这将解释您所看到的内存使用量呈指数增长的临界点。

嗯 - 这表明了一个有趣的实验。你能配置你的mac,让sink进程以非常高的优先级运行吗?这可能会带来更好的结果。我自己从未尝试过,但请参阅以下链接以获取想法... https://discussions.apple.com/thread/1491812?start=0&tstart=0

于 2012-12-04T16:56:44.297 回答