5

Этот вопрос основан на этой теме в OpenOffice.

Я использую Python и мост Office UNO для анализа документов. По большей части я запускаю на своем Mac и запускаю офисный экземпляр для прослушивания на localhost:

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

Используя это, пробная проверка документа занимает около 2 секунд на моем Mac. В то же время в Linux тот же сценарий выполняется в течение 45 секунд, что является серьезной разницей в производительности. И это на Mint, Gentoo и Ubuntu.

Интересно, используя офис и подключаясь к нему через именованный канал:

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

работает на всех протестированных платформах с одинаковой скоростью: около 1,5 секунд.

Вопрос: что отличается между сокетами Mac и Linux и почему сокет Linux намного медленнее?

2 ответа2

5

Попробуйте включить TCP_NODELAY.

По умолчанию 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .