172 похожих чатов

Всем доброго времени суток. Есть вебсокет. Всем клиентам на вебсокете

необходимо броадкастить сообщение. Как только приходит клиент, я создаю нового ресивера на броадкасте, далее жду сообщений с броадкаста. Проблема в том, что оно течёт. При отключении клиента от сокета приложение всё так же холдит память и не хочет отдавать обратно вплоть до сегфолта. Аллокатор - jemalloc с максимально агрессивным конфигом. И, судя по-всему, течёт броадкаст. Из зависимостей - токио 1.11, tokio-tungstenite 0.15. Вопрос: что я делаю не так (пример) ? Если кто-нибудь даст наводку, буду очень признателен. Пример, который течёт - https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=14c08055f0d64da0b1243b26ee080284

7 ответов

7 просмотров

Насколько сильно течёт? И что значит "не хочет отдавать вплоть до сегфолта"? ООМ киллер убивает или что? На первый взгляд единственное место, которое может течь - это спавн accept_connection. Эти таски точно завершаются? Если TCP соединение не закрыто нормальным образом, оно может долго висеть.

Lighty- Автор вопроса
red75prime
Насколько сильно течёт? И что значит "не хочет отд...

ООМ киллер убивает, да. Каждый коннекшн отъедает порядка 50кб резидент мемори. Проблема еще в том, что тут нет возможности напрямую закрыть tcp-коннекшн =| (ну или я в глаза долблюсь). Сейчас перетестил. И правда, проблема не в броадкасте. Наверное, легче и правда использовать вебсокет из актикса.

red75prime
Насколько сильно течёт? И что значит "не хочет отд...

спрошу из академического интереса: разве не память ядра при незакрытых соеднинениях будет расти? OOM киллер же не придет убивать ядро 😂

Lighty
ООМ киллер убивает, да. Каждый коннекшн отъедает п...

Закрыть tcp можно через .get_mut().shutdown().await; (shutdown из AsyncWriteExt)

Lighty- Автор вопроса
red75prime
Закрыть tcp можно через .get_mut().shutdown().awai...

Забавно. Если обычным сигинтом закрыть клиента (или вкладочку в браузере) без Message::Close, то возвращает ошибку и точно так же течёт. code: 107, kind: NotConnected, message: "Transport endpoint is not connected"

Lighty
Забавно. Если обычным сигинтом закрыть клиента (ил...

.set_linger(None) сделать. Чтобы не держал неотосланные данные после shutdown. Может быть с write_timeout поиграться.

Lighty- Автор вопроса
red75prime
.set_linger(None) сделать. Чтобы не держал неотосл...

Спасибо большое! Посмотрю, что из этого выйдет.

Похожие вопросы

Обсуждают сегодня

Всем привет, на линуксе лучше на fasm или nasm учиться писать для начала ?
meszjol
14
Если у меня есть такой класс: Object = {} function Object:new(a_name, a_transform, a_color, a_mesh, a_material, a_shader, a_textures) local private = {} private.n...
Cuarno Vile
4
было так ;void set_http_ver(RESPD* ptr, char* version, uint32_t length) // example: 'RTSP/1.1 ' set_http_ver: mov eax, [esp + 4] mov ecx, [esp + 8] ...
Mixail Frolov
5
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Гайз, кто-нибудь пробовал запустить probe-rs под камень, которого нет в probe-rs? Мб есть какой-нибудь пример у кого... Через target-gen попробовал сгенерировать chip-descript...
Максим Смирнов
2
зачем же переименовывать ? чтобы кол-во участников возросло или вдруг IBM от этого снова на свифте начнет кодить ? Я не понимаю что страшного в том что свифт гавно, если это т...
Oleh Nerzh
10
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
Evo 1.4.34 PHP 7.4 Все работало штатно. На ровном месте SimpleGallery начал выдавать ошибку Что может быть? Уже все переустановил по новой. Места хватает. Хостинг reg.ru
Paul Savchenkov
6
здравствуйте. совершаю вот такую вещь: strcpy(line, (char)current_number); где current number — неподписанный шорт, line — массив чаров. ругань следующая: main.c:29:30: error...
Roberto's Ширгозиев
13
Карта сайта