Сегодня у нас была небольшая проблема с отказоустойчивостью на одной из наших виртуальных машин HAProxy. Когда мы копались в этом, мы нашли это:
26 января 07:41:45 ядро haproxy2: [226818.070059] __ratelimit: 10 обратных вызовов подавлено 26 января 07:41:45 ядро haproxy2: [226818.070064] Недостаточно памяти для сокетов 26 января 07:41:47 ядро haproxy2: [226819.560048] Недостаточно памяти для сокетов 26 января 07:41:49 ядро haproxy2: [226822.030044] Недостаточно памяти для сокетов
Что, по этой ссылке , очевидно связано с низкими настройками по умолчанию для net.ipv4.tcp_mem
. Таким образом, мы увеличили их в 4 раза по сравнению с их значениями по умолчанию (это Ubuntu Server, не уверен, имеет ли смысл Linux):
текущие значения: 45984 61312 91968 новые значения: 183936 245248 367872
После этого мы начали видеть странное сообщение об ошибке:
26 января 08:18:49 ядро haproxy1: [2291.579726] Слишком длинная цепочка хэшей в маршруте! 26 января 08:18:49 ядро haproxy1: [2291.579732] Настройте свой secret_interval!
Тсс ... это секрет !!
По-видимому, это связано с тем, /proc/sys/net/ipv4/route/secret_interval
что по умолчанию 600 и контролирует периодическую очистку кэша маршрутов
secret_interval
Инструктирует ядро , как часто сдуть ВСЕ записи маршрута хэш независимо от того, как новый / старый они. В нашей среде это вообще плохо. Процессор будет занят восстановлением тысяч записей в секунду каждый раз, когда очищается кэш. Однако мы настроили его запуск один раз в день, чтобы предотвратить утечки памяти (хотя у нас никогда не было таких).
Хотя мы рады уменьшить это, кажется странным рекомендовать регулярно удалять весь кэш маршрутов , а не просто быстрее выгружать старые значения из кэша маршрутов.
После некоторого исследования мы нашли, /proc/sys/net/ipv4/route/gc_elasticity
что, кажется, лучший вариант для контроля размера таблицы маршрутов:
gc_elasticity
лучше всего описать среднюю глубину сегмента, которую ядро примет до того, как истечет срок действия хеш-записей маршрута. Это поможет сохранить верхний предел активных маршрутов.
Мы скорректировали эластичность с 8 до 4, в надежде, что кеш маршрутов обрежет себя более агрессивно. secret_interval
Не чувствует себя правильным для нас. Но есть множество настроек, и неясно, какой из них действительно правильный.
- / proc / sys / net / ipv4 / route / gc_elasticity (8)
- / proc / sys / net / ipv4 / route / gc_interval (60)
- / proc / sys / net / ipv4 / route / gc_min_interval (0)
- / proc / sys / net / ipv4 / route / gc_timeout (300)
- / proc / sys / net / ipv4 / route / secret_interval (600)
- / proc / sys / net / ipv4 / route / gc_thresh (?)
- rhash_entries (параметр ядра, по умолчанию неизвестно?)
Мы не хотим ухудшать маршрутизацию Linux , поэтому боимся возиться с некоторыми из этих настроек.
Кто-нибудь может посоветовать, какие параметры маршрутизации лучше всего настроить для экземпляра HAProxy с высоким трафиком?
/proc/sys/net/ipv4/tcp_max_orphans
вас возникнет другая ошибка. Например, весь стек Stack Exchange имеет значение/proc/sys/net/ipv4/tcp_max_orphans
65536 и/proc/net/sockstat
приводит к TCP: inuse 2996 orphan 171 tw 15972 alloc 2998 mem 1621 - разницу, которую нельзя игнорировать.Мы настраиваем некоторые из этих параметров регулярно. Наш стандарт для торговых платформ с высокой пропускной способностью и низкой задержкой:
источник