Linux 커 널 파라미터 최적화
Linux 시스템 에서 TCP 연결 이 끊 기 면 TIMEWAIT 상 태 는 일정 시간 유지 한 후에 야 포트 를 풀 수 있 습 니 다.동시 다발 요청 이 너무 많 을 때 대량의 TIME 가 발생 합 니 다.WAIT 상태의 연결 이 제때에 끊 기지 않 으 면 대량의 포트 자원 과 서버 자원 을 차지 합 니 다.이 럴 때 우 리 는 TCP 의 커 널 파 라 메 터 를 최적화 하여 TIMEWAIT 상태의 포트 를 제거 합 니 다.
본 고 에서 소개 한 방법 은 대량의 TIME 만 가지 고 있다.WAIT 상태의 연결 로 인해 시스템 자원 이 효과적으로 소모 되 는데, 그렇지 않 으 면 효과 가 뚜렷 하지 않 을 수 있다.netstat 명령 으로 TIME 를 찾 을 수 있 습 니 다.WAIT 상태의 연결 상태 입 니 다. 아래 의 조합 명령 을 입력 하고 현재 TCP 연결 상태 와 해당 하 는 연결 수량 을 보십시오.
#netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
이 명령 은 다음 과 같은 결 과 를 출력 합 니 다. LAST_ACK 16 SYN_RECV 348 ESTABLISHED 70 FIN_WAIT1 229 FIN_WAIT2 30 CLOSING 33 TIME_WAIT 18098
저 희 는 TIME 에 만 관심 을 가지 고 있 습 니 다.WAIT 의 개수, 여기 서 볼 수 있 습 니 다. 18000 여 개의 TIMEWAIT, 이렇게 해서 18000 여 개의 포트 를 점용 했다.포트 의 수량 이 65535 개 에 불과 하고 하 나 를 적 게 차지 하면 후계 의 새로운 연결 에 심각 한 영향 을 줄 수 있다 는 것 을 알 아야 한다.이러한 상황 에서 우 리 는 리 눅 스 의 TCP 커 널 파 라 메 터 를 조정 하여 시스템 이 TIME 를 더욱 빨리 방출 하도록 할 필요 가 있다.WAIT 연결.vim 으로 프로필 열기: \ # vim / etc / sysctl. conf이 파일 에 다음 줄 의 내용 을 추가 합 니 다: net. ipv4. tcpsyncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30
커 널 매개 변 수 를 적용 하려 면 아래 명령 을 입력 하 십시오: \ # sysctl - p
위의 매개 변수의 의 미 를 간단하게 설명 합 니 다: net. ipv4. tcpsyncookies = 1 은 SYN 쿠키 를 엽 니 다.SYN 대기 열 이 넘 칠 때 cookies 를 사용 하여 처리 합 니 다. 소량의 SYN 공격 을 예방 할 수 있 습 니 다. 기본 값 은 0 으로 닫 음 을 표시 합 니 다.net.ipv4.tcp_tw_reuse = 1 은 재 활용 을 시작 합 니 다.TIME - WIT sockets 를 새로운 TCP 연결 에 다시 사용 할 수 있 도록 합 니 다. 기본 값 은 0 입 니 다. 닫 기 를 표시 합 니 다.net.ipv4.tcp_tw_recycle = 1 은 TCP 연결 을 여 는 TIME - WAIT sockets 의 빠 른 회 수 를 표시 합 니 다. 기본 값 은 0 이 고 닫 기 를 표시 합 니 다.net.ipv4.tcp_fin_timeout 시스템 의 기본 TIMEOUT 시간 을 수정 합 니 다.
이러한 조정 을 거 쳐 서버 의 부하 능력 을 한층 더 향상 시 키 는 것 외 에 도 소 유량 정도 의 DoS, CC, SYN 공격 도 방어 할 수 있다.
또한, 만약 당신 의 연결 수 자체 가 매우 많다 면, 우 리 는 TCP 의 사용 가능 한 포트 범 위 를 최적화 하여 서버 의 병행 능력 을 한층 더 향상 시 킬 수 있 습 니 다.여전히 위 에 있 는 매개 변수 파일 에 아래 설정 을 추가 합 니 다.
net.ipv4.tcp_keepalive_time = 1200 net.ipv4.ip_local_port_range = 10000 65000 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_max_tw_buckets = 5000
이 몇 개의 매개 변 수 는 데이터 가 매우 많은 서버 에서 만 켜 는 것 을 권장 합 니 다. 현저 한 효과 가 있 을 것 입 니 다.일반적인 데이터 가 적은 서버 에 서 는 이 몇 개의 인 자 를 설정 할 필요 가 없다.net.ipv4.tcp_keepalive_time = 1200 은 keepalive 가 기 용 될 때 TCP 가 keepalive 메 시 지 를 보 내 는 빈 도 를 나타 낸다.결 성 은 2 시간 에서 20 분 으로 바 뀌 었 다.net.ipv4.ip_local_port_range = 10000 65000 은 외부 연결 에 사용 되 는 포트 범 위 를 표시 합 니 다.성 이 부족 한 상황 은 매우 작다. 32768 에서 61000 으로 10000 에서 65000 으로 바 뀌 었 다.(메모: 여 기 는 최저 치 를 너무 낮 게 설정 하지 마 세 요. 그렇지 않 으 면 정상 적 인 포트 를 차지 할 수 있 습 니 다!) net. ipv4. tcpmax_syn_backlog = 8192 는 SYN 대기 열의 길 이 를 나 타 냅 니 다. 기본 값 은 1024 이 고 대기 열의 길 이 는 8192 이 며 연결 을 기다 리 는 네트워크 연결 수 를 더 수용 할 수 있 습 니 다.net.ipv4.tcp_max_tw_buckets = 6000 표시 시스템 동시 유지 TIMEWAIT 의 최대 수량, 이 숫자 를 초과 하면 TIMEWAIT 는 즉시 제거 되 고 경고 메 시 지 를 인쇄 합 니 다.기본 값 은 180000 이 고 6000 으로 바 뀌 었 습 니 다.Apache, Nginx 등 서버 에 대해 서 는 위의 몇 줄 의 인자 가 TIME 를 잘 줄 일 수 있 습 니 다.WAIT 소켓 수 는 있 지만 Squid 에 대해 서 는 효과 가 크 지 않다.이 매개 변 수 는 TIME 를 제어 할 수 있 습 니 다.WAIT 의 최대 수량, Squid 서버 가 대량의 TIMEWAIT 끌 어 죽 여.
커 널 기타 TCP 파라미터 설명: net. ipv4. tcpmax_syn_backlog = 65536 에 기 록 된 클 라 이언 트 의 확인 정 보 를 받 지 못 한 연결 요청 의 최대 값 입 니 다.128 M 메모리 가 있 는 시스템 의 경우 부족 한 값 은 1024 이 고 작은 메모리 의 시스템 은 128 이다.net.core.netdev_max_backlog = 32768 각 네트워크 인터페이스 에서 패 킷 을 받 는 속 도 는 커 널 이 이 패 킷 을 처리 하 는 속도 보다 빠 를 때 대기 열 에 보 내 는 패 킷 의 최대 수 를 허용 합 니 다.net. core. somaxconn = 32768 웹 응용 프로그램 에서 listen 함수 의 backlog 는 기본적으로 커 널 매개 변수 인 net. core. somaxconn 을 128 로 제한 하고 nginx 가 정의 하 는 NGXLISTEN_BACKLOG 는 기본적으로 511 이기 때문에 이 값 을 조정 할 필요 가 있 습 니 다.
net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 167777216 \ # 최대 socket 읽 기 buffer, 참고 가능 한 최적화 값: 873200 net. core. wmemmax = 167777216 \ # 최대 socket 쓰기 buffer, 참고 가능 한 최적화 값: 873200 net. ipv4. tcptimestsmps = 0 시간 스탬프 는 시리 얼 번호 의 와 인 딩 을 피 할 수 있 습 니 다.1Gbps 의 링크 는 반드시 이전에 사 용 했 던 시리 얼 번 호 를 만 날 것 이다.타임 스탬프 는 커 널 로 하여 금 이러한 '이상' 데이터 패 키 지 를 받 아들 이게 할 수 있다.여 기 는 꺼 야 합 니 다.net.ipv4.tcp_synack_retries = 2 쌍 의 연결 을 열기 위해 커 널 은 SYN 을 보 내 고 앞의 SYN 에 응답 하 는 ACK 를 첨부 해 야 합 니 다.세 번 의 악수 중 두 번 째 악수 라 는 것 이다.이 설정 은 커 널 이 연결 을 포기 하기 전에 SYN + ACK 패 키 지 를 보 내 는 수량 을 결정 합 니 다.net.ipv4.tcp_syn_retries = 2 커 널 이 연결 을 포기 하기 전에 SYN 패 키 지 를 보 내 는 수량 입 니 다.net.ipv4.tcp_tw_len = 1 net.ipv4.tcp_tw_reuse = 1 재 활용 오픈.TIME - WIT sockets 를 새로운 TCP 연결 에 다시 사용 할 수 있 도록 합 니 다.
net.ipv4.tcp_wmem = 8192 436600 873200 TCP 쓰기 buffer, 참고 가능 한 최적화 값: 8192 436600 873200 net. ipv4. tcprmem = 32768 436600 873200 TCP 읽 기 buffer, 참고 가능 한 최적화 값: 32768 436600 873200 net. ipv4. tcpmem = 94500000 91500000 92700000 역시 3 개의 값 이 있 습 니 다.mem [0]: 이 값 보다 낮 으 면 TCP 에 메모리 압력 이 없습니다.net.ipv4.tcp_mem [1]: 이 값 에서 메모리 압력 단계 에 들 어 갑 니 다.net.ipv4.tcp_mem [2]: 이 값 보다 높 으 면 TCP 는 socket 분 배 를 거부 합 니 다.위 메모리 단 위 는 바이트 가 아 닌 페이지 입 니 다.참고 할 수 있 는 최적화 치 는 786432 1048576 1572864 이다.
net.ipv4.tcp_max_orphans = 3276800 시스템 에서 최대 몇 개의 TCP 소켓 이 사용자 파일 핸들 에 연결 되 지 않 습 니 다.이 숫자 를 초과 하면 연결 이 즉시 복원 되 고 경고 메 시 지 를 출력 합 니 다.이 제한 은 단지 간단 한 DoS 공격 을 방지 하기 위해 서 일 뿐, 그것 에 지나치게 의존 하거나 인위적으로 이 값 을 줄 일 수 없 으 며, 이 값 을 증가 시 켜 야 한다 (메모리 가 증가 하면).net.ipv4.tcp_fin_timeout = 30
소켓 이 이 단 에서 닫 으 라 고 요구 하면 이 매개 변 수 는 FIN - WAIT - 2 상 태 를 유지 하 는 시간 을 결정 합 니 다.엔 드 에 오류 가 발생 할 수 있 으 며 연결 을 영원히 닫 지 않 을 수 있 으 며, 심지 어 는 의외로 컴퓨터 에 있 을 수도 있다.결 성 치 는 60 초 입 니 다.2.2 커 널 의 보통 값 은 180 초 입 니 다. 이 설정 을 누 를 수 있 습 니 다. 그러나 기억 해 야 할 것 은 기계 가 가 벼 운 WEB 서버 라 하 더 라 도 대량의 소켓 으로 인해 메모리 가 넘 칠 위험 이 있 습 니 다. FIN - WAIT - 2 의 위험성 은 FIN - WAIT - 1 보다 작 습 니 다. 최대 1.5K 메모리 만 먹 을 수 있 지만 생존 기간 이 길 기 때 문 입 니 다.
이러한 최적화 설정 을 거 친 후에 서버 의 TCP 병행 처리 능력 이 현저히 향상 될 것 입 니 다.이상 의 배 치 는 참고 로 생산 환경 에 사용 되 므 로 자신의 실제 상황 에 따라 하 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.