티스토리 뷰
성능은 진단 결과에 따라 드라마틱하게 향상되기도 하지만, 최적화에 투자한 시간 대비 미미한 결과를 나타내기도 한다. 이로 인해 튜닝을 보다 명확하게 진단해 낼 수 있는 다양한 백서를 출간하고, 전문 조직을 통해 대비하는 것이 일반적이다.
이번 포스팅에서는 성능 최적화를 위해 다루는 여러 분야들 중 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
'④ 미들웨어' 카테고리의 다른 글
[Nginx Proxy] 파일 업로드 시 "Request Entity Too Large" 해결방안 (0) | 2020.04.25 |
---|---|
[JDK] OpenJDK 다운로드 (0) | 2019.01.13 |
[WEB Server] TCP 권고 Parameter (0) | 2019.01.13 |
[WAS] 각 벤더사 별 Datasource 확인 (0) | 2018.09.02 |
[WAS] 각 벤더사 별 주요 환경파일 분석 (0) | 2018.08.27 |
- Total
- Today
- Yesterday
- Architecture
- jeus
- 마이크로서비스
- Da
- k8s
- SA
- 마이크로서비스 아키텍처
- wildfly
- git
- OpenStack
- apache
- openstack tenant
- TA
- API Gateway
- 오픈스택
- MSA
- SWA
- aa
- aws
- 쿠버네티스
- JEUS6
- Docker
- nodejs
- 아키텍처
- node.js
- openstack token issue
- kubernetes
- JBoss
- JEUS7
- webtob
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |