Linux 本地主机套接字比 Mac 慢得多

Linux 本地主机套接字比 Mac 慢得多

这个问题基于这个帖子开发办公室

我正在使用 Python 和办公室 UNO 桥分析文档。大多数情况下,我在 Mac 上运行并启动一个办公实例来监听本地主机:

soffice --accept=socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"

使用此软件,在我的 Mac 上运行测试文档大约需要 2 秒。然而,在 Linux 上,完全相同的场景运行大约需要 45 秒,性能差异很大。这是在 Mint、Gentoo 和 Ubuntu 上的情况。

有趣的是,使用办公室并通过命名管道连接到它:

soffice --accept="pipe,name=abraxas;urp;StarOffice.ServiceManager"

在所有测试平台上的运行速度几乎相同:大约 1.5 秒。

问题:Mac 和 Linux 套接字连接有何不同,为什么 Linux 套接字速度如此之慢?

答案1

尝试打开TCP_NODELAY

默认情况下 TCP 使用Nagle 算法收集小的传出数据包以便一次性将其作为一个大数据包发送,这可能会对延迟产生不利影响。

答案2

我在我的 Ubuntu Desktop 机器上看到了类似的行为(所以它与 X 无关),它需要大约 45 秒才能完成。以下是基于stracesoffice过程的最大问题:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 68.50   23.948922         323     74067      1611 futex
 23.90    8.356000      151927        55           poll
  7.31    2.555215          95     26915           recv
  0.10    0.036301       18151         2           waitpid
  0.06    0.019407           2      9586           send
  0.05    0.016330          30       539        15 read
  0.03    0.009430           1     16675           gettimeofday

在我看来,他们在 Linux 中实现线程同步的方式可能存在一些问题。我无法使用 Mac 进行比较,但这是我运行的命令行:

strace -cf soffice --accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager" --headless

相关内容