문제 상황 

현재 EC2 우분투에 Nginx - Uwsgi - Flask 로 서버가 구성되있는 상태이다.

동시접속자 테스트를 하기 위해서 Jmeter를 이용하여 API 요청을 100개, 200개, 300개를 하는데

100개, 200개일 때는 없던 error가 300개일 때는 20~30% 개씩 생기기 시작했다.

어떤 error인지 확인을 해보았고, 

응답코드가 502 인것을 확인을 하였다. 제일 먼저 아랫단인 uwsgi log를 확인해 봤다.

uwsgi에서는 502로 응답을 보낸 것이 없었다.

즉, uwsgi로 아예 요청이 들어오지 않았다는 것을 알 수 있었다.

그래서 그것보다 윗단인 nginx로그를 확인을 했다. 

2016/06/08 07:45:13 [error] 9913#0: *394 connect() to unix:/home/ubuntu/idletower/server.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 175.196.62.240, server: , request: "GET /v1/test HTTP/1.1", upstream: "uwsgi://unix:/home/ubuntu/idletower/server.sock:", host: "52.193.46.113"
"/var/log/nginx/error.log" [readonly] 1646L, 533533C

라는 Error 로그를 발견할 수 있었다


 
해결과정

에러 로그에서 발견한

(11: Resource temporarily unavailable) while connecting to upstream

키워드를 이용해서 구글 검색을 했다. 


를 확인해보면 위의 에러로그는 socket 리소스가 일시적으로 사용할 수 없는 상태라는 것을 의미하고 있엇다.

그것은 현재 socket high load, busy 하다는 것이다.


현재 테스트 하는 서버에서는 uwsgi가 server.sock이라는 유닉스 소켓을 생성해서 그 socket을 이용해 nginx와 통신을 하는데

그 socket이 어떤 제한이 걸렸기 때문에 안되는 거라고 생각을 했다. 


더 검색을 하다

http://simp1e.tistory.com/39 이 곳을 참고하게 되었다.

위 링크를 따라서


sudo sysctl -a | grep somaxconn 


으로 socket max connection 128 밖에 되지 않는것을 확인하고 


sudo /sbin/sysctl -w net.core.somaxconn=1024


추가 시켰다. 다시 테스트를 해봤지만 별 차이가 없었다.

ulimit -a 

라는 명령어를 통해서 open files와, max user processes 수도 늘려봤지만, 별로 달라진게 없었다.

그러다 uwsgi  로그를 확인하던 중 

your server socket listen backlog is limited to 100 connections

라는 메세지를 발견하게 되었고, 구글링을 통해서 backlog를 증가시키는 법을 찾아냈다.


uwsgi 설정에서 

listen = 1024

를 입력해서 다시 서버를 Start 시키니, 1024로 backlog가 늘었다.


그리고 400개의 api를 보내봤는데 error가 발생하지는 않았다. 

여기서 net.core.somaxconn 의 갯수와는 무슨 상관이 있을까 싶어서 숫자를 줄이고 다시 서버를 시작하니


Listen queue size is greater than the system max net.core.somaxconn (1000).


라는 오류가 발생했다.



즉 socket backlog 갯수는 net.core.somaxconn 갯수와 같거나 작아야 하는 것이다. 

다 됐다고 생각하고 더 높은 인스턴스에서 1000개를 보내는 테스트를 하는데 에러가 몇 개정도 나서 확인 해보니

nginx에러 로그에서 Too many open files 이라는 것을 확인하게 되었다.

sudo sh -c "ulimit -n 65535 && exec su $LOGNAME" // open file


이렇게 다 늘리고 나니, 높은 인스턴스에서 정상적으로 1000개, 2000개에도 빠르게 모든 것을 처리하는 것을 확인할 수 있었다.


참고로 open file이나 process 제한을 영구적으로 변경하고 싶다면 

/etc/security/limits.conf 

의 맨 아랫줄에 
# open files
     ubuntu hard nofile 512000
     ubuntu soft no file 512000 

# process
     ubuntu hard nproc 512000
     ubuntu soft nproc 512000

을 추가해주자. 


+ Recent posts