톰캣을 정상작동 중이지만 웹페이지가 안나오는 현상이 발생하여 서버에 접속하여 로그를 확인하니 다음 에러가 로그에서 확인할 수 있었습니다.
원인 : 현재 열린 파일의 수가 Max open files 제한을 초과한 경우 발생합니다.
ulimit -a 를 사용하여 현재 프로세스의 자원 한도를 확인합니다.
open files를 보니 1024개로 설정 된것을 확인할 수 있습니다.
2. 프로세스의 실행 후 open files 수 확인
현재 오픈된 파일의 수를 확인하려면 cat /proc/sys/fs/file-nr 를 사용하면 됩니다.
보는 방법은 오픈된 파일의 수 / 오픈되지 않은 파일의 수 / 최대 오픈 파일의 수 로 확인합니다.
오픈된 파일의 수를 자세히 알아보기 위해서 프로세스가 몇개의 파일을 열고 있는지 확인하려면
lsof -p {pid} | wc -l 를 사용합니다.
# sudo lsof -p {pid} | wc -l
/열고 있는 파일 수/
wc -l -> 라인 수를 보여주는 옵션입니다.
sudo는 일부파일의 권한 문제로 인해 참조하지 못하는 파일이 있을시 정확한 파일수를 얻을수 없기때문입니다. 문제의 프로세스 실행 후에 실시간으로 해당 명령어를 입력하여 확인합니다. 계속 증가하며 max에 도달하여 죽을 시 파일 읽는 코드에 leak문제가 있을 수 있습니다. (보통 open() 하고 close() 하지 않은 file descriptor들)
3. limit 설정 수정
ulimit -n {파일 수} 로 ulimit 를 변경할 수 있지만 세션이 끊기게 되면 설정 값이 최기화 됩니다.
# ulimit -n 4096
영구적으로 변경하고 싶다면 limits.conf을 수정하면 됩니다. 경로는 /etc/security/limits.conf 입니다.
<domain> : user명 / 모든 유저에 적용하고 싶다면 *를 사용합니다.
<type> : soft limit , hard limit 구분
<item> : open files 는 nofile, processes는 nproc등 설정하고자 하는 값을 적으면 됩니다.
<value> : 원하는 설정 값 입력합니다. 단, soft limit 값은 0부터 hard limit의 값 사이로 설정해야 합니다.
<item>의 종류 | |
core | core 파일 크기 (단위는 KB) |
data | 최대 데이터 크기 (단위는 KB) |
fsize | 최대 파일크기 (단위는 KB) |
nofile | 열 수 있는 파일의 최대 개수 |
cpu | CPU 선점 시간 (단위는 MIN) |
nproc | 프로세스의 최대 개수 |
rss | 실제 사용하는 메모리량(단위는 KB) |
maxlogins | 최대 가능한 로그인 |
<예시>
<domain> <type> <item> <value>
{user} soft nofile 4096
{user} hard nofile 4096
limits.conf 수정을 마쳤다면 수정 내용이 적용될 수 있도록 세션을 끊었다가 다시 연결해줍니다.
이상으로 errno: 24 - too many open files 에러의 해결 방법과 ulimit에 대해서 알아봤습니다.
<참고>
https://davian-lab-junwoo.tistory.com/3
OSError: [Errno 24] Too many open files
배경 파이썬 프로세스가 런타임에서 제목과 같은 에러로 종료되는 경우가 있다. 하나의 프로세스가 열고 있는 파일의 수가 Max open files 제한을 초과한 경우 발생한다. 해결방법 현재 터미널 세션
davian-lab-junwoo.tistory.com
[Linux] 5분이면 가능! ulimit 확인 및 설정 방법(feat. open files)
리눅스 시스템을 이용하다 보면 ulimit 이라는 설정을 변경해야하는 경우가 종종 발생하게 됩니다. 아마 병렬처리 프로그램이나 동시 접속자가 많은 서비스를 운영하시면 max user process 부족이나 o
joonyon.tistory.com
'일지' 카테고리의 다른 글
[Node.js] Node.js 설치 및 React 프로젝트 만들기 (0) | 2023.06.09 |
---|---|
[Visual Studio Code]Git Bash 사용하기 (0) | 2023.06.09 |
[SpringBoot] MySQL 연동하기 (0) | 2023.06.08 |
[SpringBoot] Cause: invalid source release: 17 해결 (0) | 2023.06.08 |
[SpringBoot] SpringBoot Dependency 권장 버전 확인하기 (0) | 2023.05.16 |
댓글