레벨 4는 주로 서비스 성능을 개선하는 미션들이 많이 있다.
그 중, 목표 사용자 수에 따른 Tomcat 서버의 threads-max
, accpet-count
, max-connection
설정을 통해 성능을 개선하는 과정을 기록하고자 한다.
우선 위 세 가지의 용어에 대해 알아보자.
나는 이를 미용실에 빗대어 설명을 하려고 한다.
미용실을 서버(Tomcat)
미용실에서 머리를 하고 싶은 사람을 HTTP Request
머리를 할 수 있도록 도와주는 자리의 수를 max-threads
미용실 안에서 대기할 수 있는 대기석 수를 max-connections
미용실이 가득 찼을 경우, 밖에서 기다릴 수 있는 인원수를 accept-count로 비유할 수 있을 것이다.
이 컨셉을 가지고 테오의 글을 보면 훨씬 이해가 쉬울 것이다.
실리콘벨리에서 일하는 개발자가 쓴, Apache Tomcat Tuning글을 통해 다음 세 가지 조건을 조절하는 방식을 내가 미용실의 사장이 되었다고 가정한 상황에 빗대어 설명하고자 한다.
일단 여기까지 사람이 대기한다는 것은, 미용실 안의 대기석과 자리가 부족하다는 것이다.
만약 야외 대기줄이 길다면 사람들은 미용실을 어떻게 평가할까?
얼마나 더 기다려야할 지 모르고 가만히 서서 기다리는 고객들은 결국 인내심의 한계를 느끼고 떠날 것이다(Request Time-out). 그리고 미용실에 안좋은 기억을 가질 것이다.
결국, 고객의 관점에서 봤을 때 야외 대기줄이 짧거나 아예 없는 것이 좋다.
따라서 0~10을 추천한다.
손님들을 미용실 안에서 대기할 수 있게 할 대기석의 수는 어떻게 정할까?
이때 미용실 정책상, 의자에서 머리를 하고 계산까지 마친 후에야 모든 작업이 끝난다는 사실이 중요하다.
즉, 계산이 진행되는 동안에도(HTTP TIME_WAIT) 다른 고객의 요청을 처리할 수 없다는 말이다.
고객의 관점에서 봤을 때, (머리를 다 하고 계산하고 떠나려는 다른 고객이 자리를 점유함) && (대기석이 부족함) 의 조건으로 밖에서 기다린다면 "뭐 이렇게 운영해?" 라며 불만을 가질 것이다.
결국, 대기석을 넉넉히 잡아두어 이런 불만을 잡아야 할 것이다.
따라서 개인적인 기준으로, 설정할 max-threads
의 n(n <= 3)배 수를 추천하고 싶다.
이제 고객의 요청을 처리할 수 있는 자리의 수를 결정지어야 한다.
오는 고객에 비해 터무니없이 많으면 자리가 아깝고, 그렇다고 적으면 미용실을 운영하는 데 손실이 발생할 것이다.
즉, 오는 고객의 수에 따라 적절히 자리의 수를 잡아야 할 것이다.
근데 사실 고객이 얼마나 올지는 조상님도 모르고, 매 시간 고객이 오는 시간을 보고 자리의 수를 조절하는 것은 또 불가능하다. 왜냐하면 자리의 수를 설정하는 동안에는 미용실 문을 잠깐 닫아야 하기 때문이다.
그럼 어떻게 설정하면 좋을까?
위 글에선 보통 100을 설정하면 좋다고 했는데, 내 생각엔 우리 서비스를 몇 명이나 사용할 지 기대하는 만큼 설정하는 것이 가장 베스트가 아닐까 생각한다.
그랬는데 안오면 줄이면 되고, 많이 오면 늘리면 되고!
+09.18 추가
위 글에서 순간 처리 가능한 Transaction 수를 의미 한다고 한다.
우리 팀 내에서도 부하 테스트를 진행하며 Threads가 많을 수록 좋은게 아닌가? 라는 의문이 나왔었다.
로이스가 위에 대한 추측으로, 'thread 수가 많아도 DB Connection이 부족하면 thread가 만들어진 채로 대기하고 있을 것이다.'라고 했다.
즉, DB Connection과의 관계도 생각해봐야 한다.
현재 셀럽잇의 목표 단순 사용자(방문자) 수는 100명이다.
이 말은 즉, 최대 100명의 인원이 동시에 우리 서비스를 사용했을 때, 서버에 장애가 생기지 않아야 한다는 말이다.
그렇다고 최대 기준이 100명은 너무 아쉽다. 300명이 사용할 수도 있지 않을까?
사실 현재 부하 테스트를 진행중인데 우리가 정한 테스트 시나리오의 최대 동시 접속자 수는 300명이다.
그렇다면 다시, 이 300명의 요청을 무리없이 받아낼 수 있는 서버의 상태를 만든다면 100명이 사용한다고 했을 때에도 충분히 견딜 수 있는 서버가 되지 않을까?
따라서 나는 아래와 같이 설정하고 싶다.
maxThread: 100
max connection: 300
accpet count: 10
설정하고 싶다라고 하고 끝내면 안되니까 다음 작성할 글은, 실제로 개발 서버에 부하 테스트 하는 과정에 대한 글이 될 것이다.
그 과정 속에서 위 값들을 적절히 조절해가며 최적의 값을 찾아낼 것이다.
default가 maxThread 200 acceptCount 100 maxC 8192인 걸로 아는데, 줄이는 이유가 궁금해요! 가장 fit한 서버를 운영하고 싶어서인가요? (리소스 남용 방지??)