web-dev-qa-db-ja.com

LinuxローカルホストソケットはMacよりも痛々しいほど遅い

この質問は、 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のソケットがそれほど遅いのはなぜですか?

5
Jens

TCP_NODELAYをオンにする を試してください。

デフォルトでは、TCPは Nagleのアルゴリズム を使用して小さな発信パケットを収集し、すべてを1つの大きなパケットとして一度に送信します。これは遅延に悪影響を与える可能性があります。

5
harrymc

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
2
heavyd