首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zeromq内存泄漏(pyzmq)

Zeromq内存泄漏(pyzmq)
EN

Stack Overflow用户
提问于 2012-12-04 05:35:11
回答 1查看 2.1K关注 0票数 0

嗨,我试图用通风机/工人/水槽模式用ZeroMQ发送大数据包。

我试着增加工人。每次,接收器进程的内存使用量都会略有增加。然后,它到达一个临界点,大约在6或7名工人,突然记忆指数增长,直到它死亡与:

代码语言:javascript
复制
> *** 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)

下面是代码(只显示工人/接收器模式):

代码语言:javascript
复制
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

这仅仅是缺乏硬件资源吗?积压的数据?还是有办法避免这种情况?

我使用16‘m内存运行,用ZMQ2.2.0.1运行Python2.7。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2012-12-04 16:56:44

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

好吧,我们来算算吧。每个工人每10毫秒发送一次3.3MB。或者大约每秒300毫巴。现在你增加了更多的工人。当您达到5名工作人员时,您将发送大约1.5GB每秒。

我想你已经找到了你的机器的性能极限。当接收器进程与所有工作人员在同一台机器上运行时,它可以在每秒1-2GB之间消耗。当数据进入时,队列在接收器进程中的累积速度要比清空队列的速度要快得多,您就会耗尽内存。

还是有办法避免这种情况?

发送更小的信息?或者把工人和水槽过程放在不同的机器上。记住,工人们正在从水槽中窃取CPU资源。如果这是一台四核机器,那么使用接收器加上多达3名工作人员,操作系统可能会为每个进程分配几乎所有的处理器核心。

一旦添加了第4,第5,第6位工作人员,操作系统就不能给任何进程100%的核心。他们必须开始分享,所以即使消息速度加快,接收器也会减慢。这就解释了你所看到的内存使用量成倍增长的临界点。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13696725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档