linux에서 최대 tcp / ip 연결 수 늘리기


Answers

최대 연결 수는 클라이언트와 서버 측면에서 다소 차이가 있지만 특정 제한 사항의 영향을받습니다.

클라이언트 측 : ephermal 포트 범위를 늘리고 tcp_fin_timeout 줄입니다.

기본값을 확인하는 방법은 다음과 같습니다.

sysctl net.ipv4.ip_local_port_range
sysctl net.ipv4.tcp_fin_timeout

ephermal port 범위는 호스트가 특정 IP 주소에서 생성 할 수있는 최대 아웃 바운드 소켓 수를 정의합니다. fin_timeout 소켓이 TIME_WAIT 상태로 유지되는 최소 시간을 정의합니다 (한 번 사용 된 후에는 사용할 수 없습니다). 일반적인 시스템 기본값은 다음과 같습니다.

  • net.ipv4.ip_local_port_range = 32768 61000
  • net.ipv4.tcp_fin_timeout = 60

이는 기본적으로 시스템이 초당 (61000 - 32768) / 60 = 470 소켓 이상을 일관되게 보장 할 수 없음을 의미합니다. 만족 port_range 를 늘리는 것으로 시작할 수 있습니다. 요즘은 범위를 15000 61000 설정하는 것이 일반적입니다. fin_timeout 을 줄임으로써 가용성을 더 높일 수 있습니다. 두 가지를 모두한다고 가정하면, 초당 1500 건 이상의 아웃 바운드 연결이 있어야합니다.

값을 변경하려면 :

sysctl net.ipv4.ip_local_port_range="15000 61000"
sysctl net.ipv4.tcp_fin_timeout=30

위의 내용은 초당 아웃 바운드 연결을 만들기위한 시스템 기능에 영향을 미치는 요소로 해석되어서는 안됩니다. 그러나 오히려 이러한 요소들은 장기간의 "활동"에 대해 지속 가능한 방식으로 동시 연결을 처리하는 시스템의 능력에 영향을 미칩니다.

tcp_tw_recycletcp_tw_reuse 에 대한 일반적인 Linux 상자의 기본 Sysctl 값은 다음과 같습니다.

net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_tw_reuse=0

이것들은 ( "대기"상태의) "사용 된"소켓으로부터의 연결을 허용하지 않으며 소켓이 완전한 time_wait 사이클을 지속하도록합니다. 내가 설정하는 것이 좋습니다 :

sysctl net.ipv4.tcp_tw_recycle=1
sysctl net.ipv4.tcp_tw_reuse=1 

이렇게하면 time_wait 상태의 소켓을 빠르게 순환시키고 재사용 할 수 있습니다. 그러나이 변경을하기 전에이 소켓이 필요한 응용 프로그램에 사용할 프로토콜과 충돌하지 않는지 확인하십시오.

서버 측 : net.core.somaxconn 값은 중요한 역할을합니다. 청취 소켓에 대기중인 최대 요청 수를 제한합니다. 서버 응용 프로그램의 기능을 확신 할 수 있다면 기본 128에서 128에서 1024로 변경하십시오. 이제 응용 프로그램의 수신 대기 호출에서 수신 대기 변수를 같거나 더 높은 정수로 수정하여이 증가를 활용할 수 있습니다.

sysctl net.core.somaxconn=1024

이더넷 카드의 txqueuelen 매개 변수도 재생할 수있는 역할을합니다. 기본값은 1000입니다. 따라서 시스템에서 처리 할 수있는 경우 최대 5000 개까지 늘릴 수 있습니다.

ifconfig eth0 txqueuelen 5000
echo "/sbin/ifconfig eth0 txqueuelen 5000" >> /etc/rc.local

마찬가지로 net.core.netdev_max_backlognet.ipv4.tcp_max_syn_backlog 의 값을 올립니다. 기본값은 각각 1000과 1024입니다.

sysctl net.core.netdev_max_backlog=2000
sysctl net.ipv4.tcp_max_syn_backlog=2048

이제 쉘에서 FD ulimts를 늘려서 클라이언트 및 서버 측 응용 프로그램을 시작하는 것을 잊지 마십시오.

프로그래머가 사용하는 위의 한 가지 더 일반적인 기술 외에도 tcp 쓰기 호출의 수를 줄이는 것이 있습니다. 필자가 선호하는 것은 버퍼를 사용하여 클라이언트에 보내고 자하는 데이터를 푸시 한 다음 적절한 지점에서 버퍼링 된 데이터를 실제 소켓에 씁니다. 이 기법을 사용하면 대용량 데이터 패킷을 사용하고 조각화를 줄이며 사용자 토지와 커널 수준에서 CPU 사용률을 줄일 수 있습니다.

Question

나는 서버를 프로그래밍하고 있으며 연결 수가 "무제한"으로 설정되어 있어도 내 대역폭이 포화 상태가 아니기 때문에 연결 수가 제한되어있는 것처럼 보입니다.

우분투 리눅스 박스가 한 번에 열 수있는 최대 연결 수를 늘리거나 없애려면 어떻게합니까? OS가이를 제한합니까? 아니면 라우터 또는 ISP입니까? 아니면 다른 것입니까?




derobert가 제시 한 대답을 개선하기 위해,

nf_conntrack_max를 catting하여 OS 연결 한계를 판별 할 수 있습니다.

예 : cat / proc / sys / net / netfilter / nf_conntrack_max

다음 스크립트를 사용하여 주어진 범위의 tcp 포트에 대한 tcp 연결 수를 계산할 수 있습니다. 기본적으로 1-65535입니다.

이렇게하면 OS 연결 제한을 최대화할지 여부가 확인됩니다.

여기 스크립트가 있습니다.

#!/bin/bash
OS=$(uname)

case "$OS" in
    'SunOS')
            AWK=/usr/bin/nawk
            ;;
    'Linux')
            AWK=/bin/awk
            ;;
    'AIX')
            AWK=/usr/bin/awk
            ;;
esac

netstat -an | $AWK -v start=1 -v end=65535 ' $NF ~ /TIME_WAIT|ESTABLISHED/ && $4 !~ /127\.0\.0\.1/ {
    if ($1 ~ /\./)
            {sip=$1}
    else {sip=$4}

    if ( sip ~ /:/ )
            {d=2}
    else {d=5}

    split( sip, a, /:|\./ )

    if ( a[d] >= start && a[d] <= end ) {
            ++connections;
            }
    }
    END {print connections}'



최대 연결 수를 설정하는 몇 가지 변수가 있습니다. 대부분 파일 번호가 부족합니다. ulimit -n을 확인하십시오. 그 후, / proc에 설정이 있지만, 기본값은 수만 가지입니다.

더 중요한 것은, 당신이 뭔가 잘못하고있는 것처럼 들린다. 단일 TCP 연결은 두 당사자간에 모든 대역폭을 사용할 수 있어야합니다. 그렇지 않은 경우 :

  • TCP 창 설정이 충분히 큰지 확인하십시오. 리눅스 디폴트는 정말 빠른 inet 링크 (수백 mbps) 나 빠른 위성 링크를 제외한 모든 것에 적합합니다. 대역폭 * 지연 제품은 무엇입니까?
  • 큰 패킷이있는 ping을 사용하여 패킷 손실을 확인하십시오 ( ping -s 1472 ...).
  • 속도 제한을 확인하십시오. Linux의 경우 이것은 tc 로 구성됩니다.
  • 당신이 생각하는 대역폭이 실제로 존재하는지 확인하십시오. 예를 들면, iperf
  • 프로토콜이 정상적인지 확인하십시오. 대기 시간을 기억하십시오.
  • 기가비트 + LAN이면 점보 패킷을 사용할 수 있습니까? 너?

아마 나는 오해했다. 어쩌면 당신은 비트 토 런트 (Bittorrent)와 같은 것을하고 있습니다. 그렇다면 실제로 사용하고있는 연결 수 ( netstat 또는 lsof 시도)를 알아야합니다. 그 수가 많은 경우 다음을 수행 할 수 있습니다.

  • 대역폭이 많이 필요합니다 (예 : 100mbps +). 이 경우 실제로 ulimit -n 사용해야 할 수도 있습니다. 여전히 ~ 1000 개의 연결 (내 시스템의 기본값)이 꽤 있습니다.
  • 연결 속도를 늦추는 네트워크 문제 (예 : 패킷 손실)
  • IO 대역폭과 같은 다른 문제가 느껴지거나, 특히 찾고있는 경우. iostat -x 를 확인 했습니까?

또한 소비자 등급 NAT 라우터 (Linksys, Netgear, DLink 등)를 사용하는 경우 수천 개의 연결을 통해 성능을 초과 할 수 있습니다.

이것이 도움이되기를 바랍니다. 너는 정말로 네트워킹 질문을하고있다.




애플리케이션 레벨에서 개발자가 수행 할 수있는 작업은 다음과 같습니다.

서버 측에서 :

  1. 로드 밸런서 (있는 경우)가 올바르게 작동하는지 확인하십시오.

  2. 느린 TCP 시간 초과를 503으로 설정합니다. 즉각적인 응답입니다. 밸런서 작업을 올바르게로드하면 서비스 할 작업 리소스를 선택해야하며 예기치 않은 오류 메시지가있을 때 응답하는 것이 좋습니다.

예 : 노드 서버를 사용하고 있다면 npm에서 toobusy를 사용할 수 있습니다. 다음과 같은 구현 :

var toobusy = require('toobusy');
app.use(function(req, res, next) {
  if (toobusy()) res.send(503, "I'm busy right now, sorry.");
  else next();
});

왜 503입니까? 과부하에 대한 좋은 통찰력은 다음과 같습니다. http://ferd.ca/queues-don-t-fix-overload.html

클라이언트 측에서도 몇 가지 작업을 수행 할 수 있습니다.

  1. 일괄 적으로 통화를 그룹화하고 클라이언트 및 서버의 트래픽 및 총 요청 수를 줄이십시오.

  2. 불필요한 중복 요청을 처리하기 위해 캐시 중간층을 빌드하십시오.