우분투 서버에서 “Too many open files” 오류가 발생하는 원인과 해결 방법을 정리했습니다. MySQL의 open_files_limit 값을 올렸는데도 효과가 없는 경우, 실제 제한은 리눅스 시스템의 ulimit(open files)에 걸려 있을 수 있습니다. ulimit 값 확인 방법부터 soft/hard nofile 차이, 재부팅 후에도 유지되도록 /etc/security/limits.conf 설정하는 방법까지 단계별로 안내합니다.
1. Too many open files 오류가 발생하는 이유
MySQL 튜닝 과정에서 open_files_limit 값을 충분히 크게 설정했는데도 경고가 계속 뜬다면, 대부분 리눅스 시스템 자체의 파일 디스크립터 제한이 원인입니다. 즉, MySQL 설정값보다 우분투의 ulimit(open files) 값이 더 낮게 잡혀 있어 MySQL이 원하는 만큼 파일을 열지 못하는 상황입니다.
2. ulimit로 현재 open files 제한 확인하기
먼저 현재 시스템에 설정된 파일 디스크립터 제한을 확인해야 합니다.
확인 명령어
ulimit -a
출력 결과에서 아래 항목을 확인합니다.
- open files (-n) 1024
이 값이 1024라면, MySQL에서 아무리 open_files_limit을 크게 잡아도 실제로는 1024개 이상 파일을 열 수 없습니다. 그래서 MySQL의 경고 메시지가 사라지지 않는 것입니다.
3. soft / hard open files 차이 이해하기
open files 제한에는 soft 값과 hard 값 두 가지가 있습니다.
- soft nofile: 일반적으로 적용되는 현재 사용 한도
- hard nofile: soft 값을 올릴 수 있는 최대 한도
예를 들어 다음과 같이 설정할 수 있습니다.
ulimit -Hn 4096
ulimit -Sn 1024
두 값을 모두 넉넉하게 설정해야 실제 서비스에서 안정적으로 동작합니다. 이 설정 역시 ulimit -a 명령어로 다시 확인할 수 있습니다.
4. ulimit 명령어 설정의 한계(재부팅 시 초기화)
ulimit 명령어로 값을 변경하면 현재 세션에서만 유효합니다.
즉, 서버를 재부팅하면 다시 기본값(예: 1024)으로 돌아가게 됩니다.
그래서 운영 서버라면 반드시 재부팅 후에도 유지되는 영구 설정을 함께 해줘야 합니다.
5. limits.conf로 재부팅 후에도 적용하기
우분투에서는 /etc/security/limits.conf 파일을 수정해 ulimit 값을 영구적으로 설정할 수 있습니다.
파일 열기
vi /etc/security/limits.conf
하단에 기본으로 주석 처리된 설정들이 보이는데, 기존 주석은 건드리지 말고 아래 내용을 추가합니다.
* soft nofile 1024000
* hard nofile 1024000
mysql soft nofile 1024000
mysql hard nofile 1024000
이렇게 설정하면
- 전체 사용자
- MySQL 계정
모두 충분한 open files 값을 사용할 수 있게 됩니다 🙂
6. 설정 후 반드시 확인해야 할 점
설정을 마쳤다면 아래 사항을 꼭 점검하세요.
- 서버 재부팅 후 ulimit -a로 값이 유지되는지 확인
- MySQL 재시작 후 open_files_limit 경고가 사라졌는지 확인
- systemd 사용 환경이라면 서비스 단위 제한이 따로 없는지도 점검
환경에 따라서는 systemd 서비스 설정에서 LimitNOFILE 옵션을 추가로 지정해야 하는 경우도 있습니다.