Максим Петрович Дементьев (mpd) wrote,
Максим Петрович Дементьев
mpd

Categories:

Странная многозадачность OpenOffice'а: используется только одно ядро.

Продолжая разбираться с OpenOffice'ом для нужд конвертации документов из командной строки, наткнулся на забавнейшую особенность.
Вызывая скрипт unoconv из 5-ти параллельных потоков, в каждом из которых последовательно много раз конвертируется свой уникальный документ (odt, doc, xls, ...), не удаётся достичь полной загрузки двух ядер процессора.

Причём, это не зависит от того, какой из двух сценариев используется:
  1. перед нагрузочным тестом, с помощью опции --listener запускается один общий экземпляр soffice.bin, а все запросы на конвертирование проходят через него;
  2. каждый запрос на конвертирование запускается с уникальным значением опции --connection (каждый раз меняется номер порта), что приводит к запуску отдельного экземпляра soffice.bin.

Upd1: Коллеги надоумили попробовать поиграться с разными пользователями. (Спасибо вам, ребята!)
Если из-под одного пользователя запустить в разных терминалах soffice с разными номерами порта:
  1. soffice "-accept=socket,host=localhost,port=20123;urp;StarOffice.ComponentContext" -invisible -nologo -nodefault -headless -norestore -nofirststartwizard
  2. soffice "-accept=socket,host=localhost,port=20124;urp;StarOffice.ComponentContext" -invisible -nologo -nodefault -headless -norestore -nofirststartwizard
Первая команда подвисает, а вторая быстро выходит, эффект такой:
dememax@dememax-laptop ~ $ netstat -a | grep 2012
tcp     0    0 localhost:20123      *:*      LISTEN
tcp     0    0 localhost:20124      *:*      LISTEN
dememax@dememax-laptop ~ $ lsof -i TCP@localhost:20123
COMMAND     PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
soffice.b 20979 dememax   31u  IPv4 129106      0t0  TCP localhost:20123 (LISTEN)
dememax@dememax-laptop ~ $ lsof -i TCP@localhost:20124
COMMAND     PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
soffice.b 20979 dememax   27u  IPv4 129047      0t0  TCP localhost:20124 (LISTEN)
Т.е. один экземпляр soffice обслуживает оба соединения.
И если теперь запускать два скрипта из под разных пользователей, каждый пользователь будет идти на свой порт - выигрыша не наблюдается, снова загружено только одно ядро.

С другой стороны, можно запустить два совершенно разных экземпляра офиса на одной машине на разных портах из-под разных пользователей - на тех же скриптах наблюдается использование обоих ядер, экземпляры работают раздельно.
Tags: concurrency, freesoftware, java, история
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments