tcp_deferred_ack_interval


요청하는 클라이언트와 응답하는 서버 사이에서 TCP ACK 신호를 지연하기 위한 시간을 설정하는 파라메터.


TCP 3 handshake에서 요청 서버 A에서 SYN을 보내면 서비스 하는 서버인 B에서는 SYN ACK를 보내게 된다. 다시 서버 A는 이를 확인한 후 ACK를 보낸 후 데이터를 전송한다.


ACK 지연은 서버 A에서 서버 B로 데이터를 보내기 전에 ACK를 보내는 것을 지연한다는 것이다. , 데이터에 대한 ACK를 바로 보내지 않고 상대편 TCP로 보낼 데이터가 있을 경우 데이터와 함께 ACK를 보낼 수 있도록 일정시간 ACK 전송을 지연시키는 기능이다. 실시간으로 조회하는 데이터라면 이 값을 조절하면 어느 정도 효과를 볼 수 있다. 주의해야 할 것은 이 값을 500 millisecond(1/1000 )이상의 값은 설정을 하지 않는 것이 좋다. 그 이유는 지연 시간을 너무 길게 줄 경우 상대방 측에서 데이터를 인식하는데 그 만큼 늦어 질 수 있다는 것이다. 이 파라메터의 기본값은 100 millisecond이며, 가용 가능한 값의 범위는 1millisecond~1minute이다.


tcp_deferred_acks_max


ACK 생성되기 전에 리모트에 수신되는 TCP 세그먼트의 대수(이 최대 세그멘트의 단위는 개별적인 접속에 대한 MSS(Maximum Segment Size). 이 값이 0 또는 1로 설정되면, ACK는 지연되지 않으며, 모든 세그멘트들이 1MSS 긴 것으로 추측한다. 기본값은 8이며, 값의 범위는 0 ~ 16이다.


tcp_wscale_always


1로 설정되면 TCP SYN 세그멘트에 window 스케일(scale) 옵션을 항상 같이 전송한다. 파라메터가 0으로 설정되어 있더라도 윈도우 크기가 옵션으로 설정된 SYN 세그멘트를 수신하게 되면 window scale를 옵션으로 넣은 SYN 세그멘트를 응답한다. 기본값 0(disabled)이며, 값의 범위는 0(disabled), 1(enabled)이다.


tcp_tstamp_always


1로 설정되면 TCP SYN 세그멘트에 timestamp 옵션을 항상 같이 전송한다. 파라메터가 0으로 설정되어 있더라도 윈도우 크기가 옵션으로 설정된 SYN 세그멘트를 수신하게 되면 timestamp 옵션으로 넣은 SYN 세그멘트를 응답한다. 기본값은 0(disabled)이며, 값의 범위는 0(disalbed), 1(enabled)이다.


tcp_xmit_hiwat


초기 송신 윈도우 크기를 설정(byte단위), 기본값은 16384 byte이며, 값의 범위는 4096~1,073,741,824이다.


tcp_xmit_lowat


select(3N) 또는 poll(2) call이 연결된 파일 지시자(File description)에 대해 기록 가능한 것을 리턴할 때까지 TCP 송신 버퍼 내에 사용 가능해야만 하는 데이터 양을 결정할 때 사용한다. 이 값은 튜닝하지 않고 기본값을 사용할 것을 권장한다. 기본값은 4096이다.


tcp_recv_hiwat


초기 수신 윈도우 크기를 설정(byte단위), 기본값은 24,576이며, 보통 16K 이상을 사용한다. 값의 범위는 2,048~1,073,741,824이다.


tcp_recv_hiwat_minmss


수신 윈도우 크기의 최소값 지정할 때 사용(단위:byte),기본값은 __이며, 값의 범위는 1~65,536이다.


tcp_max_buf


TCP버퍼의 최대 크기를 설정(단위 byte) , 송수신하는 버퍼 크기를 크게 설정할 수 있으며, 기본값은 1,048,576이며, 값의 범위는 8,192~1,073,741,824이다. 보통 네트워크의 속도가 빨라지면 그것에 비례하여 값을 증가 시켜서 사용하는 것이 좋다.


tcp_cwnd_max


TCP 정체 윈도우(congestion window : cwnd)의 최대값을 설정(단위 : byte)한다. 기본값은 1,048,576이며, 값의 범위는 128~1,073,741,824이다.


tcp_slow_start_initial


TCP 접속의 MSS에 있어서 초기 cwnd의 최대 수 기본값은 4이며, 값의 범위는 1~4이다.


tcp_slow_start_after_idle


한번 RTO(Retransmission timeout) 동안 idle(세그멘트를 수신하지 않음) 상태 후에 정체 윈도우의 크기로서, 기본값은 4이며, 값의 범위는 1~16,384이다.


tcp_sack_permitted


만약 2로 설정되면, TCP SACK(selective acknowledgement) 허용 옵션이 포함된 SYN 세그멘트를 전송한다. 1로 설정되면 TCP SYN 세그멘트와 함께 SACK-허용 옵션을 수신하고, TCP SACK 허용 옵션으로 응답한다. 0으로 설정되면, 들어오는 세그멘트에 SACK 허용 옵션을 따지지 않고 포함되지 않는 것으로 간주하여, TCP SACK 허용 옵션을 보내지 않는다. 기본값은 2(active enabled)이며, 설정할 수 있는 값은 0(disabled), 1(enabled)m 2(active enabled)이다.


tcp_rev_src_routes


(기본-disable)이면, TCP는 보안상의 이유로 인하여 들어오는 연결에 대해 IP 소스 라우팅 옵션(source routing option)에 예약을 하지 않는다. 1(enalbe)로 설정되면, TCP는 일반적인 소스 라우팅을 예약한다.


tcp_time_wait_interval


솔라리스 2.6이전까지는 tcp_close_wait_interval 라는 파라메터를 사용하였다. 이 파라메터는 TCP 연결이 종료 되었을 때, TIME_WAIT 상태의 TCP 세션을 일정 기간 동안 메모리에 대기 상태로 남아있게 한다.  그 이유는 TCP 세션은 끊어졌지만 바로 재접속을 하려고 할 때에는 연결을 위한 새로운 세션으로 연결이 이루어지는 것이 아니라, 메모리에 있는 세션의 정보를 가지고 연결이 이루어지기 때문에 빠른 연결이 가능해진다.


tcp_time_wait_interval TIME_WAIT 상태의 종료된 TCP 소켓이 메모리에 남아 있는 시간이며, 해당 시간이 지나야 소켓은 다시 사용될 수 있다. 기본값은 240,000ms(4)이지만, 이는 tcp 소켓을 많이 요구하는 서버, 즉 웹 서버에서는 너무 길게 기다리게 하는 것은 메모리 낭비이므로 60,000ms(1) 정도의 크기로 줄이는 것이 좋다. 그리고, 많은 수의 TIME_WAIT 소켓 상태가 유지되면 메모리 낭비뿐만 아니라 CPU 재원이 낭비될 수 있다.(큐관리때문), 그러나 외부 서비스 환경에서 이를 너무 줄일 경우, 커넥션 품질 자체가 불안할 수 있으므로 더 이상 줄이지 않는 것이 바람직하다. LAN 환경인 경우, 60,000ms보다 적게 잡을 수 있다.


         



 


 


TCP 연결 단계 중 TIME_WAIT 단계를 유지하는 시간, 마지막 FIN에 대한 ACK를 보낸 뒤 상대방이 패킷을 수신했는지 확인 할 수 없으므로 이 파라메터에 설정된 시간만큼 기다렸다가 연결을 닫게 한다. close). 기본값은 240000millisecond(4), 값의 범위는 1~10분이다.


tcp_conn_req_max_q


이 파라메터는 완전한 연결을 위한 큐의 크기를 지정한다.


Three-way handshake가 완료된 연결이 접근되기까지 대기하고 있는 큐의 크기를 나타낸다. netstat s P tcp 명령 결과값 중 tcpListenDropQ 0이상 값을 보이는 경우, 해당 큐로 들어가지 못하고 Drop 된 연결이 있음을 나타내므로 tcp_conn_req_max_q의 값을 증가시킬 필요가 있다.


웹 서버와 같이 TCP 연결이 많이 사용되는 서버환경에서 가장 많이 튜닝되는 파라메터이다. 기본값은 128이고 증가 시킬 때는 보통 tcp_conn_req_max_q0값까지 증가시킨다. accept()에 의해 받아들여 지기를 기다리며 대기하고 있는 TCP 연결의 최대 개수라 할 수 있다. 기본값은 128이고, 값의 범위는 1 ~4,294,967,296이다.


tcp_conn_req_max_q0


클라이언트와 서버 TCP는 데이터를 전송하기 전에 Three-Way Handshake 과정을 통해 가상 커넥션을 생성하고 Three-Way Handshake 과정이 완료되었을 때, TCP Established 상태를 갖게 된다. Three-Way Handshake 과정 중 클라이언트로부터 마지막 ACK가 오기를 기다리는 SYN_RCVD 상태의 TCP 연결 상태를 갖는다고 한다. tcp_conn_req_max_q0 파라메터는 마지막 ACK를 받지 못한 상태의 half-open 상태의 커넥션이 대기하는 완전하지 못한 연결 큐의 크기를 지정하는 TCP 파라메터이다.


기본값은 1024이며, netstat s P top 명령 결과값 중 tcpListenDropQ0 tcpHalfOpenDrop 등이 0이상 값을 보이는 경우, 해당 큐로 들어가지 못하고 Drop 된 연결이 있음을 나타내므로 tcp_conn_req_max_q0 파라메터의 값을 증가시킬 필요가 있다. 또한 SYN 플러딩(flooding)에 대비하여 보호하기 위해 해당 파라메터를 증가시킬 수 있다. tcpHalfOpenDrop 값이 보이는 경우 SYN flood를 의심해 볼 수 있다. Three-way-handshake가 아직 완료되지 않아 기다리고 있는 TCP 연결의 최대 수를 의미한다.


기본값은 1024이며, 값의 범위는 0~4,294,967,296이다.


tcp_conn_req_min


받아들여(accept)지기를 기다리는 리스너(listener)에 대해 표류중인 TCP 연결의 최대 수에 대한 기본적인 최소 값을 의미한다.


기본값은 1이며, 값의 범위는 1~1024이다.


tcp_conn_hash_size


모든 TCP 연결에 대해 TCP 모듈에 있는 해시 테이블 크기를 조절한다. 이 테이블은 TCP 세션에 대한 것이라 할 수 있다. 이 테이블은 서비스 용도에 따라 커질 수도 있고 작아 질 수도 있다. 만약, 이 테이블이 너무 크다면 TCP세션은 이 테이블에서 검색(search)하는데 많은 자원을 낭비할 수 있다. 그러나, 시스템의 성능 향상에 따라 서비스에 따른 세션이 증가한다면 이 테이블의 크기를 늘려주면 어느 정도 향상된 서비스를 기대할 수도 있다. 이 파라메터의 값은 512이며, 값의 범위는 512~1,073,741,824이다.(시스템 부팅과정에서 적용).


ipc_tcp_conn_hash_size


활동중인 모든 TCP 연결(ESTABLISHED 상태)에 대한 IP모듈의 해시 테이블의 크기를 제어한다. 기본값은 512이며, 값의 범위는 512~2,147,483,648이다.(시스템 부팅과정에서 적용).


tcp_ip_abort_interval


TCP 연결에 대하여 전체 재전송 타임아웃 기본 값(timeout value)을 설정한다.(milliseconds 단위). 주어진 TCP 연결에 대하여 TCP가 이 파라메터에 주어진 값 간격으로 재전송을 한다면, 주어진 시간 간격으로 TCP가 연결을 끝내는 동안에 다른 곳으로부터 오는 ACK를 받지 못할 것이다. , TCP연결(Established 상태) RESET 세그먼트를 보내기 전에 설정하는 재전송 하는 최대 시간이라 할 수 있다. RTO(TCP retransmission timeout) tcp_rexmit_interval_max로서 계산이 되므로, 임의적으로 변경을 하지 않는다. 기본값은 8(480000millisecond)이면 값의 범위는 500millisecond 에서 1193hours이다.


tcp_ip_abort_cinterval


연결을 맺기 위한 Three-way Handshake 프로세스가 이 파라메터에 주어진 시간 동안 완료되지 않으면 RESET 세그먼트가 보내진다. 빠른 네트워크에선 SYN flood 공격을 피하기 위해 10000ms 이하의 값을 설정할 수 있다. 기본값은 180000millisecond 이다.


         



tcp_rexmit_interval_initial


TCP 연결을 위한 RTO(Retransmission Timeout) 기본 값을 설정한다. TCP 데이터가 전송된 후, tcp_rexmit_interval_initial 파라메터에서 정의한 시간 동안 응답 패킷을 받지 못하는 경우, 첫 번째 재전송이 이루어진다. 서버와 클라이언트가 동일 LAN에 위치하는 경우 500ms 이하의 시간을 지정할 수 있으며, 외부적인 환경 서버인 경우 2000ms 이상을 권장한다. 기본값은 3(3000milliseconds)이며, 값의 범위는 500millisecond ~ 1193 hours이다.


 



tcp_rexmit_interval_max


재전송 간격 중 지수 백오프 알고리즘(Exponential backoff algorithm)을 위해 사용된다. tcp_rexmit_interval_max는 두 개의 재전송 사이에 최대 허용된 wait 시간을 나타낸다.


재전송 사이의 최대 wait 인터벌을 가리키는 해당 파라미터는 tcp_ip_abort_interval보다 작아야 한다.


RFC1122 문서에서 권장하는 값은 240000ms 이며, 경우에 따라 tcp_time_wait_interval 1~2배 정도의 값을 설정하도록 권장한다. 기본값은 6(60000 millisecond)이며, 값의 범위는 1millisecond ~ 20 seconde이다.


tcp_rexmit_interval_min


첫번째 재전송 후, 뒤따르는 재전송은 tcp_rexmit_interval_min 이후 시작된다. 기본값은 400millisecond이며, 값의 범위는 1 millisecond~20seconds이다.


tcp_smallest_nonpriv_port


시스템에서 지정된 포트 이외에 사용자가 사용하는 포트의 시작 값을 설정한다. 기본값은 1024이다. , 1024포트 이전까지는 시스템에서 사용하는 포트 번호라 할 수 있다.


tcp_smallest_anon_port


TCP UDP에 의해 사용되는 포트 번호(port number) unsigned 16비트 short 0~65535까지의 범위를 갖는다.


이중 NIC와 같은 기관에 등록된 특정한 서비스를 위한 port 0~1023가 미리 예약되어 있다. 이러한 포트를 가리켜 Well-Known 포트라고 한다. 일반적인 클라이언트 프로세스들은 시작될 때, OS로부터 임의의 포트를 할당 받으며, 포트 번호는 tcp_smallest_anon_port 파라미터에 설정된 값 이상을 갖게 된다. 클라이언트 프로세스에게 할당해줄 포트 번호가 부족할 수 있는 매우 바쁜(busy)시스템 환경에선 해당 파라미터의 값을 8192로 설정해 줄 수 있다. 기본값은 32768이다.


tcp_keepalive_interval


많은 TCP 어플리케이션은 살아 있는(keep alive)기능을 off시켜 놓고 있으며, 일부 어플리케이션만이 살아 있는 기능을 사용하고 있다. 해당 파라미터는 살아 있는 기능을 사용하는 어플리케이션을 위해 사용된다. 해당 시간 간격으로 keep-alive probe 를 보내어 TCP연결 상태를 체크하게 된다. 이 기능의 사용여부는 어플리케이션에 의해 결정되며, 많은 어플리케이션은 기본적으로 keep-alive-probe를 사용하지 않고 있다. HTTP/1.0이후 Keep-alive 기능이 사용되고 있으며, Keep-alive time이 만료되지 않았다면, 해당 TCP 연결을 통해 여러 개의 requests 를 처리한다. HTTP Keep-alive timer를 어플리케이션 레벨에서 정의하여 사용하고 있다. TCP에서 제공하는 tcp_keepalive_interval 파라미터의 기본값은 7200000(2시간)ms이며, 최소 10000ms까지 지정 가능하다.


tcp_fin_wait_2_flush_interval


서버가 TCP 연결을 끊는 요청을 받아 들일 때, FIN 비트가 설정된 패킷을 클라이언트에게 보내고, 클라이언트는 이에 응대하여 ACK 비트가 설정된 패킷을 서버에게 보낸다. 그리고, 클라이언트는 FIN비트가 설정된 비트를 서버에게 보낸다. 서버는 이에 대하여 ACK 설정된 패킷으로 응대를 함으로써 연결이 끊어진다. 이때, 서버가 클라이언트로부터 ACK패킷을 받고, 연결이 끊어지기 이전에 FIN 비트로 설정된 패킷을 기다리는 상태를 FIN_WAIT_2 상태라 한다( TCP connection termination 과정 그림 참조). HTTP/1.0 compliant Web 서버와 Proxies 은 각 트랜잭션 후, 서버단에서 주도적으로 Connection을 종료하게 된다.


        




tcp_fin_wait_2_flush_interval 파라메터는 시스템이 TCP 연결을 영원히 FIN_WAIT_2 상태에 있는 것을 방지하기 위해 사용된다. 


상대편으로부터 마지막 FIN이 오지 않는 경우, FIN_WAIT_2상태의 TCP 연결은 tcp_fin_wait_2_flush_interval 파라메터에 정의된 시간 이후,FIN_WAIT_2상태는 TIME_WAIT 상태로 변환된다. 기본 값과 권장 값은 675000millisecond이다. netstat f inet: 명령어 결과에서 FIN_WAIT_2 상태에 있는 많은 연결이 보이는 경우 간격을 줄일 필요가 있다.


상대편으로부터 마지막 FIN 패킷이 올 때까지의 TCP 상태를 Half close 상태로 표현한다. Half-close 상태에선 상대편이 보낸 데이터를 여전히 받을 수 있는 상태이다.


tcp_fin_wait_2_flush_interval의 값을 너무 작게 잡는 경우 Half-close 상태의 주기가 너무 짧기 때문에 상대편이 보낸 데이터를 처리 못할 수도 있으므로 주의할 필요가 있다.


#netstat na |grep FIN_WAIT |wc -|


이 결과 수치가 많이 나올 때에는 시스템에 많은 부하를 주어 새로운 연결이나 기존 연결 세션에 대해 데이터 전송이 느릴 수 있으므로 이 파라메터의 값을 줄인다.

By haisins

오라클 DBA 박용석 입니다. haisins@gmail.com 으로 문의 주세요.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다