본문 바로가기
컴퓨터 활용(한글, 오피스 등)/기타

TCP Keep-Alive란 무엇이고 Oracle Solaris 11.4에서 설정하는 방법

by 3604 2025. 12. 16.
728x90

 

TCP Keep-Alive 개념

TCP Keep-Alive는 장시간 유휴 상태의 TCP 연결을 활성 상태로 유지하고, 상대편의 연결 종료 여부를 감지하기 위한 메커니즘입니다.

작동 원리

  • TCP 연결이 일정 시간(tcp_keepalive_interval) 동안 데이터 전송 없이 유휴 상태이면, Keep-Alive 프로브 패킷을 상대편에 전송합니다
  • 상대편이 정상적으로 응답하면 연결이 유효한 것으로 판단하고 계속 유지합니다
  • 응답이 없으면 지정된 횟수만큼 재시도한 후 연결을 강제 종료하여 리소스를 해제합니다

사용 목적

  1. 방화벽/네트워크 장비의 세션 타임아웃 방지: 유휴 연결을 네트워크 장비가 강제로 끊지 않도록 주기적으로 트래픽 발생
  2. 데드 커넥션 감지: 상대편이 비정상 종료했을 때 빠르게 감지하여 리소스 회수
  3. 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

주요 이유

  1. 매개변수 이름 불일치: Solaris 11.4의 TCP keepalive 관련 공식 매개변수는 _keepalive_interval입니다. tcp_keepalive_cnt는 Linux 스타일의 매개변수 이름으로 Solaris에서는 사용되지 않습니다.
  2. Solaris 11.4의 새로운 지원: Solaris 11.4부터는 TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL 소켓 옵션을 애플리케이션별(per-socket)로 지원하지만, 시스템 전체 설정은 ipadm의 _keepalive_interval 매개변수를 통해 관리됩니다.
  3. 네이밍 규칙: 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