【发布时间】:2019-07-28 16:58:46
【问题描述】:
这最初出现在 Python 中,但后来在 C++ 中被复制。这是在我的新笔记本电脑上提炼并复制行为的单元测试。这些只是本地套接字连接。
def test_zmq_publisher_duration(self):
max_duration = 1.0
t0 = time.time()
socket = zmq.Context.instance().socket(zmq.PUB)
duration = time.time() - t0
print(socket)
self.assertLess(duration, max_duration, msg="socket() took too long.")
在其他计算机上,在我的旧笔记本电脑上,这会在 一小部分 秒内运行。但是,在我的新笔记本电脑(强劲的戴尔 Precision 7730)上,这大约需要 44 秒。创建 zmq.SUB(订阅者)套接字时,我得到了类似的结果。
如果我进入 socket() 调用,则一直消耗的两条语句如下:
zmq/sugar/context.py
class Context
def instance(cls, io_threads=1):
...
cls._instance = cls(io_threads=io_threads)
...
def socket(self, socket_type, **kwargs)
...
s = self._socket_class(self, socket_type, **kwargs)
...
我感到困惑和困惑。笔记本电脑上的其他一切似乎都很好。也许我以某种稍微不同的方式 pip 安装 我的依赖模块?以前安装的 zmq 模块与 pyzmq 会导致问题吗?也许是我们 IT 部门的笔记本电脑设置中的一些东西?我尝试过以管理员身份运行、在 PyCharm 中运行、从命令行运行以及在运行时拔下网线。
我对 Python 和 ZMQ 比较陌生,但我们已经在这个项目上开发了几个月,没有出现性能问题。在生产代码中,我们有一个 MessageBroker 类,其中包含大部分 pub/sub 架构。上面的单元测试是通过简单地从我们的 MessageBroker.Publisher 构造函数(创建套接字)中拉出第一行重要的代码来创建的。即使在这台计算机上创建套接字很慢,我们的应用程序仍然会在创建套接字后正常运行。启动应用程序只需 7 分钟。
我怀疑 Ed 的调试法则:“行为越离奇,错误就越愚蠢。”
【问题讨论】:
-
我不知道这是否可以帮助你,但网络相关的东西通常很长的延迟来自图书馆/网络堆栈内部的一些非必要的网络服务超时失败(并被重试多次)出于某种原因 - 比如说,一些应该是即时但挂起的内部 DNS 查询。并不是说情况确实如此,但这是我调查的总体方向。如果你在Linux上,尝试在
strace下运行它;在任何平台上,在本机代码调试器下运行您的程序,在等待期间停止它,看看它在做什么。 -
感谢马特奥的建议。 PyCharm 和 pdb 只让我在 zmq/sugar/context 中调试到一定深度。我正在研究让我进行更深入调试的方法。
-
确实,如果您在 Linux 或其他本机调试器(macOS IIRC 上的 lldb 和 Windows 上的 windbg/visual studio/cdb)上,您应该使用 gdb 并查看较低级别的情况。跨度>
-
这是一个窗口框。我尝试在 Visual Studio 中创建一个 C++ 项目,该项目使用从 NuGet 提取的 ZMQ 库。它也表现出相同的延迟。对于这个特定的库,我没有现成的 ZMQ 源文件,但我可以看到反汇编。大多数情况下,当我暂停执行时,调用堆栈是:create_socket -> reaper_t -> mailbox_t -> signaler_t -> signaler_t.make_fdpair(uint64 *, uint64 *)。
-
它现在适用于 C++ 和 Python。我会尝试从 IT 人员那里了解他们是否将任何更改推送到我的机器上,然后我会发布解决方案。
标签: python c++ sockets zeromq pyzmq