Linux 커 널 파 라 메 터 를 최적화 하여 서버 병행 처리 능력 을 향상 시 킵 니 다.

본문http://www.ha97.com/4396.html
PS:서버 하드웨어 자원 의 한도 가 제 한 된 상황 에서 서버 의 성능 을 최대한 착취 하고 서버 의 병행 처리 능력 을 향상 시 키 는 것 은 많은 운영 기술자 들 이 생각 하 는 문제 입 니 다.Linux 시스템 의 부하 능력 을 향상 시 키 려 면 nginx 등 네 이 티 브 병행 처리 능력 이 강 한 웹 서버 를 사용 할 수 있 습 니 다.아파 치 를 사용 하면 Worker 모드 를 사용 하여 병행 처리 능력 을 향상 시 킬 수 있 습 니 다.그 밖 에 비용 절감 을 고려 한 상황 에서 리 눅 스 의 커 널 관련 TCP 인 자 를 수정 하여 서버 성능 을 최대한 향상 시 킬 수 있다.물론 가장 기본 적 인 부하 향상 문 제 는 서버 하드웨어 를 업그레이드 하 는 것 이 가장 근본 적 인 것 이다.
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.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
위의 매개 변수의 의 미 를 간단하게 설명 합 니 다.
net.ipv4.tcp_syncookies=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-WIT sockets 의 빠 른 회 수 를 표시 합 니 다.기본 값 은 0 입 니 다.닫 기 를 표시 합 니 다.net.ipv4.tcp_fin_timeout\#시스템 을 수정 합 니 다.기본 TIMEOUT 시간 입 니 다.
이러한 조정 을 거 쳐 서버 의 부하 능력 을 한층 더 향상 시 키 는 것 외 에 도 소 유량 정도 의 DoS,CC,SYN 공격 도 방어 할 수 있다.
또한,만약 당신 의 연결 수 자체 가 매우 많다 면,우 리 는 TCP 의 사용 가능 한 포트 범 위 를 최적화 하여 서버 의 병행 능력 을 한층 더 향상 시 킬 수 있 습 니 다.여전히 위 에 있 는 매개 변수 파일 에 아래 설정 을 추가 합 니 다#sysctl -p\#이 몇 개의 매개 변 수 는 데이터 가 매우 많은 서버 에서 만 켜 는 것 을 권장 합 니 다.현저 한 효과 가 있 을 것 입 니 다.일반적인 데이터 가 적은 서버 에 서 는 이 몇 개의 인 자 를 설정 할 필요 가 없다.
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.tcp_max_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 = 8388608net.core.rmem_default = 8388608net.core.rmem_max = 16777216           #최대 socket 읽 기 buffer,참고 가능 한 최적화 값:873200 net.core.wmemmax = 16777216           #최대 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 = 1net.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 병행 처리 능력 이 현저히 향상 될 것 입 니 다.이상 의 배 치 는 참고 로 생산 환경 에 사용 되 므 로 자신의 실제 상황 에 따라 하 십시오.

좋은 웹페이지 즐겨찾기