개발 Q&A

제목 순간 동접에 대응하기 위한 웹서버 셋팅
카테고리 서버
글쓴이 마PD 작성시각 2017/08/24 12:16:29
댓글 : 7 추천 : 0 스크랩 : 0 조회수 : 17997   RSS

안녕하세요

구글링 해봐도 참 말이 많은 주제인거 같습니다. ㅎㅎ

순간 피크치가 확 올라가는 트래픽에 대응하기.... 입니다.

서비스 특성상 평소엔 200~300명 정도 동접이 유지되다가 특정 시점 (앱 푸쉬)이 되면 순간 동접이 2천명 이상까지도 올라가 버립니다.

 

현재 조치 사항으로는,

 

1. 이미지 처리 전용 서버(nginx)와 PHP를 처리해줄 아파치서버 분리

2. 이미지 서버는 haproxy 로 묶어서 로드밸런싱

3. 아파치 서버도 로드밸런싱 (kt 로드밸런서 --;; 이것도 haproxy로 변경할 예정)

4. DB는 구조상 분리가 불가능하여 고사양 + 튜닝으로 어느정도 해결

 

피크 시점이 오면 접속시 로딩시간이 수십초까지 걸리는 엄청난 일이 있었고,

여기저기 조치들을 진행하게 되었습니다.

그럼에도 불구하고 피크 시간이 되면 약3~5초간의 딜레이가 생기게 됩니다.

어쩔 수 없는 하드웨어적 한계일지는 모르겠으나 원인에 대해서 감이 잡히질 않습니다 ㅜ.ㅜ

 

 

- DB 관련 처리 내용

특정 테이블에 테이블 락이 걸리는 바람에 처리가 지연되고 있어서 innodb로 변경하였고 특히나 시간이 오래 걸리는 쿼리문은 튜닝을 거쳐 빠르게 처리 가능하도록 했습니다.

피크 시간에도 처리중인 내역 모니터링을 해봐도 특별히 지연되거나 락이 걸리는 테이블은 없습니다.

 

- 이미지 서버쪽 셋팅

이번에 처음으로 CDN 개념으로 이미지 서버를 만들자는 생각으로 만들었습니다.

nginx 처음 써보는 열심히 구글링하여 스태틱 서버에 쓸만한 옵션들로 설정한 후 5대를 놓았습니다.

그럼에도 이미지서버쪽도 뭔가 모를 부하가 많이 걸려서

1. 사용자<->프록시 간은 https 통신

2. 프록시<->이미지서버(nginx) 간 http 통신

으로 변경하였고 haproxy 를 담당하는 서버의 스펙도 올려줬습니다. 하프록시 사이트에 의하면 동접 1만까지는 끄떡없다곤 합니다 (...)

 

- 아파치 서버

kt에서 제공해주는 로드밸런서 아래에 아파치 웹서버를 두었습니다.

원래 쓰던 셋팅이고 아파치 튜닝을 암만해도 나아지질 않아서 nginx로 갈아탈 생각을 하고 있습니다.

여러가지 셋팅, 리다이렉트, 버츄얼 설정 등등이 있어서 심적으로 보류중입니다 ㅎㅎ

아무튼 이쪽도 kt 로드밸런서 성능을 신뢰한다는 가정하에 웹서버들 로그나 그래프를 봐도 특별히 부하가 걸리지는 않고 있습니다.

 

 

이제 어떤걸 의심해봐야할까요?

1. 아파치 서버들이 순간 동접에 대해 대응이 느리다.

2. 모든 원본 파일들을 nas에 올린 후 네트워크로 불러오도록 했는데 nas의 IO 문제에 걸렸다?

-> 스펙상 2000미만 IOPS를 지원한다고 합니다.

 

그 애매한 3~5초간의 딜레이가 사람을 괴롭히네요 ㅜㅜ

 

 

 다음글 혹시 moodle 커스터마이징 해보신분 계실까요? (2)
 이전글 PHPStorm 사용시 폰트 색상 설정 관련 (2)

댓글

변종원(웅파) / 2017/08/24 13:02:31 / 추천 0

서버 자체의 문제인지 mysql 연결단 문제인지 먼저 구분을 하셔야할 것 같네요.

kt ucloud 최소사양서버 6대로 이미지서버 구성(kt lb)하여 스마트택배앱의 광고솔루션 대응했었는데 이미지쪽이 특별히 문제가 된 적은 없었습니다. 

동접이 몰릴 때 api서버와 mysql의 컨넥션 부분에서 문제가 되고 했죠. 

피크시간에 3-5초 딜레이 온다는 것이 웹서버인지 이미지서버인지 명시가 안되어 있네요.

서버군은 개별적으로 스트레스 테스트를 진행해서 1대당 최대 허용치를 알고 계셔야 합니다.

마PD / 2017/08/24 13:46:15 / 추천 0

웅파//

조언 감사합니다. (__);

사실 지금 3~5초의 딜레이가 이미지에서 오는것인지 웹에서 오는 것인지 분간이 잘 안되고 있습니다.

말씀해주신대로 스트레스 테스트로 피크치를 좀 알아야 할 필요가 있을거 같네요. ㅜㅜ

아무래도 이미지쪽 보다는 아파치쪽 문제인거 같은데... PHP 솔루션이 PHP 버전도 낮을 뿐더러 예전에 만들어둔걸 사온지라 정말 여러모로 문제가 많습니다. (...)

그래서 서버 스펙과 수량으로 찍어누를 생각이었는데 이상하리 만치 피크 시간에 대한 대응만 잘 안되네요...

스트레스 테스트를 각각 진행해보겠습니다. ㅜㅜ

당근병아리 / 2017/08/24 17:03:31 / 추천 0

제 경험상으로 앱 푸시할때 당연히 유저에 의해 동접이 많이 발생합니다.

당연히 아파치 웹 서버에서 부하입니다. 

그 때는  아파치 웹 서버 여러대를 더 가동하는 방법밖에 없습니다.

오토스케일링으로 해결될 수 있습니다.

수동으로 미리 웹 서버를를 그 순간에부터 더 가동할 수 밖에 없습니다.  

마PD / 2017/08/24 17:36:00 / 추천 0

당근병아리//

지금 로드밸런서 아래에 붙어 있는 아파치 서버가..

2cpu 2ram 스팩으로 7대가 붙어 있습니다.

동접이 아무리 피크를 치더라도 2천이고 안나올땐 1천명 정도인데 그걸 못버틴다는게 잘 이해가 안되서요

튜닝을 암마 못했더라도 그럴수가 있을까요? nginx 로 갈아타볼까 하는 유혹이 멈추질 않네요...

튜닝의 문제일수도, 원래 아파치가 못버티는걸수도 있으니 스트레스 테스트를 진행해보긴 해야할거 같습니다. 전에 ab 테스트로 뭔가 좀 해보다가 잘 안돼서 포기했었는데 다시 찾아봐야겠네요 ㅜㅜ

당근병아리 / 2017/08/24 17:48:12 / 추천 0

동접에 비해 웹서버에 대한 메모리 용량부터 낮습니다.

직접 전체 메모리 / 아파치 프로세스 평균 메모리 사용량 을 계산하시기 바랍니다.

대충 계산하며 1대 당 200명 정도일 겁니다.

4 core / 8gram 정도되서야 합니다.

1대 웹서버 당 1000~1200명 은 될 것라고 예상합니다.

웹서버 사양 업그레이드를  추천합니다.

슘님 / 2017/08/24 17:57:01 / 추천 0

트래픽이 갑자기 몰리면 당근병아리님이 말씀하신 부분도 확인해보셔야 하며

더불어 DB 서버도 확인해보셔야 합니다. (올리신 사양이 피크때 resource uilization이 full인지)

DB의 경우 read replica를 두시는 것을 추천드립니다.

변종원(웅파) / 2017/08/24 18:20:52 / 추천 0

ci2 기준으로 보편적 프로그램으로 1 접속당 메모리 3m 잡고 평상시 데몬들이 사용중인 메모리 빼면

한 서버당 메모리 full되는 인원이 나옵니다. 메모리 2기가라도 한 70%만 가용할 수 있다고 예상하면 

한서버에 466명 나옵니다. 2천 동접에서 문제가 생긴다면 db일 가능성도 크네요.

메모리만으로 계산한 수치니까 참고하세요.