최근 nginx 서버를 돌리는데 중간중간에 Resource temporarily unavailable 오류가 발생하는 것을 확인했다.
오류는 아래와 같았다.
이 오류를 해결하기 위해 몇가지를 시도해보았다.
1. uwsgi와 같이 사용하기 때문에 uwsgi에서 발생하는 오류인줄 알고 uwsgi가 requests를 처리 못하여 생기는 오류인줄 알고 max-requests값을 높여보았지만 효과없었다.
2. "소켓 접속 제한를 초과하여서 발생하는 오류이다."라는 또 다른 가설을 세우고 제한를 조정해보았다.
default로 설정이 되어있었으며 이 값을 10240으로 변경해주었다.
변경 후에도 큰 변화는 아니지만 오류 발생 빈도가 줄어들었지만, 여전히 오류가 발생한다.
3. Django를 nginx+uwsgi 로 해서 돌리고 있었다. 오류를 좀 더 확인하기 위해서 Django를 devserver형태로 돌렸다. 디버깅도 확인해보니 오류를 뿜어낸다.
Too many open files 라는 오류가 발생했다. 이때 알았다. 리눅스에서는 시스템 자원 값을 제한할 수 있고 이것은 동적으로 잡아주지 않는 다는 것을...
일단 Too Many open files 라는 오류를 잡기 위해 ulimit 으로 값을 변경해보기 시작했다.
초기값을 확인하고 1024인 초기값은 512000 으로 변경을 해주었다.
으로 바로 변경할 수 있다. 하지만 이렇게 할 경우 재부팅했을 경우에 설정값이 다시 처음으로 되돌아 가기 때문에 바뀌지 않게 하기 위해 설정파일을 변경해준다.
파일을 열어 제일아래에 아래와 같이 입력을 해준다.
모든 유저들의 open files의 설정값을 512000으로 변경하겠다는 내용이다.
*을 변경하여 특정 유저만 해당하게 설정값을 변경할 수 있다.
hard와 soft의 차이점이 soft한 제한과 hard한 제한이라고 하는대 뭔지 잘 모르겠다.
그리고 나서 다시 돌려보니 오류빈도는 확 줄었지만 서버를 오랫동안 켜두니 또 502 error를 뱉는다. (짜증난다.... 왜이러는거냐)
파일 오픈 제한값을 더 늘려보기도 했지만 비슷한 상황이였다. ulimit -a를 통해 옵션값을 보던중 max user processes 라는 영역이 보였고 해당값도 조정을 해주었다.
명령어로는
으로 할 수 있고
설정 파일에서는 위와 같이 item값을 nproc로 해주면 재부팅해도 계속해서 해당 값을 사용할 수 있다.
이제는 서버가 잘 돌아간다 ^0^
내가 검색능력이 부족하여 삽질하는 시간이 길었고, 인맥이 부족하여 물어볼 사람이 없었기 때문에 삽질하고 이 문제를 해결하는데 오래 걸렸다고 생각한다.
어쨋든 해결했으니 좋은것 아닌가 :)
오류는 아래와 같았다.
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^
내가 검색능력이 부족하여 삽질하는 시간이 길었고, 인맥이 부족하여 물어볼 사람이 없었기 때문에 삽질하고 이 문제를 해결하는데 오래 걸렸다고 생각한다.
어쨋든 해결했으니 좋은것 아닌가 :)
'Linux' 카테고리의 다른 글
패키지 재 설치시 설정파일이 안생길때. (0) | 2015.11.18 |
---|---|
mysql 저장소를 새로운 하드로 바꿔보자 (0) | 2015.09.22 |
[Ubuntu] 자바 설치하기 (0) | 2015.05.19 |