서버튜닝을 통한 테스트를 진행해 본다.
* 기본 현재 서버의 상태는 아래와 같다.
- OS : Ubuntu
- CPU : 2.1Ghz / 16Core
- Memory : 32G
- Apache : Version 2.2.22
- Maria : 5.5.30
1. Default Setting (12:00)
Thread : 100 * X = 20000회 실행
소요시간 :38 Sec
2. (13:27)
Thread : 200 * X = 20000회 실행
소요시간 :31 Sec
Error 률이 26.11%로 높게 나타났다. 이는 mysql 로의 접속 시 "Too Many Connection" 오류로 인한 것이다.
현재 Mysql(MariaDB) 의
MaxConnection(show variables like '%max_connections%') = 100 으로 설정 되어 있다.
Max_used_connections = 101
3.(14:07)
Thread : 200 * X = 20000회 실행
소요시간 :31 Sec
MaxConnection = 200 으로 변경
Too Many Connection 으로 인한 에러는 줄어들었다.
show status like '%connections%'; 으로 max_used_connection 을 확인한 결과 147로 확인되어 현재 테스트까지는 Max Connection 까지 여유가 있어 보인다.
4.(14:23)
Thread :300 * X = 20000회 실행
소요시간 :33 Sec
5. (14:37)
Apache 의 MaxClients 변경
현재 Apache 서버가 Prefork 방식이므로 apache.conf 파일을 아래와 같이 수정하였다.
<IfModule mpm_prefork_module>
ServerLImit null => 1024
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150 =>1024
MaxRequestsPerChild 0
</IfModule>
Thread :300 * X = 20000회 실행
apache 의 maxClients 수를 늘림으로 인하여 또 다시 mysql에 대한 Too Many Connection 에러가 발생하였다.
6. (14:44)
MySQL 의 MaxConnection 을 500으로 변경한 후 다시 테스트
Thread :300 * 70 = 21000회 실행
결과
Error율은 감소 하였고, mysql의 max_used_connections = 284로 확인 되었다.
7. (17:00)
Apache.conf 의 MaxKeepAliveRequests 100=>10000 으로 변경
MaxKeepAliveRequests : 웹서버 프로세스가 지속적으로 접속을 유지하면서 처리할수 있는 요청 갯수
결과
6의 결과와 비교하여 별다른 차이점은 없었다.
8.
Apache 의 StartServers, MinSpareServers, MaxSpareServers 변경
현재 Apache 서버가 Prefork 방식이므로 apache.conf 파일을 아래와 같이 수정하였다.
<IfModule mpm_prefork_module>
ServerLImit 1024
StartServers 5 =>20
MinSpareServers 5=>20
MaxSpareServers 10=>40
MaxClients 1024
MaxRequestsPerChild 0
</IfModule>
SpareProcess 가 많을 수록 폭주에 빨리 대처가 가능하다.
Thread :300 * 70 = 21000회 실행
Apache restart 후 프로세서의 갯수를 확인하면 초기 실행시 기존 5개이던것이 20개인것으로 확인 된다
ps -ef | grep apache | wc (apache 프로세서의 갯수 확인)
23개로 나타나는데 3개는 실제 서비스가 아닌 부수적인 프로세서로 보면되고 나머지 20개가 child process 이다
9. (17:35)
Apache 의 KeepAliveTimeout 5 =>25 로 변경
KeepAliveTimeout : KeepAlive 지시어가 On 일때만 유효하며, 이미 열린 connection에서 추가 요청을 기다리며 대기중이다.
KeepAliveTimeout 25 로 설정하면 클라이언트가 25초동안 아무요청이 없으면 프로세스의 연결을 끊는다. 이 값을 60 초 이상으로 올리면 사용자의 요청을 기다리며 아무일을 하지않는 프로세스가 60초동안 떠있게 되는것이다. 자신의 네트웍대역과 부하에 따라 적절히 조절한다
10.(18:10)
mysql 의 MaxConnection 을 넘겨 테스트 요청
MaxConenction : 500
Client1 에서 Thread 300 * 70회 요청
Client2 에서 Thread 300 * 70회 요청 하여 동시접속자수가 500이상이 나오도록 테스트 한 결과
Apache 에서는 500이상의 접속자를 수용하지만 Mysql 에서 Too Many Connection 오류 발생
11.(10/24.13:48)
Apache MaxClients 10000
Mysql MaxConenction : 1000 으로 설정
Client1 에서 Thread 300 * 70회 요청
Client2 에서 Thread 300 * 70회 요청 하여 동시접속자수가 500이상이 나오도록 테스트 한 결과
Apache 동시접속자수 최대 554, Mysql max_used_connection = 554 로 확인
12.(10/24 15:37)
Apache MaxClients 10000
Mysql MaxConenction : 2000 으로 설정
Client1 에서 Thread 500 * 70회 요청
Client2 에서 Thread 500 * 70회 요청 하여 동시접속자수가 1000이상이 나오도록 테스트 한 결과
Mysql max_used_connection = 833 로 확인
13.(10/24 17:30)
Apache MaxClients 10000
Mysql MaxConenction : 2000 으로 설정
Client1 에서 Thread 1000 * 20회 요청
Client2 에서 Thread 1000 * 20회 요청 하여 동시접속자수가 1000이상이 나오도록 테스트 한 결과
Mysql max_used_connection = 1329 로 확인
Apache 의 동시 접속자 수 = 1365 까지 확인 되었음.
13.(10/24 17:43)
Apache MaxClients 10000
Mysql MaxConenction : 5000 으로 설정
Client1 에서 Thread 1000 * 20회 요청
Client2 에서 Thread 1000 * 20회 요청
Client3 에서 Thread 1000 * 20회 요청
하여 동시접속자수가 1000이상이 나오도록 테스트 한 결과
Mysql max_used_connection = 2130 로 확인
Apache 의 동시 접속자 수 = 1500 까지 확인 되었음.
아차피 동시접속자 확인하기
netstat -an |grep :80 |grep ES |wc -l
아파치 동시 접속자라기 보다는 TCP 80번으로 연결을 맺은 아이피들의 갯수
참조
http://hebackblog.blogspot.kr/2013/07/blog-post_10.html
http://loves-textcube.blogspot.kr/2009/06/%EB%B3%B8%EB%AC%B8%EC%8A%A4%ED%81%AC%EB%9E%A9-%EC%95%84%ED%8C%8C%EC%B9%98-20-maxclient%EC%88%98-%EB%8A%98%EB%A6%AC%EA%B8%B0.html
http://geen02.blogspot.kr/2013/01/apache-apache-prefork-worker.html
https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=961&sca=2
http://tiger5net.egloos.com/5672418
http://blog.naver.com/PostView.nhn?blogId=akaroice&logNo=60067572903