Сьогодні ми мали невелику проблему з відмовою в одному з наших VAP-апаратів 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] Налаштуйте свій секретний_інтервал!
Шш .. це секрет !!
Це, мабуть, пов'язане з тим, /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 з високим трафіком?