오늘날 HAProxy VM 중 하나에서 약간의 장애 조치 문제가있었습니다. 우리가 그것을 파헤 치자 우리는 이것을 발견했습니다.
1 월 26 일 07:41:45 haproxy2 커널 : [226818.070059] __ratelimit : 콜백 10 개 억제 1 월 26 일 07:41:45 haproxy2 커널 : [226818.070064] 소켓 메모리 부족 1 월 26 일 07:41:47 haproxy2 커널 : [226819.560048] 소켓 메모리 부족 1 월 26 일 07:41:49 haproxy2 커널 : [226822.030044] 소켓 메모리 부족
이 링크 당에 대한 기본 설정이 낮게 설정되어 있어야 net.ipv4.tcp_mem
합니다. 그래서 우리는 기본값에서 4 배 증가했습니다 (Linux 풍미가 중요한지 확실하지 않은 우분투 서버입니다).
현재 값은 다음과 같습니다. 45984 61312 91968 새로운 값은 다음과 같습니다. 183936 245248 367872
그 후, 우리는 기괴한 오류 메시지를보기 시작했습니다.
1 월 26 일 08:18:49 haproxy1 커널 : [2291.579726] 해시 체인이 너무 길다! 1 월 26 일 08:18:49 haproxy1 커널 : [2291.579732] secret_interval을 조정하십시오!
... 비밀이야 !!
이것은 분명히 /proc/sys/net/ipv4/route/secret_interval
기본값 600과 관련 이 있으며 경로 캐시의 주기적 플러시를 제어 합니다.
이
secret_interval
명령은 커널이 새 / 오래된 수에 관계없이 모든 경로 해시 항목을 얼마나 자주 날려 버리는지를 지시합니다. 우리의 환경에서 이것은 일반적으로 나쁘다. 캐시가 지워질 때마다 CPU는 초당 수천 개의 항목을 다시 작성하는 중입니다. 그러나 메모리 누수를 막기 위해 하루에 한 번 실행되도록 설정했습니다 (아직 없었습니다).
우리는 이것을 줄이면서도 행복하지만 , 단순히 경로 캐시에서 이전 값을 더 빨리 밀어내는 대신 전체 간격 캐시를 정기적으로 삭제하는 것이 좋습니다 .
조사 결과, /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 (커널 매개 변수, 기본 불명)?
우리는 리눅스 라우팅을 악화시키고 싶지 않기 때문에 이러한 설정 중 일부를 망쳐 놓는 것을 두려워합니다.
트래픽이 많은 HAProxy 인스턴스에 대해 어떤 라우팅 매개 변수를 조정하는 것이 가장 좋은지 조언 할 수 있습니까?