Мое элементарное понимание этого вопроса таково (не цитируйте меня по этому поводу):
- модуль ws node.js (т. е. модуль websockets) и модуль socket.io node.js используют другой модуль, называемый zlib.Этот модуль отвечает за сжатие любых сообщений при их отправке через веб-сокет.
- в модуле zlib в прошлом была проблема, связанная с фрагментацией памяти, которая имитирует утечку памяти (т. е. на самом деле это не утечка памяти, а фрагментация памяти).
- сжатие сообщений по умолчанию отключено на сервере, но включено по умолчанию на клиенте (например, в браузере). Если мы его отключим, модуль zlib не будет использоваться, что снимет проблему фрагментации памяти.
- Чтобы отключить сжатие на клиенте (например, в браузере), мы даем
perMessageDeflate
введите в своем коде сервера значение ЛОЖЬ
. Это:
const wss = new WebSocket.Server({ server:httpsServer, perMessageDeflate: false});
Очевидно, что это не решение для людей, желающих сжать свои сообщения. Но стоит упомянуть, что:
- проблема фрагментации памяти с zlib, по-видимому, ЧАСТИЧНО решена с помощью https://github.com/websockets/ws/pull/1204 но, похоже, это все еще проблема; и
- польза от сжатия небольших сообщений, таких как небольшие фрагменты текста, обсуждалась. Некоторые даже заявляют, что сжатие небольших сообщений замедляет работу. Если вы работаете с большими данными, такими как изображения или видео, вы можете добиться успеха, сжав их самостоятельно (т. е. без ws/socket.io/zlib) перед отправкой через веб-сокет.
Также некоторые отмечают, что установка perMessageDeflate: false только уменьшает проблему, но не решает проблему полностью. Я бы обратил ваше внимание на это обсуждение, где говорится, что НЕКОТОРОЕ остаточное и постоянное (т.е. не увеличивающееся) использование памяти при открытии и закрытии веб-сокетов является нормальным (кстати, я не обязательно говорю, что это правильно): https://github.com/websockets/ws/issues/804#issuecomment-302612661
Что касается предварительной загрузки Jemalloc, похоже, это не решает проблему. Хотя, если приведенный выше код не работает, его, безусловно, стоит изучить (или попробовать).
Так и есть премессажедефлате: ложь
лучшее решение прямо сейчас? Насколько я понимаю, я бы сказал, что да.
Если у кого-то есть исправления или дополнительная информация по этому поводу, добавляйте.