Too many open files 해결 방법 따라하기: 우분투 ulimit 설정하기

우분투 서버에서 “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 옵션을 추가로 지정해야 하는 경우도 있습니다.

7. 자주 묻는 질문(FAQ)

Q1. ulimit 값을 너무 크게 잡아도 괜찮을까요?

A1. 무작정 크게 잡는 것보다는 서버 메모리와 실제 사용량을 고려하는 것이 좋습니다. 다만 MySQL이나 대규모 트래픽 서버에서는 기본값(1024)은 너무 낮아 문제가 되는 경우가 많아, 충분히 여유 있는 값으로 조정하는 것이 일반적입니다.

Q2. limits.conf를 수정했는데도 값이 안 바뀌어요. 왜 그런가요?

A2. systemd 기반 서비스(MySQL 등)는 별도의 LimitNOFILE 제한을 가질 수 있습니다. 이 경우 서비스 유닛 파일 또는 override 설정에서 LimitNOFILE 값을 함께 조정해야 정상 반영됩니다.
error: Content is protected !!