현상
Fd 과사용으로 인해 ERROR_CACHE_FILE_OPEN_FAILED(-1003) 에러 발생하며, DB DOWN 현상이 발생하였습니다.
원인
원인 도출과정은 아래와 같습니다.
1. oslog (/var/log/messages) 에서 fd 관련 에러 확인
/etc/sysctl.conf 파일의 file-max limit 설정값 만큼 fd가 생성되고, 그 이상의 파일 생성 불가 상황에서 아래와 같은 로그 발생합니다.
Nov 20 12:10:22 hdsodb1p systemd[54513]: Reached target Exit the Session.
Nov 20 12:10:31 hdsodb1p kernel: VFS: file-max limit 6815744 reached
Nov 20 12:10:38 hdsodb1p kernel: VFS: file-max limit 6815744 reached
SQL
복사
아래와 같이 /etc/sysctl.conf 설정합니다.
``
kernel.shmmni = 4096
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 1024 65000
vm.nr_hugepages=102400
``
SQL
복사
2. slog에서 sid 및 ilog확인
(tbsvr.out.25579 ) 497번 LGWR thread에서 THROW가 발생했고, 현재 ec에 대해서는 assert를 맞아 의도적으로 DB를 중지 시키게 됩니다.
[497] 2023/11/20 12:17:37.509 Internal Error with condition '!"error"' (tc.c:343) (pid=27574, sessid=497, tid=497, os_thr_id=27608)
...
[497] callstack dump from tbsvr_DBWR for [LGWR, 497, 27608/27574]
[497] SEE DUMP tbsvr.callstack.27574 (lwpid 27608) BY PSTACK
SQL
복사
이후 DB Down이 확인됩니다.
3. ilog 확인하여 정확한 근거 파악 (session 497의 ilog)
•
Ilog는 binary 파일로 tbiv를 통해서만 확인이 가능하며, 이때 ilog_fmtmap.bin 파일이 필요합니다.
•
Ilog는 Thread 별로 생성되며 기본 파일명은 $TB_SID-스레드ID.ilog입니다.
11/09 05:26:51.7 0-0497 tc_lgwr.:1643 requested switch 109 -> 110 (next=0001.8ce9dc30
11/09 05:26:51.7 0-0497 tc_fdpoo:1152 open (stat) failed (errno=23, Too many open files in system) (flag=010002) (filename=/dev/vx/rdsk/hdsodb_sysdg01/ctlOHDSODB_01)
11/09 05:26:51.7 0-0497 cf.c:181 control file open failed : '/dev/vx/rdsk/hdsodb_redodg02/ctlOHDSODB_01' (Input/output error)
...
11/09 05:26:51.7 0-0497 tc.c:337 TBR-24003 : Unable to read control file.
11/09 05:26:51.7 0-0497 tc.c:340 LGWR: shutdown instance due to error 24003
11/09 05:26:51.7 0-0497 tbsvr_tr:229 Internal Error with condition '!"error"' (tc.c:343)
SQL
복사
로그 스위치 요청(requested switch 109 → 110) 이후, LGWR에서 fd 부족으로 인해 control file 오픈에 실패하였습니다.
이로 인해 redo log 쓰기 작업이 모두 실패했고, 데이터 정합성 유지를 위해 의도적으로 DB가 중지되었습니다.
해결
/etc/security/limits.conf 파일 수정
•
Nofile 값을 수정합니다. Nofile 값은 1개의 process에서 사용 할 수 있는 fd 개수입니다.
•
계산식 : (WTHR_PER_PROC * ((total data files in 유) + 15)) + (tbsvr process count + 5) + 100 또는 크게 3,000,000
/etc/sysctl.conf 파일 수정
•
fs.file-max 값을 수정합니다. fs.file-max 값은 서버 전체에서 사용 할 수 있는 fd 개수입니다.
•
계산식 : (nofile 파라미터) x (WTHR_PROC_CNT + PEP_PROC_CNT) 또는 67108864
•
현재 fd 사용 개수 확인 방법 ( 리눅스 : cat /proc/sys/fs/file-nr )
참고
•
ILOG 생성 방식
ILOG는 스레드(Thread)별로 생성되며, 기본 파일명은 $TB_SID-스레드ID.ilog 형식입니다.
파일의 크기가 일정 수준에 도달하면, 기존 파일은 $TB_SID-스레드ID_날짜_일련번호.ilog 형식으로 이름이 변경되고, 새 ILOG 파일이 생성됩니다.
•
ILOG 확인 방식
예시: 17번, 33번 스레드에 대해 2025/04/16 23:00:00 ~ 04/17 00:00:00 사이의 로그를 확인하는 경우
→ 해당 구간의 로그가 17번, 33번 스레드에서 생성된 것임을 먼저 확인합니다.
•
ILOG 확인명령어
tbiv -o 1.txt -r 20250416230000 20250417000000 tbsid-17.ilg, tbsid-33.ilg
SQL
복사
•
ILOG 파라미터
NAME | 설명 |
ILOG_BACKUP_SIZE_LIMIT | backup된 ilog의 총사이즈 제한 |
ILOG_DEST | ilog 생성 경로 |
ILOG_FILE_BACKUP_ON_BOOT | 기동시 ilog backup을 만들고 기존 파일을 백업할지 여부 |
ILOG_FILE_SIZE | ilog 하나당 사이즈 제한. 해당 사이즈 이상 쌓이면 이름 변경 후 다른 파일 생성 |
ILOG_KEEP_BACKUP_ASIDE | ilog backup 사이즈를 별도로 관리할지 여부. Y 설정 시 ILOG_TOTAL_SIZE_LIMIT와 별개로 관리된다 |
ILOG_MAP | ilog 설정시 명령어 대신 파일에 리스트 지정 후 사용할 수 있는 map 파일 경로 |
ILOG_TOTAL_SIZE_LIMIT | ilog 파일 + ilog backup 합계 총 사이즈 |
USE_ILOG | ilog 사용 여부 |
•
ILOG 확인 방법
tbiv 실행으로 bin 파일인 ilog를 읽을 수 있는 형태로 변경하여 확인합니다.