这个问题基于这个帖子开发办公室。
我正在使用 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 使用Nagle 算法收集小的传出数据包以便一次性将其作为一个大数据包发送,这可能会对延迟产生不利影响。
答案2
我在我的 Ubuntu Desktop 机器上看到了类似的行为(所以它与 X 无关),它需要大约 45 秒才能完成。以下是基于strace
该soffice
过程的最大问题:
% 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