2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Модуль pako в Node.JS
Сообщение31.01.2021, 08:03 
У меня есть сервер на Node.JS, который, в частности, отправляет картинки (генерируемые) клиенту по его запросу. Для этого я их сжимаю с помощью функции deflate модуля pako. Я заметил, что иногда на несколько минут (или до перезапуска процесса) функция внезапно начинает сжимать картинку очень медленно (вместо примерно 0.2с становится примерно 15с, причем это бывает даже на одних и тех же картинках). Почему так и что делать? Вот три файла, сгенерированные профайлером Node.JS (первый файл - медленное выполнение, второй и третий - быстрое):
https://cdn.discordapp.com/attachments/ ... ofiler.txt
https://cdn.discordapp.com/attachments/ ... filer2.txt
https://cdn.discordapp.com/attachments/ ... filer3.txt

 
 
 
 Re: Модуль pako в Node.JS
Сообщение31.01.2021, 13:36 
Не очень понимаю данные профилей здесь, но кажется, что в медленном случае функция deflate_slow из pako компилируется куда дольше, чем надо. Я бы подумал, что скомпилированный код хранится в каком-то кэше между запусками, и при плохом запуске в кэше не находится (удалён, потому что туда положили что-то другое, а места было не так много), но остальные два профиля вроде бы это опровергают. (Но если даже CPython кэширует скомпилированный код, я удивлюсь чтобы V8 не кэшировала.)

Но я правильно понимаю, что сервер у вас запущен подолгу как и надо, а не запускается при каждом запросе картинки заново? Тогда компиляция не должна бы никак сказываться, она должна быть один раз на старте. Можно ли как-то сделать профиль для части времени, когда запрос обрабатывается медленно (и когда быстро)?

 
 
 
 Re: Модуль pako в Node.JS
Сообщение31.01.2021, 17:43 
arseniiv в сообщении #1503517 писал(а):
Но я правильно понимаю, что сервер у вас запущен подолгу как и надо

Ну, не совсем (когда я запускал пройфайлер, я запускал просто для нескольких запросов, от трёх (для первого), до около десяти (третьего)).
arseniiv в сообщении #1503517 писал(а):
а не запускается при каждом запросе картинки заново

Нет.
arseniiv в сообщении #1503517 писал(а):
Можно ли как-то сделать профиль для части времени, когда запрос обрабатывается медленно (и когда быстро)?

Первый результат, если не ошибаюсь, был для одного быстрого и двух медленных запросов. Остальные два результата - для нескольких быстрых. Могу попробовать ещё медленных запросов получить...

 
 
 
 Re: Модуль pako в Node.JS
Сообщение01.02.2021, 00:34 
Было бы хорошо как-то исключить из профиля всю инициализацию сервера, чтоб не мешалась. Если медленные запросы редко выходят, будет трудно накопить их достаточную долю и притом иметь много запросов в целом, чтобы погасить влияние инициализации.

 
 
 
 Re: Модуль pako в Node.JS
Сообщение01.02.2021, 06:45 
Они, к сожалению, выходят нередко, надо просто поймать момент, когда они начинаются становиться медленными. Сейчас попробую.

-- 01 фев 2021, 14:36 --

Не смог сейчас поймать медленных запросов... Ладно, попробую вечером.

 
 
 
 Re: Модуль pako в Node.JS
Сообщение01.02.2021, 15:41 
Вот пример с 123 (красивое число получилось) быстрыми запросами вначале и 20 медленными в конце (судя по всему, могло получиться и больше, но мне надоело):
https://cdn.discordapp.com/attachments/ ... filer4.txt
Я пока вижу у медленных выполнений одно общее - очень много выполнений __GI___libc_malloc, _int_free, и _int_malloc.

 
 
 
 Re: Модуль pako в Node.JS
Сообщение01.02.2021, 18:42 
kotenok gav в сообщении #1503706 писал(а):
Я пока вижу у медленных выполнений одно общее - очень много выполнений __GI___libc_malloc, _int_free, и _int_malloc.
Хм, интересно, непонятно. По идее библиотеке, использующейся в конце концов функцией deflate_slow, должно хватать адресного пространства, чтобы выделить кусок нужного размера для своих нужд, даже если сборщик мусора в V8 лентяй, так как скорее всего у вас там 64-разрядная система и в них адресное пространство для каждого процесса просто гигантское. Пока память только выделяется, соответствующие страницы памяти вроде не должны загружаться в физическую память (что могло бы быть медленным, если она прям вся постоянно в ходу — это уже более вероятно, чем занять всё адресное пространство).

Притом опять большую часть полного времени занимает компиляция deflate_slow… хм. У node нет какой-то опции, которая бы говорила, оставлять ли скомпилированный код до следующего запуска?

 
 
 
 Re: Модуль pako в Node.JS
Сообщение01.02.2021, 19:24 
Ну вроде бы он и так кэшируется:
https://tproger.ru/translations/javascr ... -for-devs/
https://github.com/node-cache/node-cache

 
 
 
 Re: Модуль pako в Node.JS
Сообщение01.02.2021, 21:34 
Вообще, я не думаю, что дело в компилировании, ведь компиляция идёт просто при запуске node... Т.е. для всех запросов, по идее, всё уже скомпилировано.

 
 
 
 Re: Модуль pako в Node.JS
Сообщение01.02.2021, 21:39 
Я согласен, что так должно быть, но может оказаться, что мы что-то кошмарно не учитываем.

Показал вашу тему кое-кому, кто с маленькой вероятностью может найти кого-то, кто в курсе, но пока ничего нового.

 
 
 
 Re: Модуль pako в Node.JS
Сообщение05.02.2021, 14:57 
arseniiv в сообщении #1503751 писал(а):
Показал вашу тему кое-кому, кто с маленькой вероятностью может найти кого-то, кто в курсе, но пока ничего нового.

Ну как, он нашёл этого "кого-то"?

 
 
 
 Re: Модуль pako в Node.JS
Сообщение05.02.2021, 15:15 
Неа, видимо никто не откликнулся тогда. :-(

 
 
 
 Re: Модуль pako в Node.JS
Сообщение06.02.2021, 12:26 
С помощью гугла я сумел найти какую-то другую реализацию DEFLATE под названием UZIP.js, которая, по заявлению автора, лучше сжимает и быстрее, чем pako. Попробую её использовать, и посмотреть, что быстрее...

 
 
 
 Re: Модуль pako в Node.JS
Сообщение06.02.2021, 15:05 
Вроде бы чуть быстрее, но чуть хуже (несильно, где-то на полкилобайта, т.е. 1%) сжимает. Теперь посмотрю, нет ли бага...

 
 
 [ Сообщений: 14 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group