현상
Tibero 기동 및 운용 중 아래와 같은 메시지와 함께 open error가 발생했습니다.
open error.: Too many open files
SQL
복사
해당 메시지는 프로세스가 열 수 있는 파일 디스크립터(File Descriptor)의 개수가 시스템 설정값을 초과했을 시 발생했습니다.
원인
Tibero 6 이하 버전의 설치 가이드에서는 기본적으로 계정의 nofile 설정값을 아래와 같이 안내하고 있습니다:
•
Soft limit: 1024
•
Hard limit: 2048
이 설정을 유지한 채 시간이 지나면서 데이터파일의 개수가 점차 증가하게 되면, 설정된 nofile 값을 초과하게 되어 오류가 발생할 수 있습니다.
예를 들어, soft limit이 1024로 설정된 경우 약 100개 정도의 데이터파일을 추가하는 것만으로도 오류가 재현되는 사례가 있습니다.
테스트 방법
아래는 open error.: Too many open files 발생하는 예시입니다.
BEGIN
FOR i IN 1..100 LOOP
EXECUTE IMMEDIATE 'ALTER TABLESPACE usr ADD DATAFILE SIZE 1M';
END LOOP;
END;
***********************************************************************
* Warning:
* Current maximum number of open files = 1024
* Required maximum number of open files for Tibero process = 1026
Recommend adjusting maximum number of open files.
***********************************************************************
***********************************************************************
* Warning:
* Current maximum number of open files = 1024
* Required maximum number of open files for Tibero process = 1036
Recommend adjusting maximum number of open files.
***********************************************************************
SQL
복사
해결
Tibero 운영 중 nofile 제한으로 인한 오류가 발생한 경우, 다음과 같은 방식으로 조치가 가능합니다.
1. 영구 조치
/etc/security/limits.conf 파일을 수정한 후, DB를 재기동합니다.
2. 임시 조치
prlimit 명령어를 이용하여 동적으로 수정할 수 있습니다. 단, 이 방법은 프로세스 재기동 시 초기화되므로 임시 방안입니다.
재기동이 어려운 경우, 기동 중인 프로세스에 대해 prlimit 명령어를 사용하여 파일 디스크립터 제한값을 동적으로 조정할 수 있습니다.
1. 현재 설정값 확인
prlimit -p <PID>
SQL
복사
2. 예시 출력
[tibero@mtdb01 ~]$ prlimit -p 96653
RESOURCE DESCRIPTION SOFT HARD UNITS
NOFILE max number of open files 1024 4096
SQL
복사
3. soft limit을 hard limit 수준까지 확장
prlimit --pid 96653 --nofile=4096:4096
SQL
복사
4. 변경 확인
[tibero@mtdb01 ~]$ prlimit --pid 96653
RESOURCE DESCRIPTION SOFT HARD UNITS
NOFILE max number of open files 4096 4096
SQL
복사
5. 오류 사례 (권한 부족)
[tibero@mtdb01 ~]$ prlimit --pid 96672 --nofile=65530:65530
prlimit: failed to set the NOFILE resource limit: 명령을 허용하지 않음
SQL
복사
이와 같이 명령어가 실패할 경우, root 권한으로 명령을 실행해야 합니다.
참고
Tibero 프로세스는 기동 시 계정의 nofile 설정 값을 참조하기 때문에, 이후 ulimit 값을 변경하더라도 이미 실행 중인 프로세스에는 적용되지 않습니다.