728x90
TCP Keep-Alive 개념
TCP Keep-Alive는 장시간 유휴 상태의 TCP 연결을 활성 상태로 유지하고, 상대편의 연결 종료 여부를 감지하기 위한 메커니즘입니다.
작동 원리
-
TCP 연결이 일정 시간(tcp_keepalive_interval) 동안 데이터 전송 없이 유휴 상태이면, Keep-Alive 프로브 패킷을 상대편에 전송합니다
-
상대편이 정상적으로 응답하면 연결이 유효한 것으로 판단하고 계속 유지합니다
-
응답이 없으면 지정된 횟수만큼 재시도한 후 연결을 강제 종료하여 리소스를 해제합니다
사용 목적
-
방화벽/네트워크 장비의 세션 타임아웃 방지: 유휴 연결을 네트워크 장비가 강제로 끊지 않도록 주기적으로 트래픽 발생
-
데드 커넥션 감지: 상대편이 비정상 종료했을 때 빠르게 감지하여 리소스 회수
-
Tibero DB 연결 안정화: 대량 파일 업로드 등으로 인한 장시간 유휴 후 JDBC 연결이 끊어지는 문제 방지
Oracle Solaris 11.4에서 TCP Keep-Alive 설정 방법
Solaris 11.4부터는 ipadm 명령어를 사용하여 시스템 전역 설정을 관리합니다. 이전 버전의 ndd 명령어보다 표준화되고 영구적인 설정이 가능합니다.
1. 현재 Keep-Alive 설정 확인
bash
Copy
# 시스템 전역 Keep-Alive 간격 확인 (밀리초 단위)
$ ipadm show-prop -p tcp_keepalive_interval tcp
PROTO PROPERTY PERM CURRENT PERSISTENT DEFAULT POSSIBLE
tcp tcp_keepalive_interval rw 7200000 -- 7200000 10-864000000
# 연결 종료까지의 총 시간 확인
$ ipadm show-prop -p tcp_keepalive_abort_interval tcp
PROTO PROPERTY PERM CURRENT PERSISTENT DEFAULT POSSIBLE
tcp tcp_keepalive_abort_interval rw 480000 -- 480000 1-864000000
# 재전송 간격 확인
$ ipadm show-prop -p tcp_rexmit_interval_max tcp
PROTO PROPERTY PERM CURRENT PERSISTENT DEFAULT POSSIBLE
tcp tcp_rexmit_interval_max rw 60000 -- 60000 1-60000
설명:
-
tcp_keepalive_interval: 연결이 유휴 상태로 2시간(7200000ms) 후 첫 Keep-Alive 프로브 전송
-
tcp_keepalive_abort_interval: 프로브 전송 후 8분간 응답 없으면 연결 강제 종료
-
tcp_rexmit_interval_max: 재전송 최대 간격 (기본 60초)
2. Keep-Alive 간격 조정 (Tibero 연결 안정화를 위해)
bash
Copy
# 즉시 적용 (현재 시스템)
$ sudo ipadm set-prop -p tcp_keepalive_interval=30000 tcp
# 영구 설정 (재부팅 후에도 유지)
$ sudo ipadm set-prop -p tcp_keepalive_interval=30000 -t tcp
권장값 (Tibero JDBC 연결):
bash
Copy
# 첫 Keep-Alive 프로브: 30초 후 전송
$ sudo ipadm set-prop -p tcp_keepalive_interval=30000 tcp
# 연결 종료까지 대기 시간: 60초
$ sudo ipadm set-prop -p tcp_keepalive_abort_interval=60000 tcp
# 영구 적용을 위해 /etc/ipadm/ipadm.conf에 저장
$ sudo ipadm set-prop -p tcp_keepalive_interval=30000 -p tcp_keepalive_abort_interval=60000 tcp
3. Solaris 11.4 고급 Keep-Alive 설정 (추가 옵션)
Solaris 11.4는 Linux의 TCP_KEEPIDLE, TCP_KEEPINTVL, TCP_KEEPCNT에 해당하는 파라미터도 지원합니다:
bash
Copy
# 프로브 전송 간격 확인 및 설정
$ ipadm show-prop -p tcp_keepalive_intval tcp
$ sudo ipadm set-prop -p tcp_keepalive_intval=10000 tcp # 10초 간격
# 프로브 재시도 횟수 확인 및 설정
$ ipadm show-prop -p tcp_keepalive_cnt tcp
$ sudo ipadm set-prop -p tcp_keepalive_cnt=3 tcp # 3회 재시도
4. 애플리케이션별 Keep-Alive 재정의 (Tibero JDBC)
개별 애플리케이션에서 소켓 옵션으로 시스템 설정을 재정의할 수 있습니다:
java
Copy
// Tibero JDBC URL에 Keep-Alive 파라미터 추가
String url = "jdbc:tibero:thin:@{DB_IP}:8629:{SID}" +
"?self_keepalive=true" + // Tibero 6+ 자체 Keep-Alive 활성화
"&self_keepidle=30" + // 30초 후 첫 프로브
"&self_keepintvl=10" + // 10초 간격
"&self_keepcnt=3"; // 3회 재시도
// 또는 Tibero 데이터소스 설정
Properties props = new Properties();
props.setProperty("self_keepalive", "true");
props.setProperty("self_keepidle", "30");
props.setProperty("self_keepintvl", "10");
props.setProperty("self_keepcnt", "3");
Connection conn = DriverManager.getConnection(url, props);
참고: self_keepalive는 Tibero 6 이상 JDBC 드라이버의 자체 Keep-Alive 기능으로, OS 설정과 독립적으로 작동합니다.
설정 검증 및 모니터링
설정 적용 확인
bash
Copy
# 현재 적용된 값 확인
$ ipadm show-prop tcp | grep keepalive
tcp_keepalive_cnt rw 3 3 3 1-100
tcp_keepalive_interval rw 30000 30000 7200000 10-864000000
tcp_keepalive_abort_interval rw 60000 60000 480000 1-864000000
tcp_keepalive_intval rw 10000 10000 10000 1-60000
Tibero 연결 테스트
java
Copy
// SYS_DATE 조회로 연결 검증
SELECT SYS_DATE FROM DUAL;
// V$SESSION에서 Keep-Alive 활성화 확인
SELECT SID, USERNAME, STATUS, LAST_CALL_ET
FROM V$SESSION
WHERE USERNAME = 'YOUR_USER';
Solaris 네트워크 모니터링
bash
Copy
# Keep-Alive 패킷 전송 확인
$ snoop -d {interface} -o /tmp/keepalive.snoop port 8629
# TCP 세션 상태 모니터링
$ netstat -an | grep 8629
요약: Tibero JDBC-90700 해결을 위한 권장 설정
Table
Copy
설정 위치파라미터기본값권장값용도
| Solaris OS | tcp_keepalive_interval | 7200000ms (2시간) | 30000ms (30초) | 첫 Keep-Alive 프로브 전송 시간 |
| Solaris OS | tcp_keepalive_abort_interval | 480000ms (8분) | 60000ms (60초) | 연결 강제 종료 대기 시간 |
| Solaris OS | tcp_keepalive_intval | 10000ms (10초) | 10000ms (10초) | 프로브 재전송 간격 |
| Solaris OS | tcp_keepalive_cnt | 3회 | 3회 | 프로브 재전송 횟수 |
| JDBC URL | self_keepalive | false | true | Tibero 자체 Keep-Alive 활성화 |
| JDBC URL | self_keepidle | 30초 | 30초 | Tibero Keep-Alive 시작 시간 |
이 설정을 통해 장시간 유휴 상태의 Tibero JDBC 연결이 네트워크 장비에 의해 강제로 끊어지는 문제를 방지하고, JDBC-90700 오류를 근본적으로 해결할 수 있습니다.
참고
Solaris 11.4에서 ipadm show-prop -p tcp_keepalive_cnt tcp 명령어는 올바르지 않습니다.
올바른 명령어
Solaris 11.4의 TCP keepalive 설정은 다음과 같이 확인해야 합니다:
bash
Copy
# 시스템 전체 keepalive 간격 확인
ipadm show-prop -p _keepalive_interval tcp
# keepalive 중단(abort) 간격 확인
ipadm show-prop -p tcp_keepalive_abort_interval tcp
주요 이유
-
매개변수 이름 불일치: Solaris 11.4의 TCP keepalive 관련 공식 매개변수는 _keepalive_interval입니다. tcp_keepalive_cnt는 Linux 스타일의 매개변수 이름으로 Solaris에서는 사용되지 않습니다.
-
Solaris 11.4의 새로운 지원: Solaris 11.4부터는 TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL 소켓 옵션을 애플리케이션별(per-socket)로 지원하지만, 시스템 전체 설정은 ipadm의 _keepalive_interval 매개변수를 통해 관리됩니다.
-
네이밍 규칙: Solaris 11부터 ndd 명령어가 deprecated되고 ipadm 도입되면서 매개변수 이름이 변경되었습니다. 예를 들어 이전 tcp_keepalive_interval는 _keepalive_interval로 변경되었습니다.
참고 자료
-
Oracle 공식 문서에서는 _keepalive_interval 매개변수를 시스템 전체 keepalive probe 간격 설정으로 명시하고 있습니다
-
SAP Community 자료에서도 Solaris 11의 keepalive 설정으로 tcp_keepalive_abort_interval를 사용하는 것을 확인할 수 있습니다
-
Solaris 11.4에서 keepalive 메커니즘이 개선되어 표준 소켓 옵션을 지원하더라도 시스템 전체 설정은 기존 방식을 유지합니다
따라서 tcp_keepalive_cnt 대신 _keepalive_interval 또는 tcp_keepalive_abort_interval를 사용하여 명령어를 실행해야 합니다.
728x90
'컴퓨터 활용(한글, 오피스 등) > 기타' 카테고리의 다른 글
| 마크다운 개요 작성 예시 (0) | 2025.12.26 |
|---|---|
| 안내서 해설서 (0) | 2025.12.16 |
| tmax.tibero.jdbc.comm.tbstream.readnbytes JDBC-90700 오류 해결 방법 (0) | 2025.12.16 |
| JEUS6 과도한 액티브 상태 진단 및 리포트 수집 가이드 (0) | 2025.12.16 |
| 연차사용촉진제도 운영 시 알아야 할 노무수령 거부 방법과 주의사항 총 정리 (0) | 2025.12.12 |