Из-за высокого трафика и характера нашего приложения, поддерживающего соединения, наш процесс haproxy потребляет значительный объем ОЗУ (обычно 30-40% доступной ОЗУ). Теперь, когда мы хотим добавить / удалить какой-либо бэкэнд, нам нужно перезагрузить haproxy. Во время плавной перезагрузки (по умолчанию в Ubuntu по умолчанию init reload) создается новый процесс haproxy, который будет обслуживать новые соединения, и существующий процесс останется там, пока старые соединения не будут закрыты приложением или очищены из-за тайм-аута и т. Д. Такое поведение нормально.
Но оба процесса почти захватывают всю доступную оперативную память, и на самом деле все будет страшно, если первый процесс уже потребляет более 50% оперативной памяти, тогда любая перезагрузка может вызвать сбой (еще не произошло, но увеличение трафика сделает это скоро) . Это вынуждает нас либо принудительно уничтожить старый процесс (потеря старых соединений), либо иметь достаточно (> 50%) оперативной памяти, доступной все время (тратя ресурсы).
Я буду признателен за любую помощь / указатель в этом контексте. Мы на Ubuntu 12.04 с haproxy 1.4.18.
Это хорошо известная проблема. Это причина, по которой мы поддерживаем DLMALLOC. Просто скачайте его, перестройте haproxy, используя его, и проблема исчезнет. Вот что мы используем в нашем устройстве (ALOHA) для этого точный причина. Dlmalloc использует mmap () для выделения памяти и поддерживает дыры в своем адресном пространстве, поэтому каждый вызов free (), вызывающий освобождение хотя бы одной страницы, фактически приводит к освобождению этой страницы. Стандартный malloc почти не поддерживает это (как правило, поддерживает его только при освобождении больших смежных областей), поэтому он освобождает память только после того, как все страницы после эта точка также выпущена. Это большая разница.