최근 우리 서버 중 하나(Debian Squeeze)가 부하가 높은 기간 동안 응답하지 않는 문제가 발생했습니다. 커널 로그를 보면 그 이유는 다음과 같습니다.
kernel: nf_conntrack: table full, dropping packet
내가 이해한 바에 따르면 이것은 연결 상태 추적을 수행하고 연결 세부 정보를 저장하는 데 사용되는 테이블이 가득 찼음을 보고하는 conntrack 모듈입니다.
제가 수행한 연구에 따르면 이를 완화하는 두 가지 방법이 있는 것 같습니다.
테이블의 크기를 늘립니다.
시스템에서 모듈을 완전히 제거합니다.
그러나 이 시스템에는 존재하지도 /proc/sys/net/ipv4/ip_conntrack_max
않고 존재하지도 않습니다 /proc/sys/net/ipv4/netfilter/ip_conntrack_max
( 아래에 ipv4
디렉토리 가 없음 net
).
이렇게 하면 lsmod
아무런 결과도 얻지 못합니다.
그래서 저는 약간 혼란스럽습니다. 누군가 상황을 명확히 하는 데 도움을 줄 수 있을까요?
- conntrack이 설치되어 있나요? 그렇다면 설정은 어디에 있습니까? 왜 lsmod에 표시되지 않습니까?
- conntrack이 설치되지 않은 경우 테이블이 꽉 찼다는 메시지는 어떻게 발행됩니까?
감사해요
답변1
Ubuntu 18.04를 실행하는 서버에서도 동일한 문제가 발생했습니다. 시작 시 모듈이 로드되지 않더라도 nf_conntrack
나중에 트래픽이 급증하는 동안 메시지가 삭제됩니다( nf_conntrack: table full, dropping packet
).
해당 기능을 비활성화하는 방법은 모르지만 테이블 크기를 재정의할 수 있도록 모듈을 명시적으로 로드했습니다.
먼저 nf_conntrack
다음 항목에 포함하여 지금 로드 해야 합니다 /etc/modules
.
nf_conntrack
그런 다음 서버의 메모리 크기에 따라 달라지는 다음의 기본값을 재정의하여 테이블 크기를 늘립니다 /etc/sysctl.conf
.
net.netfilter.nf_conntrack_max=262144
net.nf_conntrack_max=262144
확인하다:
$ cat /proc/sys/net/netfilter/nf_conntrack_max
262144
언급했듯이 Ubuntu 18.04에서 테스트되었지만 Debian에서도 작동하고 싶습니다.
nf_conntrack
시작 후 존재하지 않는 경우에도 나중에 로드될 수 있는 이유에 대한 추가 배경 정보를 보려면이 관련 답변iptables
호출 시 모듈이 자동으로 로드되는 예가 있습니다. 이를 추가하면 /etc/modules
이러한 복잡성이 제거됩니다.