Продолжая
разбираться с OpenOffice'ом для нужд конвертации документов из командной строки, наткнулся на забавнейшую особенность.
Вызывая скрипт
unoconv из 5-ти параллельных потоков, в каждом из которых последовательно много раз конвертируется свой уникальный документ (odt, doc, xls, ...), не удаётся достичь полной загрузки двух ядер процессора.
Причём, это не зависит от того, какой из двух сценариев используется:
- перед нагрузочным тестом, с помощью опции --listener запускается один общий экземпляр soffice.bin, а все запросы на конвертирование проходят через него;
- каждый запрос на конвертирование запускается с уникальным значением опции --connection (каждый раз меняется номер порта), что приводит к запуску отдельного экземпляра soffice.bin.
Upd1: Коллеги надоумили попробовать поиграться с разными пользователями. (Спасибо вам, ребята!)
Если из-под одного пользователя запустить в разных терминалах soffice с разными номерами порта:
- soffice "-accept=socket,host=localhost,port=20123;urp;StarOffice.ComponentContext" -invisible -nologo -nodefault -headless -norestore -nofirststartwizard
- 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 обслуживает оба соединения.
И если теперь запускать два скрипта из под разных пользователей, каждый пользователь будет идти на свой порт - выигрыша не наблюдается, снова загружено только одно ядро.
С другой стороны, можно запустить два совершенно разных экземпляра офиса на одной машине на разных портах из-под разных пользователей - на тех же скриптах наблюдается использование обоих ядер, экземпляры работают раздельно.