Oggi abbiamo avuto un piccolo problema di failover con una delle nostre macchine virtuali HAProxy. Quando abbiamo scavato, abbiamo trovato questo:
26 gennaio 07:41:45 kernel haproxy2: [226818.070059] __ratelimit: soppressione di 10 callback 26 gennaio 07:41:45 kernel haproxy2: [226818.070064] Memoria socket esaurita 26 gennaio 07:41:47 kernel haproxy2: [226819.560048] Memoria socket esaurita 26 gennaio 07:41:49 kernel haproxy2: [226822.030044] Memoria socket esaurita
Che, secondo questo link , apparentemente ha a che fare con impostazioni predefinite basse per net.ipv4.tcp_mem
. Quindi li abbiamo aumentati di 4x rispetto ai loro valori predefiniti (questo è Ubuntu Server, non sono sicuro che il sapore di Linux sia importante):
i valori correnti sono: 45984 61312 91968 i nuovi valori sono: 183936 245248 367872
Successivamente, abbiamo iniziato a vedere un bizzarro messaggio di errore:
26 gennaio 08:18:49 kernel haproxy1: [2291.579726] Instrada la catena hash troppo a lungo! 26 gennaio 08:18:49 kernel haproxy1: [2291.579732] Modifica il tuo intervallo_s Segreto!
Shh .. è un segreto !!
Apparentemente ciò ha a che fare con i /proc/sys/net/ipv4/route/secret_interval
valori predefiniti a 600 e controlla lo svuotamento periodico della cache del percorso
Il
secret_interval
indica al kernel la frequenza di soffiare via tutte le voci percorso hash a prescindere da come nuovo / vecchio sono. Nel nostro ambiente questo è generalmente negativo. La CPU sarà impegnata a ricostruire migliaia di voci al secondo ogni volta che la cache viene cancellata. Tuttavia, abbiamo impostato questo per funzionare una volta al giorno per tenere a bada le perdite di memoria (anche se non ne abbiamo mai avuto uno).
Sebbene siamo felici di ridurlo, sembra strano raccomandare di eliminare l'intera cache di route a intervalli regolari , anziché semplicemente spostare più velocemente i vecchi valori dalla cache di route.
Dopo alcune indagini, abbiamo scoperto /proc/sys/net/ipv4/route/gc_elasticity
che sembra essere un'opzione migliore per tenere sotto controllo le dimensioni della tabella di route:
gc_elasticity
può essere meglio descritto come la profondità media del bucket accettata dal kernel prima che inizi a scadere le voci hash di route. Ciò contribuirà a mantenere il limite superiore delle rotte attive.
Abbiamo regolato l'elasticità da 8 a 4, nella speranza che la cache del percorso si elimini più aggressivamente. La secret_interval
non si sente corretto per noi. Ma ci sono un sacco di impostazioni ed è poco chiaro quali siano davvero il modo giusto per andare qui.
- / 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 (parametro del kernel, impostazione predefinita sconosciuta?)
Non vogliamo peggiorare il routing di Linux , quindi abbiamo un po 'paura di incasinare alcune di queste impostazioni.
Qualcuno può consigliare quali parametri di routing sono meglio ottimizzare, per un'istanza HAProxy ad alto traffico?