【问题标题】:ZMQ Context socket creation is MUCH slower on new computerZMQ 上下文套接字在新计算机上的创建速度要慢得多
【发布时间】: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


【解决方案1】:

这显然是 Windows 10 或笔记本电脑固件问题。 IT部门推送了一些更新,第二天一切正常。以下是每个事件查看器安装的项目:

  • 已安装 KB4456655:Windows 10 版本 1803 的服务堆栈更新:2018 年 9 月 11 日(稳定性改进)
  • 已安装 KB4462930:Adobe Flash Player 更新
  • 已安装 KB4100347:英特尔微码更新
  • 已安装 KB4485449:Windows 10 v1803 的服务堆栈更新 - 2 月 12 日
  • 已安装 KB4487017:(与 KB4485449 描述相同)
  • 已安装 KB4487038:Adobe Flash Player 安全更新

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    相关资源
    最近更新 更多