최근 nginx 서버를 돌리는데 중간중간에 Resource temporarily unavailable 오류가 발생하는 것을 확인했다.

오류는 아래와 같았다.

Datetime [error] 4027#0: *178859567 connect() to unix:///home/sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: client_ip, server: localhost, request: "GET path HTTP/1.1", upstream: "uwsgi://unix:///home/sock:", host: "host_ip"


이 오류를 해결하기 위해 몇가지를 시도해보았다.

1. uwsgi와 같이 사용하기 때문에 uwsgi에서 발생하는 오류인줄 알고 uwsgi가 requests를 처리 못하여 생기는 오류인줄 알고 max-requests값을 높여보았지만 효과없었다.

2. "소켓 접속 제한를 초과하여서 발생하는 오류이다."라는 또 다른 가설을 세우고 제한를 조정해보았다.

sysctl -a | grep somaxconn
net.core.somaxconn = 127


default로 설정이 되어있었으며 이 값을 10240으로 변경해주었다.

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


변경 후에도 큰 변화는 아니지만 오류 발생 빈도가 줄어들었지만, 여전히 오류가 발생한다.

3. Django를 nginx+uwsgi 로 해서 돌리고 있었다. 오류를 좀 더 확인하기 위해서 Django를 devserver형태로 돌렸다. 디버깅도 확인해보니 오류를 뿜어낸다.

Too many open files 라는 오류가 발생했다. 이때 알았다. 리눅스에서는 시스템 자원 값을 제한할 수 있고 이것은 동적으로 잡아주지 않는 다는 것을...

일단 Too Many open files 라는 오류를 잡기 위해 ulimit 으로 값을 변경해보기 시작했다.

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 128192
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 128192
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited


초기값을 확인하고 1024인 초기값은 512000 으로 변경을 해주었다.

sudo ulimit -n 512000


으로 바로 변경할 수 있다. 하지만 이렇게 할 경우 재부팅했을 경우에 설정값이 다시 처음으로 되돌아 가기 때문에 바뀌지 않게 하기 위해 설정파일을 변경해준다.

sudo vim /etc/security/limits.conf 


파일을 열어 제일아래에 아래와 같이 입력을 해준다.

*   hard    nofile  512000


모든 유저들의 open files의 설정값을 512000으로 변경하겠다는 내용이다.
*을 변경하여 특정 유저만 해당하게 설정값을 변경할 수 있다.
hard와 soft의 차이점이 soft한 제한과 hard한 제한이라고 하는대 뭔지 잘 모르겠다.


그리고 나서 다시 돌려보니 오류빈도는 확 줄었지만 서버를 오랫동안 켜두니 또 502 error를 뱉는다. (짜증난다.... 왜이러는거냐)

파일 오픈 제한값을 더 늘려보기도 했지만 비슷한 상황이였다. ulimit -a를 통해 옵션값을 보던중 max user processes 라는 영역이 보였고 해당값도 조정을 해주었다.

명령어로는

sudo ulimit -u 512000


으로 할 수 있고

*   hard    nproc   512000
*   sofr    nproc   512000


설정 파일에서는 위와 같이 item값을 nproc로 해주면 재부팅해도 계속해서 해당 값을 사용할 수 있다.

이제는 서버가 잘 돌아간다 ^0^



내가 검색능력이 부족하여 삽질하는 시간이 길었고, 인맥이 부족하여 물어볼 사람이 없었기 때문에 삽질하고 이 문제를 해결하는데 오래 걸렸다고 생각한다.

어쨋든 해결했으니 좋은것 아닌가 :)


+ Recent posts