서버 동접자수가 많을때는 무엇을 해야하나

갑자기 오후 느즈막히 연락을 받게되었다 지금 한창 요즘 마영전에 빠져서 시험기간이고 뭐고 내팽게치고 레벨업을 하느라 바쁜중에 무슨 일인가 하였더니 한없이 평화롭고 조용하기 그지 없던 금오사이 서버에 부싯돌이 하나 던져진 것이었다.

금오사이팀은 매일 같이 조회수를 구경하며 새로운 기획안을 짜네면서 어떻게 사람들이 금오사이를 쓸 수 있게 할까 하면서 열중하던때에 내심 조금이나마 미소를 지을찰나 우리팀에게는 그 보다 더 중요한 일이 생기게 된 것이었다.

팀원중 한명이 홈페이지를 모니터링하다가 접속이 안된다고 연락이 온 것이다

 

서버 : ? 버틸만 한데

바로 서버 모니터링을 위하여 콘솔에 접속 해 보았더니 생각보다 CPU 사용율이 그리 높지 않았었다.
메모리의 수치 또한 정상 범위로 서비스 이용에 문제가 없었어야 하는데 접속 중단 현상이 발생한 것이다.

동시 접속자 수치또한 예상했던 범위 안에서 무리 없다고 판단되는 상황이었지만 현실은 지속적인 서비스 중단이 발생하고 하였고, 문제가 없다고 판단하기에는 실제적인 중단이 발생하고 있었기때문에 조치가 필요하였다

일단 서버 가용 성능이 충분함에서 웹서버가 그 역활을 해내지 못하고 판단하고 웹 서버 튜닝을 시작했다. 원래 이런 작업은 미리 해 두어야 했지만 예상을 못하였기에..

 작업 당시에는 이런 회고글을 쓸거라 생각조차 못하고 있었기때문에 이슈 기록을 잠시 살펴보면 기존에 MaxClient와 MaxKeepAliveRequests 값을 각각 100과 300으로 설정 해 둔 것을 확인 해 볼 수 있었다

그전에 설정 자체가 실 사용을 고려하지 않은 세팅이었고 막상 동접자가 차 오르기 시작하자 잘못된 세팅 값의 영향이 발생하기 시작한 것 이었다. 화제성글이 올라오자 사용자들은 해당 글을 읽고 세션이 종료됨에도 해당 세션이 계속 서버에 남아 새로 유입되는 세션이 처리될 공간을 점유하고 있었다.

MaxClient 값을 100에서 40으로 낮추면서 세션이 유지되는 개수를 낮추고, 하나의 세션이 유지되기까지 요청을 기다리는 시간(KeepAliveTimeout)을 5초에서 3초로 줄여 죽은 세션이 빠르게 정리되도록 수정하였다.

그러자 동일한 동접자를 유지함에도 메모리 수치가 함께 낮아지며 서버 지연 현상이 낮아지는 듯 보였으나…

 

방금 마무리되는 상상함 ㅋㅋ

다시 서버가 죽어버리는 문제가 생기는 것이었다.

근본적인 문제가 아니였던건 지속적으로 모니터링을 하며 원인을 찾다보니 서버가 확 느려지는 지점을 찾아 낼 수 있었는데 모바일로 푸시 메시지를 전송하는 과정에서 딜레이가 발생하는 것을 찾아 낼 수 있었다.

금오사이는 WHATAP의 PHP 트랜잭션 모니터링 서비스를 이용하고 있는데 특정 시점에서 트랜잭션 수치가 증가하며 동시에 서버 지연이 발생하고 있었다.

 

requestFcmSend 이놈이 문제였다

금오사이에서 푸시 메시지는 비주기적으로 발송되고 사용자가 글을 쓰거나, 댓글을 달때 보통 발송되게 된다.

PHP에서 어떤 명령이 내려지면 그 명령이 끝나기까지 해당 사용자의 세션을 잡고 있어야 해서 푸시 메시지 전송 구간은 비동기로 처리되도록 구성했는데 문제가 발생한 것이다.

더구나 단순 푸시 메시지 전송인데 SQL 시간이 다수의 시간을 차지하고 있었다.

푸시 메시지가 전송되면 전송 기록과 함께 사용자의 알림 목록에 보관하게 되는데 그 부분이 위 코드 부분과 같다.

만약에 1800개의 푸시가 전송된다면 200개를 나누어서 DataBase에 로그를 Insert하는데 200개의 로그를 Insert하는 9개의 DB 세션이 사용자들의 DB 세션 여유 공간을 차지하게 되는 문제로 보였다.

결론적으로 DB가 순간적으로 처리 할 수 있는 가용 메모리 공간이 더 필요하다는 의미로 해석될 수 있었고 mysql의 버퍼 사이즈를 확인 해 보았다.

 

1GB ? 충분히 많은거 같은데

일단 서버의 현재 메모리는 8GB가 사용되고 있고 최대 접속자가 유지될때 메모리는 5GB까지 사용되었다 기타 서비스 유지를 위하여 1GB 정도의 메모리가 사용된다고 할때 DB 가 1GB의 이상의 메모리를 부여하기에는 부족하다고 판단되었고, 그 즉시 서버 증설을 시작하였다.

증설후 DB에 아낌없이 메모리를 주었고 비로서 서버가 안정권에 접어들 수 있었다.

앱 사용자만 ...? 이런 숫자는 감동이야..

다만 증설된 서버 가격이 월에 10만원가까이 지출이되기에 조만간 하향 작업을 해야할 것 같다.

이번 중간고사도 안녕.

 

아무것도 안하고 가만히 서서 9시간을 넘겨버렸다.

댓글 남기기

이메일은 공개되지 않습니다.