この質問は、 OpenOffice にあるこのスレッドに基づいています。
Pythonおよび Office UNOブリッジ を使用してドキュメントを分析しています。ほとんどの場合、Macで実行し、Officeインスタンスを起動してローカルホストでリッスンします。
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のソケットがそれほど遅いのはなぜですか?
TCP_NODELAYをオンにする を試してください。
デフォルトでは、TCPは Nagleのアルゴリズム を使用して小さな発信パケットを収集し、すべてを1つの大きなパケットとして一度に送信します。これは遅延に悪影響を与える可能性があります。
Ubuntuデスクトップマシンでも同様の動作が見られます(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