Nginx 프론트 프 록 시 할 때 TIME질문

6525 단어 nginx
우리 의 DSP 시스템 은 현재 기본적으로 새벽 이 아 닌 QPS 가 10W 이상 입 니 다. 우 리 는 Golang 을 사용 하여 이 HTTP 요청 을 처리 합 니 다. 웹 서버 의 전단 은 Nginx 로 부하 균형 을 이 루 고 Nginx 의 proxy 를 통 해패스 는 Golang 과 상호작용 을 합 니 다.
nginx 에이전트 가 짧 은 링크 방식 과 백 엔 드 의 상호작용 을 사용 하기 때문에 시스템 TIMEWAIT 의 tcp 연결 이 많 습 니 다:
shell> netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
TIME_WAIT 250263
CLOSE_WAIT 57
FIN_WAIT2 3
ESTABLISHED 2463
SYN_RECV 8

ss 는 netstat 보다 빠 르 기 때문에 아래 명령 으로 볼 수 있 습 니 다.
shell> ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}'

이것 은 시스템 의 과도 한 포트 를 점용 하고 시스템 자원 을 낭비 하기 때문에 우 리 는 TIME 를 줄 일 방법 을 강구 해 야 한다.WAIT。
TIME_WAIT 로 인해 과도 한 포트 를 점용 하 는 영향 중 하 나 는 우리 가 사용 해 야 할 포트 를 점용 하 는 것 이다. 예 를 들 어 서비스 감청 포트 가 8012 이 고 재 부팅 할 때 포트 가 점용 되 었 음 을 알려 준다.보기 / proc / sys / net / ipv 4 / iplocal_port_range 는 설 정 된 Linux 커 널 자동 분배 포트 의 포트 범 위 를 알 수 있 습 니 다.
shell> cat /proc/sys/net/ipv4/ip_local_port_range
1025 65535

이 설정 시스템 은 1025 ~ 65535 범위 내 에서 랜 덤 으로 포트 를 분배 하여 연결 에 사용 합 니 다. 저희 서비스의 8012 포트 는 이 범위 안에 있 기 때문에 8012 가 시스템 에 의 해 분배 되 어 사용 되면 저희 서 비 스 를 시작 할 때 알림 포트 가 점용 됩 니 다.
그래서 설정 / proc / sys / net / ipv 4 / iplocal_reserved_ports 는 시스템 이 우리 에 게 어떤 포트 를 미리 남 겨 두 었 는 지 알려 줍 니 다. 자동 분배 에 사용 할 수 없습니다.
shell> vim /etc/sysctl.conf
net.ipv4.ip_local_reserved_ports = 8012,11211-11220

shell> sysctl -p

예약 포트 에 대한 더 구체 적 인 정 보 는 참고 할 수 있 습 니 다.
  • 네트워크 포트 예약
  • 예약 포트 ip 점용 방지local_reserved_ports

  • 위 에서 우 리 는 포트 점용 문 제 를 해결 하 였 으 나, 우 리 는 TIME 를 해결 해 야 한다.WAIT 과 다 한 문제.Nginx 1.1 이상 버 전의 upstream 은 keep - alive 를 지원 하기 때문에 우 리 는 Nginx proxy 의 keep - alive 를 켜 서 tcp 연결 을 줄 일 수 있 습 니 다.
    upstream http_backend {
        server 127.0.0.1:8080;
    
        keepalive 16;
    }
    
    server {
        ...
    
        location /http/ {
            proxy_pass http://http_backend;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            ...
        }
    }

    Nginx 의 공식 문서 에 참가 할 수 있 습 니 다:  http://nginx.org/cn/docs/http/ngx_http_upstream_module.html#keepalive
    keep - alive 를 켜 고 TIMEWAIT 현저히 감소:
    shell> netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
    TIME_WAIT 12612
    CLOSE_WAIT 11
    FIN_WAIT1 4
    FIN_WAIT2 1
    ESTABLISHED 7667
    SYN_RECV 3

    또 많은 글 에서 TIME 를 줄 이기 위해 시스템 의 / etc / sysctl. conf 설정 을 수정 할 수 있다 고 언급 했다.WAIT tcp 연결:
    net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1
    참조:  http://blog.s135.com/post/271/
    하지만 tcp 오픈tw_recycle 는 불안정 한 네트워크 문 제 를 가 져 올 수 있 으 니 참고 하 시기 바 랍 니 다.
  • TIMEWAIT 네트워크 고장
  • 다시 TIMEWAIT

  • sysctl 관련 설정 에 대한 설명 은 다음 을 참고 하 십시오. https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
     
    참고 글:
  • 부분 네트워크 커 널 파라미터 설명
  • http://performancewiki.com/linux-tuning.html
  • tcp 프로 토 콜 timestamp 필드 문제 분석
  • http://www.lognormal.com/blog/2012/09/27/linux-tcpip-tuning/

  • 좋은 웹페이지 즐겨찾기