...
iSQL 접속이 가능한 경우
세션 수가 MAX_CLIENT 보 다 작다면 다른 원인을 살펴봐야 합니다.
아래 명령어로 task 의 수를 확인하고 task 수와 MAX_CLIENT 를 비교합니다. logon current 의 값은 생성된 task 의 수를 의미하며 세션 수 보다 클 수 있습니다.Code Block title 생선된 task 수 확인 방법 language sql iSQL> SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME = 'logon current';
세션 수가 MAX_CLIENT 보다 작고 logon current 의 값이 MAX_CLIENT 와 같거나 큰 경우 아래 두 가지가 원인일 수 있습니다
- 서비스 쓰레드가 모두 EXECUTE 상태에서 신규 접속이 발생하여 task 가 증가한 경우
- 트랜잭션 수가 TRANSACTION_TABLE_SIZE 에 도달한 상태에서 신규 접속이 발생하여 task 가 증가한 경우iSQL 접속이 불가능한 경우
생성된 task 수는 v$sysstat 의 logon current 값으로 확인할 수 있습니다. 하지만 Task pool overflow 이 발생한 상황이라면 새로운 연결이 맺어지지 않기 때문에 위 문장을 수행하지 못할 수 있습니다.
이 때는 lsof 명령으로 알티베이스 서버 프로세스의 오픈 파일 수로 task 수를 확인해야 합니다.Code Block title Linux 에서 lsof 수행 예 language bash $ lsof -p PID | grep -e IPv4 -e sock | grep -v LISTEN altibase 7494 eheejung 38u IPv4 40725257 TCP localhost:21109->localhost:36248 (ESTABLISHED) # 연결이 정상적으로 맺어진 세션, task 에 포함됨. altibase 7494 eheejung 39u IPv4 40725262 TCP localhost:21109->localhost:36249 (ESTABLISHED) altibase 7494 eheejung 40u sock 0,4 40726084 can't identify protocol # 모든 서비스 쓰레드가 EXECUTE 상태이거나 altibase 7494 eheejung 41u sock 0,4 40726576 can't identify protocol # TRANSACTION_TABLE_SIZE 초과로 연결이 실패한 경우 altibase 7494 eheejung 42u sock 0,4 40726604 can't identify protocol # can't identify protocol 항목 개수 = 모든 서비스 쓰레드가 EXECUTE 상태이거나, TRANSACTION_TABLE_SIZE 초과로 연결이 실패한 경우 남아있는 task
Solaris 의 경우 lsof 대신 pfiles 명령어를 이용해도 됩니다.
Code Block title SunOS 에서 pfiles 수행 예 language bash $ pfiles PID | grep sock sockname: AF_INET 0.0.0.0 port: 21109 # LISTEN sockname: AF_INET 127.0.0.1 port: 21109 # 연결이 정상적으로 맺어진 세션, 이것도 task 에 포함됨. sockname: AF_INET 127.0.0.1 port: 21109 sockname: AF_INET 127.0.0.1 port: 21109 sockname: AF_INET 127.0.0.1 port: 21109 sockname: AF_INET 0.0.0.0 port: 0 # 모든 서비스 쓰레드가 EXECUTE 상태이거나 TRANSACTION_TABLE_SIZE 초과로 연결이 실패한 경우, 남아있는 task. sockname: AF_INET 0.0.0.0 port: 0 sockname: AF_INET 0.0.0.0 port: 0
...