Linux имеет tcp_mem
установка объема памяти, которая будет выделяться TCP-соединениям для всех запущенных приложений. В соответствии с официальная документация:
tcp_mem - вектор из 3 INTEGER: min, pressure, max min: ниже этого количества страниц TCP не заботится о своем аппетите памяти.
давление: когда объем памяти, выделенной TCP, превышает это количество страниц, TCP регулирует потребление памяти и переходит в режим давления памяти, который выходит, когда потребление памяти падает ниже «min».
max: количество страниц, разрешенных для постановки в очередь всеми сокетами TCP.
Значения по умолчанию рассчитываются во время загрузки из объема доступной памяти.
Мы видим, что одно приложение в Prod нарушает этот порог, и его dmesg
log содержит строку вроде: TCP: out of memory -- consider tuning tcp_mem
.
По какой-то причине я не могу повторно запустить то же приложение локально. Итак, я хотел бы написать еще одно простое приложение, которое воспроизводит эту ошибку локально.
Пока что пробовал:
Во всех случаях я вижу, что могу добраться до tcp_mem
верхний предел, но не нарушать его. В то время как я вижу, что приложение Prod значительно превышает лимит (например, 6000 против 4400).
Итак, вопрос: что я могу попробовать воспроизвести нарушение tcp_mem
ограничить локально?
Я думаю превышение tcp_mem
лимит является следствием другой проблемы. Высокое потребление памяти для уровня TCP может быть вызвано потерей сегментов TCP. Пока не будет выполнена повторная передача потерянного сегмента, в стеке TCP будут храниться другие полученные данные. Только после того, как все недостающие данные будут получены, данные могут быть обработаны вашим приложением.
Итак, если вы хотите подражать tcp_mem
проблема, вы можете отбросить случайные сегменты TCP-соединения. Но я не думаю, что это может вам помочь. Лучше попытайтесь устранить источник вашей проблемы. Проверить nstat
вывод, особенно потерянные сегменты tcp и счетчики повторной передачи tcp. Захватывайте трафик и анализируйте его в wirehark.