RUST만든 웹서버를, jmeter를 통해 stress test를 진행하였다.
만든 서버는 config 파일을 watch 하고 읽어서,
웹으로 들어온 요청에 json으로 적절히 응답해주는 간단한 서버이다.
그런데..!
스트레스 테스트 시 몇십 초 이후, (약 7000+개의 connection이 이뤄진 다음),
connection 이 아무리 시간이 지나도 이루어지지 않는다.
그런데, 또 몇십 초 지나면, 일부 connection은 수립되기는 한다.
이 현상이 반복되고 있었다...
여러 문제를 체크해 보았다.
로컬에서 테스트도 해보고,
cpu부하나 대역폭도 체크해 보았다.
처음에는 무지하게도 `TIME_WAIT` 을 의심했는데,
TIME_WAIT을 없애기 위해 연결 종료시에 linger를 이용해 RST를 보내도 봤다.
TIME_WAIT을 곰곰이 생각해 보니 connection이 성립 안 되는 문제와는 연관이 없었다.
정확히 t4g.nano 로 올린 ec2 instance에서만 문제가 발생했다.
그래서 해당 서버를 이것저것 살펴본 결과,
nf.conntrack_max = 7680
nf.conntrack_max 값이 눈에 들어왔다.
해당 값이, 7680이었다. 마침 우리 connection 멈추는 개수와 비슷했다.
그래서 찾아본 결과,
docker 를 사용하게 되면, 내부적으로 iptables 모듈 라우팅 기능을 이용하기 위해 해당 모듈이 활성화 되고,
nf.conntrack_max 값에 도달하게 되면, 더이상 네트워크 라우팅 정보를 담을 수 없어서..
net connection이 drop된다!
이러한 문제는, 사실 리눅스 명령어인 'dmsg' 만 알고 있었어도 바로 알 수 있었다...
dmsg를 보니, nf.conntrack_max 때문에 network connection 이 drop된다고 나와 있었다!
'연구한 이야기 > 문제 해결 이야기' 카테고리의 다른 글
Android Studio NDK breakpoint가 잡히지 않아요! (0) | 2024.03.02 |
---|---|
dockerfile은 죄가 없다. (4) | 2024.02.24 |
jenkins(image) 에서 docker buildx를 사용하고 싶어요! (0) | 2023.12.22 |
CMake 와 static library에서의 종속성 관리 (0) | 2023.12.16 |
docker exec format error (0) | 2023.12.09 |