2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Модуль pako в Node.JS
Сообщение31.01.2021, 08:03 


21/05/16
4292
Аделаида
У меня есть сервер на 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 
Заслуженный участник


27/04/09
28128
Не очень понимаю данные профилей здесь, но кажется, что в медленном случае функция deflate_slow из pako компилируется куда дольше, чем надо. Я бы подумал, что скомпилированный код хранится в каком-то кэше между запусками, и при плохом запуске в кэше не находится (удалён, потому что туда положили что-то другое, а места было не так много), но остальные два профиля вроде бы это опровергают. (Но если даже CPython кэширует скомпилированный код, я удивлюсь чтобы V8 не кэшировала.)

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

 Профиль  
                  
 
 Re: Модуль pako в Node.JS
Сообщение31.01.2021, 17:43 


21/05/16
4292
Аделаида
arseniiv в сообщении #1503517 писал(а):
Но я правильно понимаю, что сервер у вас запущен подолгу как и надо

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

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

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

 Профиль  
                  
 
 Re: Модуль pako в Node.JS
Сообщение01.02.2021, 00:34 
Заслуженный участник


27/04/09
28128
Было бы хорошо как-то исключить из профиля всю инициализацию сервера, чтоб не мешалась. Если медленные запросы редко выходят, будет трудно накопить их достаточную долю и притом иметь много запросов в целом, чтобы погасить влияние инициализации.

 Профиль  
                  
 
 Re: Модуль pako в Node.JS
Сообщение01.02.2021, 06:45 


21/05/16
4292
Аделаида
Они, к сожалению, выходят нередко, надо просто поймать момент, когда они начинаются становиться медленными. Сейчас попробую.

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

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

 Профиль  
                  
 
 Re: Модуль pako в Node.JS
Сообщение01.02.2021, 15:41 


21/05/16
4292
Аделаида
Вот пример с 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 
Заслуженный участник


27/04/09
28128
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 


21/05/16
4292
Аделаида
Ну вроде бы он и так кэшируется:
https://tproger.ru/translations/javascr ... -for-devs/
https://github.com/node-cache/node-cache

 Профиль  
                  
 
 Re: Модуль pako в Node.JS
Сообщение01.02.2021, 21:34 


21/05/16
4292
Аделаида
Вообще, я не думаю, что дело в компилировании, ведь компиляция идёт просто при запуске node... Т.е. для всех запросов, по идее, всё уже скомпилировано.

 Профиль  
                  
 
 Re: Модуль pako в Node.JS
Сообщение01.02.2021, 21:39 
Заслуженный участник


27/04/09
28128
Я согласен, что так должно быть, но может оказаться, что мы что-то кошмарно не учитываем.

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

 Профиль  
                  
 
 Re: Модуль pako в Node.JS
Сообщение05.02.2021, 14:57 


21/05/16
4292
Аделаида
arseniiv в сообщении #1503751 писал(а):
Показал вашу тему кое-кому, кто с маленькой вероятностью может найти кого-то, кто в курсе, но пока ничего нового.

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

 Профиль  
                  
 
 Re: Модуль pako в Node.JS
Сообщение05.02.2021, 15:15 
Заслуженный участник


27/04/09
28128
Неа, видимо никто не откликнулся тогда. :-(

 Профиль  
                  
 
 Re: Модуль pako в Node.JS
Сообщение06.02.2021, 12:26 


21/05/16
4292
Аделаида
С помощью гугла я сумел найти какую-то другую реализацию DEFLATE под названием UZIP.js, которая, по заявлению автора, лучше сжимает и быстрее, чем pako. Попробую её использовать, и посмотреть, что быстрее...

 Профиль  
                  
 
 Re: Модуль pako в Node.JS
Сообщение06.02.2021, 15:05 


21/05/16
4292
Аделаида
Вроде бы чуть быстрее, но чуть хуже (несильно, где-то на полкилобайта, т.е. 1%) сжимает. Теперь посмотрю, нет ли бага...

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group