문서유형ㅣ장애해결
분야ㅣ관리/환경설정
적용제품버전ㅣ5SP1FS01, 5SP1FS02, 5SP1FS03, 5SP1FS04, 5SP1FS06, 6FS01, 6FS02, 6FS03, 6FS04, 6FS05, 6FS06, 6FS07, 6FS07PS, 7FS01, 7FS02, 7FS02PS
문서번호ㅣTADTS052
현상
Tibero 기동 및 운용 중 아래와 같은 메시지와 함께 open error가 발생했습니다.
open error.: Too many open files
해당 메시지는 프로세스가 열 수 있는 파일 디스크립터(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. ***********************************************************************
해결
Tibero 운영 중 nofile 제한으로 인한 오류가 발생한 경우, 다음과 같은 방식으로 조치가 가능합니다.
1. 영구 조치
/etc/security/limits.conf 파일을 수정한 후, DB를 재기동합니다.
2. 임시 조치
prlimit 명령어를 이용하여 동적으로 수정할 수 있습니다. 단, 이 방법은 프로세스 재기동 시 초기화되므로 임시 방안입니다.
재기동이 어려운 경우, 기동 중인 프로세스에 대해 prlimit 명령어를 사용하여 파일 디스크립터 제한값을 동적으로 조정할 수 있습니다.
1. 현재 설정값 확인
prlimit -p <PID>
2. 예시 출력
[tibero@mtdb01 ~]$ prlimit -p 96653 RESOURCE DESCRIPTION SOFT HARD UNITS NOFILE max number of open files 1024 4096
3. soft limit을 hard limit 수준까지 확장1
prlimit --pid 96653 --nofile=4096:4096
4. 변경 확인
[tibero@mtdb01 ~]$ prlimit --pid 96653 RESOURCE DESCRIPTION SOFT HARD UNITS NOFILE max number of open files 4096 4096
5. 오류 사례 (권한 부족)
[tibero@mtdb01 ~]$ prlimit --pid 96672 --nofile=65530:65530 prlimit: failed to set the NOFILE resource limit: 명령을 허용하지 않음
이와 같이 명령어가 실패할 경우, root 권한으로 명령을 실행해야 합니다.
참고Tibero 프로세스는 기동 시 계정의 nofile 설정 값을 참조하기 때문에, 이후 ulimit 값을 변경하더라도 이미 실행 중인 프로세스에는 적용되지 않습니다.
6. 모니터링 방법
[root@mtdb01 ~]$ pid=$(ps -ef | grep '[t]bsvr' | awk 'NR==1 {print $2}'); limit=$(prlimit -p $pid | awk '/NOFILE/ {print $(NF-1)}'); used=$(ps -ef | grep 'tbsvr' | grep -v grep | awk '{print $2}' | xargs -I {} sh -c 'ls -1 /proc/{}/fd 2>/dev/null | wc -l' | awk '{sum+=$1} END{print sum}'); available=$((limit - used)); threshold=$((limit * 5 / 100)); usage_percent=$((used * 100 / limit)); echo -e "\n\nFD Limit: $limit, Used: $used, Available: $available, Threshold(5%): $threshold, Usage: ${usage_percent}%"; [ $available -lt $threshold ] && echo " 사용 가능한 FD가 전체의 5% 미만입니다." || echo " 사용 가능한 FD가 충분합니다."
다음 명령어를 통해서 FD 값이 부족한지 여부를 확인할 수 있습니다.
AVAILABLE 이 0에 가깝고 ,
Usage가 100에 가까울수록 FD 값 조정이 필요함을 의미합니다.
의미 | 설명 | |
|---|---|---|
FD LIMIT | 파일 디스크립터(File Descriptor) 최대 개수 제한 | 해당 프로세스(tbsvr)가 열 수 있는 파일, 소켓, 파이프 등의 최대 개수. 리눅스에서는 ulimit -n 또는 prlimit 명령으로 확인 가능. 즉, 이 이상은 열 수 없음. |
Used | tbsvr 관련 프로세스들이 현재 사용 중인 파일 디스크립터 개수 | tbsvr 관련 프로세스들이 실제로 열고 있는 FD의 총합. 즉, 현재 열려 있는 파일/소켓의 개수 |
Available | 아직 열 수 있는 여유 FD 개수 | FD Limit - Used 로 계산. 현재 시스템이 추가로 열 수 있는 FD의 수. |
Threshold | 경고 기준치(전체의 5%) | 전체 FD 한도의 5%를 의미. 해당 명령어 수행시 남은 FD(Available)가 이 값보다 작으면 “5% 미만 경고” 메시지를 출력하도록 설정됨. |
Usage | 현재 사용 비율(%) | (Used ÷ Limit) × 100 으로 계산. FD 한도 대비 현재 얼마나 사용 중인지 한눈에 보여줌. |