Intereting Posts
Какой ноутбук наиболее совместим с Linux? Не настроены ли зоны по умолчанию после предварительной установки в firewalld? Как закрыть (убить) соединения ssh ControlMaster вручную Постоянное переключение с большим количеством свободной памяти как написать скрипт, который будет запускать команды после su, без использования -c удалите последний символ строки, если это В чем разница между Linux и Linux LVM? У меня проблемы с запуском обновлений и загрузкой программного обеспечения в терминале Команда lsof слишком длинна для определенного идентификатора процесса Как переименовать файл в … (точка точка)? Мост / Совместное использование сетевого принтера в freebsd Могут ли возникнуть какие-либо повреждения при отмене диспетчера обновлений в Linux Mint во время обновления? Что является хорошей альтернативой iTunes для Linux? Как использовать очень старый принтер (Panasonic KX-P1170) Будет ли безголовый сервер ждать навсегда после входа в систему после загрузки?

Память ussage для буферов сообщений TCP или именованных каналов?

У меня есть группа программ, которые я сегодня испытывал стресс. Я решительно поднял входную нагрузку на программу, и она работала сначала, но у меня была явная утечка памяти, всасывающая память. Единственная проблема заключается в том, что 1) Valgrind настаивает на том, что у меня нет никаких утечек, и 2) это происходит только при высокой скорости приема пакетов.

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

  1. Может ли очередь в памяти для хранения подлежащих передаче данных неограниченно увеличиваться для TCP / IP или именованных каналов?

  2. если очередь может и будет расти, будет ли она показываться, что моя программа (одно чтение из TCP и вывод на именованный канал) была памятью hog или память просто отображалась как системная память?

  3. есть ли команда, которую я могу использовать для проверки памяти, выделенной для этих очередей? Я запускаю Centos

Я действительно не думаю, что это причина моей утечки, но опять же я не могу догадаться, что еще мне нужно спросить!

  1. Вообще его довольно ограниченный. Хотя есть два места (по крайней мере), эти буферы могут существовать:
    1. В ядре. Определенно ограничен. Я уверен, что FIFO жестко закодирован, TCP можно установить в /proc/sys/kernel/tcp_wmem (и rmem) и (в пределах ограничений proc) с помощью SO_SNDBUF / SO_RCVBUF . Подробнее см. Справочную страницу tcp (7).
    2. В вашем приложении. Если вы не звоните напрямую и т. Д., Библиотека, которую вы используете, может иметь свои собственные буферы. Они могут быть бесконечными.
    3. ОК. На самом деле есть третье место в ОЗУ на вашем сетевом адаптере. Не может быть увеличен за пределы определенного (довольно малого) предела без пайки, поэтому я игнорирую это. О, и есть кольцевой буфер передачи, для вашего NIC для DMA. Опять же, фиксированный размер (ethtool для настройки, если вообще возможно).
  2. Ядро отображается как системная память. Те, что в вашем приложении будут отображаться как часть виртуального размера вашего приложения (и размер резидента и т. Д.),
  3. netstat -t покажет вам текущий размер очереди отправки и получения для каждого TCP-соединения. Для тех, которые хранятся в вашей библиотеке, проверьте его документацию.

Помните, что память не просочилась, если вы в конечном итоге освободите ее. Если вы просто страдаете от постоянно растущих очередей в вашем приложении, это не просачивается. То же самое, если вы страдаете от постоянно растущей фрагментации памяти.