현상
slog 로그에 아래와 같은 메시지가 출력되며, 이후 tbsql 및 클라이언트를 통한 DB 접속이 불가능한 현상이 발생합니다.
_pollset_calc(cur=16383, max=16523) failed.
event addition failure - fd=16523, flags=5, return=-1, errno=0, evt=000000014f3bbda0
SQL
복사
또한, 접속 시 TBR-2131: Generic I/O error. 오류가 발생합니다.
아래는 slog 예시입니다.
ex)
[07-30T22:39:57.808733] [FRM-222] [I] _pollset_calc(cur=16383, max=16523) failed.
[07-30T22:39:57.808852] [FRM-222] [I] event addition failure - fd=16523, flags=5, return=-1, errno=0, evt=000000014f3bbda0
[07-31T15:35:58.459412] [FRM-222] [I] _pollset_calc(cur=16383, max=16524) failed.
[07-31T15:35:58.459457] [FRM-222] [I] event addition failure - fd=16524, flags=5, return=-1, errno=0, evt=000000014f3bd310
[08-01T13:56:19.055271] [FRM-222] [I] _pollset_calc(cur=16383, max=16525) failed.
[08-01T13:56:19.055295] [FRM-222] [I] event addition failure - fd=16525, flags=5, return=-1, errno=0, evt=000000014f3be880
SQL
복사
원인
cthr(control thread)가 이벤트 추가에 실패한 상황으로, OS의 ulimit 설정에서 open files가 unlimited인 경우 Tibero 내부에서 최대 파일 디스크립터 수를 16,383으로 고정하는 현상이 발생했습니다.
이로 인해 새로 발급받은 파일 디스크립터(fd) 번호가 WPROC(Worker Process)가 알고 있는 fd 최대값보다 클 경우, 이벤트 등록 과정에서 문제가 발생합니다.
클라이언트 접속 시, 통신을 위한 이벤트 등록을 위해 WPROC(Worker Process)에서 새로운 파일 디스크립터(fd)를 발급받게 됩니다. 이후 이벤트를 등록하는 과정에서, 기존에 WPROC이 알고 있던 최대 fd 값과 현재 발급된 fd 값을 비교하는 로직이 있으며, 이 때 새로 발급된 fd 값이 이전의 최대값보다 클 경우 *epoll calc 동작이 실패하게 됩니다.
그로 인해 event 추가 실패가 발생하며, 결과적으로 DB 접속이 불가능한 상황이 이어지게 됩니다.
참고
*epoll : 리눅스에서 select 방식의 한계를 보완해 만든I/O 통지 모델입니다.
해결
ulimit의 openfiles 갯수 조정 후 재기동이 필요합니다.
/etc/security/limits.conf 파일을 수정합니다.
$ vi /etc/security/limits.conf
tibero soft nproc 65536
tibero hard nproc 65536
tibero soft nofile 65536
tibero hard nofile 65536
SQL
복사