티스토리 툴바

브라보마이라이프

블로그 API테스트
Posted by jssj

웹 방화벽 성능 테스트를 위해 KISA에서 성능 테스트 장비인 아발란체와 리플렉터를 대여하였다.
그런데, 웹 방화벽 장비가 초당 1,000개의 트랜잭션을 초과하니 에러를 발생 더 이상 예상 가능 치인 10,000TPS를 넘지 못하였다. 시스템 로그를 살펴 보니

ip_conntrack: table full, dropping packet.
ip_conntrack: table full, dropping packet.
ip_conntrack: table full, dropping packet.
ip_conntrack: table full, dropping packet.

ip_conntrack 모듈의 테이블이 꽉 차버려서 나머지 패킷들을 drop시켜버리는 문제가 발생 하였다.

netfilter의 문서를 참조 해 보니, ip_conntrack에서 테이블을 구성하는 두가지의 값이 있는데 하나는 CONNTRACK_MAX값과 HASHSIZE라는 것 이었다.

CONNTRACK_MAX는 커널 메모리 상에서 netfilter가 동시에 처리하는 세션의 수를 이야기 하는 것이며 HASHSIZE는 CONTRACK 엔트리의 리스트를 저장할 해쉬 테이블의 사이즈를 지칭하는 것이었다.

i386 아키텍쳐에서는 CONNTRACK_MAX = RAMSIZE(단위: byte) / 16384 일때 가장 이상적인 사이즈이며, HASHSIZE는 CONNTRACK_MAX = HASHSIZE * 8이 성립될때 가장 이상적인 사이즈가 된다.

더 정확하게는

CONTRACK_MAX = RAMSIZE(단위: byte) / 16384 / ( x / 32)
HASHSIZE = CONNTRAK_MAX / 8 = RAMSIZE(단위: byte) / 131072 / (x / 32)

이다. 여기서 x의 값은 32비트 머신일 경우 32, 64비트 머신일 경우 64가 된다.

리눅스 머신에서는 1GB이상의 메모리일 경우 디폴트로 CONNTRACK_MAX가 65536이 세팅이 되고, HASHSIZE는 8192가 세팅이 된다.

아래의 명령으로 현재 세팅된 CONTRACK_MAX의 값을 알 수 있다.

Linux kernel version 2.4.23 이전의 버전
# cat /proc/sys/net/ipv4/ip_conntrack_max

Linux kernel version 2.4.23 (Linux 2.6 포함) 이후의 버전:
# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max
  (/proc/sys/net/ipv4/ip_conntrack_max는 더이상 사용하지 않음)

값을 변경하는 법은 위의 설정된 파일들의 숫자를 변경하면 되는데 vi나 에디터를 사용하여 변경을 시도하면 이미 읽고 있는 파일이라 저장이 되지 않을 것이다.
아래와 같이 타이핑하면 CONTRACK_MAX의 값을 변경 할 수 있다.

Linux kernel version 2.4.23 이전의 버전
# echo $CONNTRACK_MAX > /proc/sys/net/ipv4/ip_conntrack_max
Linux kernel version 2.4.23 (Linux 2.6 포함) 이후의 버전:
# echo $CONNTRACK_MAX > /proc/sys/net/ipv4/netfilter/ip_conntrack_max


커널 버전 2.4.21 이전에서는 HASHSIZE의 값이 소수이고 홀수여야만 하며 최적화된 값이 이미 세팅되어 있는 상태이므로 크기의 변경을 추천하지 않는다. 하지만 그 이후의 버전에서는 해쉬 알고리즘의 변경으로 이러한 제약조건이 없어졌다. 그러나 HASHSIZE가 2의 배수일 경우 최대의 효율을 나타낸다고 되어있다.

만일 netfilter contrack가 커널에 static하게 컴파일 되어 있을 경우는 컴파일 시에 값을 변경하거나 부트 옵션에

ip_conntrack.hashsize=$HASHSIZE

를 넣어주면 된다.

모듈로 컴파일 되어 있을 경우는 모듈을 인서트할때 옵션을 주면 된다.

# modprobe ip_conntrack hashsize=$HASHSIZE


커널 버전 2.6.14부터는 런타임에 해쉬사이즈를 변경하는 것이 가능해졌다.

# echo $HASHSIZE > /sys/module/ip_conntrack/parameters/hashsize
커널 버전 2.6.20에서는
# echo $HASHSIZE > /sys/module/nf_conntrack/parameters/hashsize



원문글 : http://www.onurmark.co.kr/89

Posted by jssj