Kami memiliki sedikit masalah failover dengan salah satu HAProxy VM kami hari ini. Ketika kami menggali, kami menemukan ini:
26 Jan 07:41:45 kernel haproxy2: [226818.070059] __ratelimit: 10 callback ditekan 26 Jan 07:41:45 kernel haproxy2: [226818.070064] Kehabisan memori soket 26 Jan 07:41:47 kernel haproxy2: [226819.560048] Kehabisan memori soket 26 Jan 07:41:49 kernel haproxy2: [226822.030044] Kehabisan memori soket
Yang, per tautan ini , tampaknya berkaitan dengan pengaturan default rendah untuk net.ipv4.tcp_mem
. Jadi kami meningkatkannya 4x dari standarnya (ini adalah Server Ubuntu, tidak yakin apakah rasa Linux itu penting):
nilai saat ini adalah: 45984 61312 91968 nilai baru adalah: 183936 245248 367872
Setelah itu, kami mulai melihat pesan kesalahan aneh:
26 Jan 08:18:49 haproxy1 kernel: [2291.579726] Rute rantai hash terlalu lama! 26 Jan 08:18:49 kernel haproxy1: [2291.579732] Sesuaikan secret_interval Anda!
Shh .. ini rahasia !!
Ini tampaknya ada hubungannya dengan /proc/sys/net/ipv4/route/secret_interval
default ke 600 dan mengontrol pembilasan berkala cache rute
The
secret_interval
menginstruksikan kernel seberapa sering untuk menerbangkan SEMUA entri rute hash terlepas dari berapa baru / lama mereka. Di lingkungan kita ini umumnya buruk. CPU akan sibuk membangun kembali ribuan entri per detik setiap kali cache dihapus. Namun kami menetapkan ini untuk dijalankan sekali sehari untuk menjaga agar memori tidak hilang (meskipun kami belum pernah memilikinya).
Meskipun kami senang mengurangi ini, rasanya aneh untuk merekomendasikan menjatuhkan seluruh cache rute secara berkala , daripada hanya mendorong nilai-nilai lama keluar dari cache rute lebih cepat.
Setelah beberapa penyelidikan, kami menemukan /proc/sys/net/ipv4/route/gc_elasticity
yang tampaknya menjadi pilihan yang lebih baik untuk menjaga ukuran tabel rute tetap di cek:
gc_elasticity
dapat digambarkan sebagai kedalaman rata-rata ember yang akan diterima kernel sebelum mulai entri hash rute yang kedaluwarsa. Ini akan membantu mempertahankan batas atas rute aktif.
Kami menyesuaikan elastisitas dari 8 menjadi 4, dengan harapan cache rute pemangkasan itu sendiri lebih agresif. Tidak secret_interval
terasa benar bagi kita. Tetapi ada banyak pengaturan dan tidak jelas yang benar-benar cara yang tepat untuk pergi ke sini.
- / 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 (parameter kernel, default tidak diketahui?)
Kami tidak ingin memperburuk perutean Linux , jadi kami agak takut mengacaukan beberapa pengaturan ini.
Adakah yang bisa menyarankan parameter routing mana yang terbaik untuk disetel, untuk instance HAProxy lalu lintas tinggi?