개발 Q&A

제목 동시접속자 수 관련 질문 드립니다.
글쓴이 하늘치 작성시각 2014/01/08 23:11:11
댓글 : 11 추천 : 0 스크랩 : 0 조회수 : 24583   RSS
며칠 전에 저희 회사에서 한 대학과 연계된 서비스를 하게 되었는데요..

접속자 수(학생들)가 생각지도 못하게 많아서, 하루 동안 300명이 넘게 가입하고, 트래픽도 14G 정도 소모되는 바람에 6G 였던 걸 두 번이나 초기화했었습니다. 아직 실력이 안되서 적당히 굴러가게만 만들어놨던 건데... 저희 대표님이 갑자기 일을 끌어오시는 바람에 정말 식겁했네요;

문제는..

21,22일에도 비슷한 걸 하는데, 이번엔 9개 대학에서 참여한다는 겁니다;;

한 대학에서 하는 것만으로도 로그인이 버벅거린다거나, 페이지가 잘 안 열린다거나 했다는데.. (참고로 저는 다른 거 개발-코딩-하느라 몰랐습니다. 그냥 트래픽 초기화만 했지요;;) 암튼 큰일이라서요..

짧은 식견으로는 동시접속자 수 문제 때문인가 싶어서 여기 저기 검색을 해봤습니다.

검색해보니, 동시 접속자 수를 늘리는 방법들이 나오긴 하는데, 이게 믿을만 한 것인지 알 수가 없어서 이렇게 글을 남기게 되었습니다. 서두가 길었네요;;


아무튼, 제가 찾아본 해결책이라고는 동시 접속자 수를 늘리는 것인데, 정리해보니 이렇네요.


1. apache 의 MaxClients 수를 늘리라는 것과,
2. mysql 의 max_connections 수를 늘리라는 것이었습니다.


일단 저희 서버는 리눅스 기반에 apache 버전은 2.2.3 이고, mysql 버전은 5.0.67 입니다.


참고 사이트는
http://blog.naver.com/happily23?Redirect=Log&logNo=80037169871
그리고
http://itnpeople.blogspot.kr/2011/12/blog-post.html

이 외 여럿 있었는데요..
아래 내용은 도움이 될 것 같으면서도 모호한 느낌이었던;;
https://kldp.org/node/100686


솔직히 식견이 짧아 무슨 말인지 정확하게는 잘 모르겠더군요..


먼저 첫 번째,
현재 저장되어 있는  apache 설정 부분입니다.



# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      1024
MaxClients       1024
MaxRequestsPerChild  4000
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers         2
MaxClients         150
MinSpareThreads     25
MaxSpareThreads     75 
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>




여기에서

1. httpd.conf 수정
"MaxClients 150" 부분에서 150 수치를 1024 이하로 변경하고

2. 아파치 재시작
apachectl restart

이러면 되는걸까요??



두 번째,
MySql 입니다..

mysql>show variables; 해보니

| max_connect_errors    | 10  
| max_connections       | 100
| max_delayed_threads   | 20
이렇네요.

이 숫자도 늘리려면

mysql>safe_mysqld -O max_connection=1000 &

이렇게 해서 아파치와 mysql 수치를 늘리고

[root]# apachectl restart

이렇게 하면 되는 걸까요??




음.. 암튼 포인트는 요겁니다..
한 대학교에서만 학생들이 거의 3~400명이 특정 시간대에 몰려서 가입하고, 접속하고 했더니 발생된 트래픽이 14G 정도였고, 접속이 잘 안되면서 mysql 쪽도 문제가 있었던 듯합니다. 이번엔 우째 우째 트래픽 초기화정도로 넘어갔습니다만, 21, 22일에 예정된 일 때문에 이렇게 질문을 드립니다. 그 때는 아마도... 수천명이 가입하고 접속할 텐데.. ㅠㅠ

이런 상황에서 동시접속자 수를 늘리는 것만으로는 무리일 것 같긴 합니다만, 그래도 이 곳 밖에 없어 이렇게 조언을 구합니다.




너무 늦은 시간이라 정신이 몽롱합니다;; ㅠㅠ
오늘은 일단 이 정도로 적고 퇴근해야겠어요..


 다음글 bootstrap3 관련 질문입니다. (4)
 이전글 stdClass 관련해서 문의 드립니다... (5)

댓글

하늘치 / 2014/01/09 11:01:42 / 추천 0
다시 검색중입니다..

1. apache 설정..

http://blog.daum.net/twinsnow/77

위 블로그에서 이렇게 얘기하네요.

< IfModule worker.c>
StartServers         16
MaxClients         1024
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     64
MaxRequestsPerChild  0
< /IfModule>


이때, Max Clients 값은 StartServers x ThreadsPerChild 값입니다.
ThreadsPerChild는 64가 최대치



하늘치 / 2014/01/09 11:04:43 / 추천 0
2. mysql

http://blog.rainygirl.com/?p=1266

위 블로그 글에서는

my.cnf 의 max_connection

에 관한 얘기가 있고요.

그런데 저희 서버에는

/etc/my.cnf, /etc/mysql/my.cnf

모두 max_connection 이라는 항목이 아예 없네요;;
좀 더 찾아봐야겠습니다...



- 추가

http://blog.cafe24.com/1924
위 블로그에서 찾은 내용입니다.

저 아래처럼 /etc/my.cnf 파일 내용 중에서..
max_connections = 2048
요걸 추가하고,

mysql 재시작하면 된다는군요.
/etc/rc.d/init.d/mysql restart


read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8

max_connections = 2048

들국화 / 2014/01/09 11:42:01 / 추천 0
설정값은  서버스팩 및 상황에 따라 달라 집니다. 설정값 추천해주는 스크립트나 프로그램 찾아 보는 방법도 있을거구요.
두 서버 설정을 변경 하는걸로도 해결될지 모르겠지만... 서비스 라는게 생물같아서 변화 합니다. 어느쪽에 커지기도 하고 작아지고 사라지기도 하죠... 그래서 프로파일링을 하는게 설정 변경하는것 보다 우선 할것 같네요.
그리고 네트워크 공부를 좀 하시면 도움이 많이 될거 같네요.

그냥 읽다 문득든 생각인데.. 접속자에 비에 데이타량이 좀 많아 보이네요... 서비스 특성이 그렇타면 이해가 되지만... 페이지 용량이 너무 높은게 아닐까 하네요.
하늘치 / 2014/01/09 12:29:06 / 추천 0
조언 감사합니다.

저희 서비스가 소셜펀딩 쪽인데, 학생들 경진대회 같은 것에 저희 플랫폼을 제공한 모양이에요.
저도 왜 트래픽이 저리 많은 건지 잘 모르겠어요.
업로드 하는 것들이 많아서 그런건지, 아니면 코딩이 지저분해서 그런건지.. ^^;

참, memory_usage 라는 걸 보니,
페이지당 보통 2.6MB 에서 3.6MB 정도 나오네요..
디자인 이미지 때문인가;;;
이런 것도 관련이 있는건가요?

그나저나... 네트워크 공부는 정말 해야겠네요. 리눅스나 서버 설정도 그렇고..
참 할 것이 많군요. 허허허
변종원(웅파) / 2014/01/09 13:35:22 / 추천 0
ci로 만드셨다면 정상범위의 메모리 사용량입니다.

트래픽은 이해가 좀 안되네요. 소셜펀딩이라 하셨는데 학생 300명 붙었다고 14G라는게....


웹과 mysql 서버는 분리되어 있는거죠? 내부 아이피로 연결되어 있구요?

만약 같은 서버에 있는거라면 위의 작업을 해도 큰 의미는 없습니다.

하루 300G 트래픽이 나오는 광고플랫폼을 만들어서 서비스중인데 초기에 아파치 및 mysql 설정을 변경하면서 jmeter라는 툴로 테스트를 해서 적용했습니다.

검색에서 나온 결과가 꼭 맞지는 않습니다.

수 많은 요청이 전문서버로 들어오는데 제 경우엔 worker보다 prefork설정이 더 나은 퍼포먼스를 보였습니다.
(검색결과에선 반대로 해야 퍼포먼스가 좋다고 했죠)

아파치  (2core 2G kt ucloud)

<IfModule prefork.c>
StartServers      256
MinSpareServers    50
MaxSpareServers   100
ServerLimit     8192
MaxClients       5000
MaxRequestsPerChild  4000
</IfModule>

mysql (4core 8G kt ucloud)

max_connections = 1500
thread_cache_size = 1000

innodb_additional_mem_pool_size=3469K
innodb_flush_log_at_trx_commit=2
innodb_log_buffer_size=4M
innodb_buffer_pool_size=3600M
innodb_thread_concurrency=8
innodb_flush_method=O_DIRECT

read_buffer_size = 2M
read_rnd_buffer_size = 256K
sort_buffer_size = 2M

key_buffer_size=2400M
table-cache=512
query_cache_size = 32M

위 설정으로 서비스중인데 웹은 전문서버 3대가 L4에 물려있고 광고플랫폼이라 이미지 소비량이 엄청 많아서 이미지서버 5대(1core 1G)가 따로 L4에 물려있습니다. mysql은 서비스용과 로그용 2대 있구요.
중앙에 NAS가 존재해서 전문서버와 이미지서버가 연결되어 있구요. mysql도 백업용으로 사용

정답은 없습니다. 상황에 맞게 튜닝을 해야하는겁니다.

서비스 오픈한지 7개월 정도인데 그동안 서버구성도가 2번 바뀌었습니다. ^^;
하늘치 / 2014/01/09 14:07:10 / 추천 0
조언 감사합니다.

안타깝게도 저희는 서버가 한 대 뿐이라, 웹과 mysql 이 한 서버 내에 들어있습니다..
서버는 차차 늘려가면 되겠지 했는데, 어쩌다 보니 상황이 이렇게 흘러가네요;

제 입장에서야 경험 쌓는다 생각하면 되겠지만, 회사 입장에선 서비스가 잘 돌아가야 하는 거다 보니.. 마냥 여유를 부릴 수도 없군요. 헛헛-

그나저나 같은 서버 내에 있다면 별 의미가 없는건가요;;

그래도 일단은..

prefork 설정을 웅파님 처럼 바꿔는 봐야겠네요.



현재
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      1024
MaxClients       1024
MaxRequestsPerChild  4000
</IfModule>

<IfModule worker.c>
StartServers         16
MaxClients         1024
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     64
MaxRequestsPerChild  0
</IfModule>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


현재 이런 설정인데, 아래처럼 바꿔도 괜찮을런지요...


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<IfModule prefork.c>
StartServers      256
MinSpareServers    50
MaxSpareServers   100
ServerLimit     8192
MaxClients       5000
MaxRequestsPerChild  4000
</IfModule>

<IfModule worker.c>
StartServers         32
MaxClients         2048
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     64
MaxRequestsPerChild  0
</IfModule>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


참고로 저희 서버는

Intel Xeon E3-1220(3.10GHz, 8MB, 80W)
RAM : 4GB (2x2GB) / PC3-10600E
HDD : 500G, 백업하드 별도
네트워크 용량 : 5M Max

입니다.

며칠 전 대학생들이 영화 300처럼 밀고 들어왔을 때,
계약회선은 5M 인데 그 날은 7.63 Mbps라고 찍혀나오네요.

그리고 정말 왜 그렇게 트래픽을 많이 잡아먹은걸까요;;;

변종원(웅파) / 2014/01/09 14:13:38 / 추천 0
같은 서버에 있다면 산술적으로 아파치와 mysql 둘다 부하가 가니 X2가 됩니다.

설정을 바꾸면 어느 정도는 버티겠지만 서버가 분리되어있을 때만큼 효과를 보기 힘듭니다. ^^
하늘치 / 2014/01/09 14:22:07 / 추천 0
정말 감사합니다. ^^
중요한 걸 배워가네요~

그리고, 웅파님께서 올려주신 내용을 보니, DB 서버의 사양이 더 좋네요.
일반적으로 웹서버와 DB서버를 놓고 봤을 때, DB 서버 쪽 사양을 높이는 것이 더 좋다는 뜻으로 이해해도 되나요?

어쨌거나 회사에 건의를 해야겠네요.
DB 서버를 추가해달라고요.. ^^

한대승(불의회상) / 2014/01/09 14:48:40 / 추천 0
하늘치// 클라우드 서버에 관심을 가지실때가 된것 같습니다. ^^
변종원(웅파) / 2014/01/09 17:20:10 / 추천 0
하늘치/ 서비스 특성에 따라 다릅니다. 전문서버 3대가 있고 db는 1대를 놓다보니 사양이 높을 수밖에 없고 보통 웹서버 보다는 높은 사양으로 합니다. 메모리가 중요하구요.

어쨌든 현재는 저렇게 구성되어 있지만 접속이 늘어나면 scale out을 하여 db서버 사양을 높이거나 클러스터 구성을 하거나 할 생각입니다.

불의회상님 말씀처럼 요즘은 클라우드 서버가 대세(?)입니다.

개발하며 13대의 서버와 로드밸런서, NAS, 백업 등을 관리하고 있는데 클라우드가 아니면 생각하기 끔찍합니다.

kt ucloud가 아직 좀 부족하고 모자란 것이 있지만 속도와 트래픽(1서버당 1T 제공)은 어느 클라우드도 따라 올수가 없습니다.

월 3만원정도의 최소사양서버(1core 1G) 1대당 월 1T의 트래픽이 제공됩니다. 로드밸런서 물려서 5대 쓴다면 한 서비스에 5T의 트래픽을 쓸 수가 있습니다.

하늘치 / 2014/01/13 11:48:01 / 추천 0
한대승// 넵! 그래서 당장 회사에 저의 관심을 전달했습니다. ㅋㅋ

변종원// 정말 좋은 정보 감사합니다. 좀 전에 대표와 얘기했는데, 일단 DB라도 클라우드 서비스를 이용해 보기로 했네요. 트래픽이 1T 라네... 헛헛-

모두모두 즐거운 월요일 보내세요~ :)