티스토리 뷰

728x90
반응형

성능은 진단 결과에 따라 드라마틱하게 향상되기도 하지만, 최적화에 투자한 시간 대비 미미한 결과를 나타내기도 한다. 이로 인해 튜닝을 보다 명확하게 진단해 낼 수 있는 다양한 백서를 출간하고, 전문 조직을 통해 대비하는 것이 일반적이다.

이번 포스팅에서는 성능 최적화를 위해 다루는 여러 분야들 중 OS Kernel Parameter 특히 tcp parameter에 대해 알아보도록 하자.

현재 amazon linux 기준 parameter로 관리되는 항목은

[root@ip-192-168-84-159 ~]# sysctl -a | wc -l
955
[root@ip-192-168-84-159 ~]# sysctl -a | grep "net.ipv4.tcp" | wc -l
75
[root@ip-192-168-84-159 ~]#

총 955개의 커널파라미터가 있고 특히 net.ipv4.tcp parameter는 총 75개가 존재한다. 물론 955개 모든 parameter가 중요하겠지만, 어플리케이션을 개발하고 운영하는 입장에서 tcp parameter가 우선시 되는 것은 어쩔 수 없는 사실이다.

각 항목들에 대해 알아보고 주요 튜닝 포인트에 대해 살펴보자.

[root@ip-192-168-84-159 ~]# sysctl -a | grep "net.ipv4.tcp"
net.ipv4.tcp_abort_on_overflow = 0
net.ipv4.tcp_adv_win_scale = 1
net.ipv4.tcp_allowed_congestion_control = reno cubic
net.ipv4.tcp_app_win = 31
net.ipv4.tcp_autocorking = 1
net.ipv4.tcp_available_congestion_control = reno cubic
net.ipv4.tcp_available_ulp = mptcp
net.ipv4.tcp_base_mss = 1024
net.ipv4.tcp_challenge_ack_limit = 1000
net.ipv4.tcp_comp_sack_delay_ns = 1000000
net.ipv4.tcp_comp_sack_nr = 44
net.ipv4.tcp_comp_sack_slack_ns = 100000
net.ipv4.tcp_congestion_control = cubic
net.ipv4.tcp_dsack = 1
net.ipv4.tcp_early_demux = 1
net.ipv4.tcp_early_retrans = 3
net.ipv4.tcp_ecn = 2
net.ipv4.tcp_ecn_fallback = 1
net.ipv4.tcp_fack = 0
net.ipv4.tcp_fastopen = 1
net.ipv4.tcp_fastopen_blackhole_timeout_sec = 0
net.ipv4.tcp_fastopen_key = 00000000-00000000-00000000-00000000
net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_frto = 2
net.ipv4.tcp_fwmark_accept = 0
net.ipv4.tcp_invalid_ratelimit = 500
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_l3mdev_accept = 0
net.ipv4.tcp_limit_output_bytes = 1048576
net.ipv4.tcp_low_latency = 0
net.ipv4.tcp_max_orphans = 65536
net.ipv4.tcp_max_reordering = 300
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_max_tw_buckets = 65536
net.ipv4.tcp_mem = 190584       254112  381168
net.ipv4.tcp_migrate_req = 0
net.ipv4.tcp_min_rtt_wlen = 300
net.ipv4.tcp_min_snd_mss = 48
net.ipv4.tcp_min_tso_segs = 2
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_mtu_probe_floor = 48
net.ipv4.tcp_mtu_probing = 0
net.ipv4.tcp_no_metrics_save = 0
net.ipv4.tcp_no_ssthresh_metrics_save = 1
net.ipv4.tcp_notsent_lowat = 4294967295
net.ipv4.tcp_orphan_retries = 0
net.ipv4.tcp_pacing_ca_ratio = 120
net.ipv4.tcp_pacing_ss_ratio = 200
net.ipv4.tcp_probe_interval = 600
net.ipv4.tcp_probe_threshold = 8
net.ipv4.tcp_recovery = 1
net.ipv4.tcp_reflect_tos = 0
net.ipv4.tcp_reordering = 3
net.ipv4.tcp_retrans_collapse = 1
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 15
net.ipv4.tcp_rfc1337 = 0
net.ipv4.tcp_rmem = 4096        131072  6291456
net.ipv4.tcp_rx_skb_cache = 0
net.ipv4.tcp_sack = 1
net.ipv4.tcp_slow_start_after_idle = 1
net.ipv4.tcp_stdurg = 0
net.ipv4.tcp_syn_retries = 6
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_thin_linear_timeouts = 0
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tso_win_divisor = 3
net.ipv4.tcp_tw_reuse = 2
net.ipv4.tcp_tx_skb_cache = 0
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_wmem = 4096        16384   4194304
net.ipv4.tcp_workaround_signed_windows = 0
[root@ip-192-168-84-159 ~]#

1) tcp window scale (권고)
- net.ipv4.tcp_window_scaling=1
- net.ipv4.tcp_adv_win_scale = n
- net.ipv4.tcp_slow_start_after_idle = 0
Bandwidth를 확장시키기 위해 Receiver Window Size를 확장해야 함.
기본 64k로 정의 되어 있는 RFC 1323을 확장하여 tcp_window_scaling을 활성화하고, TCP Heade의 window scaling 값을 2^n곱(n = 0 ~ 14)으로 확장시키는 옵션 적용. 최대 1GB까지 확장 가능.
slow_start는 1로 설정되어 있으면 특정  시간 idle 상태로 지속되면, initial congestion window size부터 다시 증가해야 하지만, 0일 경우 congestion window size가 유지됨

2) Send / Receiver 버퍼 관리
- net.ipv4.tcp_rmem = 253952 253952 16777216
- net.ipv4.tcp_wmem = 253952 253952 16777216
rmem은 receive(read) buffer의 크기, wmem은 send(write) buffer의 크기.
패킷 손실을 방지하기 위한 메모리 임계값 설정
> net.core.rmem_default=253952
> net.core.wmem_default=253952
> net.core.rmem_max=16777216
> net.core.wmem_max=16777216

3) In bound Queue 관리
- net.ipv4.tcp_max_syn_backlog=1024
syn_received 상태의 소켓을 위한 Queue
> net.core.netdev_max_backlog=30000
> net.core.somaxconn=1024
> ulimit -SHn 65535

4) TIME_WAIT 관리
- net.ipv4.tcp_max_tw_buckets = 1800000
time_wait 상태의 소켓 개수 제한 설정
설정 값을 넘어 갈 경우, TCP: time wait bucket table overflow 메시지와 함께 강제 destroy

5) TCP Timestamps
- net.ipv4.tcp_timestamps = 1
- net.ipv4.tcp_tw_reuse = 1 (옵션)
- net.ipv4.tcp_tw_recycle=1 (권고하지 않음)
tcp에서는 sequence number로 패킷의 순서를 판별함.
사용할 수 있는 local port 수가 모자라면, 현재 time_wait 상태의 소켓 중 프로토콜 상 사용해도 무방해 보이는 소켓을 재사용하도록 구성할 수 있으며, 이때 tw_reuse를 설정한다. tw_reuse를 활성화 하기 위해서는 tcp_timestamp 옵션이 활성화 되어 있어야 한다.

6) Listen 서비스 문제
- net.ipv4.tcp_abort_on_overflow = 0
Listen 서비스가 특정 이유로 인해 overflow가 발생하더라도 reset을 통해 서비스를 재기동하고, 클라이언트의 Connection도 유지하도록 하는 옵션. Listen 서비스 문제가 확인될 경우 동적으로 적용하는 것을 권고하며, 기본 값은 false.

7) ACK 재 수신
- net.ipv4.tcp_sack = 1
- net.ipv4.tcp_fack = 1
- net.ipv4.tcp_dsack = 1
- net.ipv4.tcp_syn_retries = 2
SYN 패킷 수신 후 데이터 로스가 발생 한 경우 ACK를 재주신 할 수 있도록 허용하는 옵션. 데이터 로스가 심한 네트워크 환경에서 설정 권고.
fack은 빠른 재전송, dsack은 중복 재전송을 허용하는 옵션.

8) 타임아웃 관리
- net.ipv4.tcp_fin_timeout = 15
대량의 요청이 유입될 경우 tcp_fin_timeout의 대기 시간을 줄여 FD 확보

9) TCP Socket 연결/종료 확인
- net.ipv4.tcp_orphan_retries = 0
서버 측에서 닫은 TCP 연결을 끊기 전에 확인하는 횟수 (기본값은 7로 50초에서 16분까지 소요)
- net.ipv4.tcp_retries1 = 3
- net.ipv4.tcp_retries2 = 3
RETRIES1은 연결에 문제가 있을 때 연결을 재시도하는 횟수, RETRIES2는 연결을 끊기 전에 재시도하는 횟수

10) KEEPALIVE
- net.ipv4.tcp_keepalive_intvl = 75
TCP TIME_WAIT 상태를 줄이기 위한 설정.

- net.ipv4.tcp_keepalive_probes = 9
손실된 TCP 상태 감지 시간 설정.

- net.ipv4.tcp_keepalive_time = 7200
Keep Alive 시간을 설정. Idle Timeout보다 작아야 Keepalive를 유지할 수 있음.


WAS OS Kernel 권고 Parameter

WAS Server 설치 시 OS Kernel 권고 Parameter에 대해 살펴보겠습니다.

파라미터 설명 권고값
net.ipv4.tcp_keepalive_intvl TCP TIME_WAIT 상태를 줄이기 위한 설정 15
net.ipv4.tcp_keepalive_probes 손실된 TCP 상태 감지 시간 설정 5
net.ipv4.tcp_keepalive_time keep alive 시간을 설정 30
net.ipv4.ip_local_port_range 사용할 수 있는 포트 범위를 설정 1024 - 65000
net.core.netdev_max_backlog 백로그에 들어오는 소켓 개수를 설정 2500
net.ipv4.tcp_retries1 TCP 연결에 문제가 있을 때 연결을 재시도하는 횟수 3
net.ipv4.tcp_retries2 TCP 연결을 끊기 전에 재시도하는 횟수 3
net.core.rmem_max TCP 수신 버퍼크기 최대값 설정 56777216
net.core.rmem_default TCP 수신 버퍼크기 기본값 설정 16777216
net.core.wmem_max TCP 전송 버퍼크기 최대값 설정 56777216
net.core.wmem_default TCP 전송 버퍼크기 기본값 설정 16777216
net.ipv4.tcp_window_scaling 65kb 이상의 큰 TCP 윈도우 스케일링 사용 1
net.ipv4.tcp_orphan_retries 서버 측에서 닫은 TCP 연결을 끊기 전에 확인하는 횟수
(기본값은 7로 50초에서 16분까지 소요)
0
net.ipv4.tcp_sack SYNC 패킷을 전송한 후 일부 ACK를 받지 못했을 경우 선택적으로 받지 못한 ACK 패킷을 받도록 설정
(0은 받지 않는 설정, 1은 패킷 유실이 많은 사이트에 설정)
0
net.ipv4.tcp_fin_timeout FIN 타임아웃을 시간을 줄여 FD를 빠르게 확보 15

> 반영 방법
vi /etc/sysctl.conf

# Update Kernel Parameter
net.ipv4.tcp_keepalive_time=30
net.ipv4.ip_local_port_range=1024 65000
net.core.netdev_max_backlog=2500
net.ipv4.tcp_retries1=3
net.ipv4.tcp_retries2=3
net.core.rmem_max=56777216
net.core.rmem_default=16777216
net.core.wmem_max=56777216
net.core.wmem_default=16777216
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_orphan_retries=0
net.ipv4.tcp_sack=0
net.ipv4.tcp_fin_timeout=10

vi /etc/security/limits.conf

...
apache    hard   nofile    65536
apache    soft    nofile    65536
apache    soft    npoc    2047
apache    hard   npoc    16384
#End of File

> 커널파라미터 영구적으로 적용하는 방법
ulimit –n 값 확인 (max number of open files )
- max number of open files값이 디폴트값이 1024이며, 최소 8192 이상으로 설정 권고함.
- 아래와 같이 /etc/security/limits.conf 파일에서 수정하면 영구적으로 적용된다.

[확인방법]
test:/home/nrson> ulimit -a
: (생략)
max number of open files (-n) 65536
max user processes (-u) 65536

[변경방법]
/etc/security/limits.conf를 추가하는 방법이 있다.
/etc/security/limits.conf에 아래의 내용을 추가한다.
# nofile tunning - max number of  open files
apache    hard   nofile    65536
apache    soft    nofile    65536
apache    soft    npoc    2047
apache    hard   npoc    16384

> TCP 커널 파라미터 튜닝 및 확인방법
/etc/sysctl.conf 파일을 아래와 같이 수정한다. 그리고, 바로 적용하기 위해서 root권한에서 sysctl -p 명령을 실행한다. 그러면, OS를 restart하더라도 설정한 TCP 커널 파라미터 값들이 초기화되지 않는다.
적용된 내용을 확인하는 방법은 sysctl –a 명령을 실행하면 결과값이 출력된다.

# Update Kernel Parameter
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range=1024 65000
net.core.netdev_max_backlog=2500
net.ipv4.tcp_retries1=3
net.ipv4.tcp_retries2=3
net.core.rmem_max=56777216
net.core.rmem_default=16777216
net.core.wmem_max=56777216
net.core.wmem_default=16777216
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_orphan_retries=0
net.ipv4.tcp_sack=0
net.ipv4.tcp_fin_timeout=15

 # 참고자료
http://publib.boulder.ibm.com/wasce/V1.0.1/ko/Tasks/Tuning/Linux.html

728x90
반응형