Рейтинг:1

Как исправить утечку памяти ws и socket.io?

флаг za

Я читал, что в обоих модулях веб-сокетов node.js ws и socket.io происходит утечка памяти. Он существует уже много лет, и мне интересно, как его исправить.

Это упоминается в следующем, чтобы назвать несколько:

Учитывая, что сейчас 2021 год, установка ключа perMessageDeflate на false и, возможно, предварительная загрузка jemalloc по-прежнему являются лучшим решением?

Рейтинг:0
флаг za

Мое элементарное понимание этого вопроса таково (не цитируйте меня по этому поводу):

  • модуль 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, похоже, это не решает проблему. Хотя, если приведенный выше код не работает, его, безусловно, стоит изучить (или попробовать).

Так и есть премессажедефлате: ложь лучшее решение прямо сейчас? Насколько я понимаю, я бы сказал, что да.

Если у кого-то есть исправления или дополнительная информация по этому поводу, добавляйте.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.