다운로드 중 높은 대기 시간


9

이 사이트의 다른 게시물 과 같은 비즈니스 연결 5Mbps에서 동일한 문제가 있습니다. 컴퓨터가 다운로드를 시작하자마자 ISP (Bell)가 제공 한 DFG를 지나는 첫 번째 홉의 대기 시간이 차트에서 사라집니다. 이 첫 번째 홉은 동일한 건물에있을 수 있으며 지속적으로 1ms이며 Windows 업데이트와 같은 다운로드를 시작하며 200-1000ms로 이동합니다.

가능한 최대 대역폭에 도달했다고 말하는 모든 지원을 통해 전화로 몇 시간을 보냈습니다. 지연 시간이 급증하는 것은 정상입니다. 그러나 내 독서는 그들이 TCP로 무언가를 깨뜨리고 있다고 말합니다. 홈 쇼 연결 및 다운로드를 실행하고 내 계정의 최대 Mbps에 도달하는 Rogers LTE에서도 테스트를 실행했지만 대기 시간이 지붕을 통과하지는 않습니다.

Bell이 2 개의 엔드 포인트 사이에서 사용 가능한 대역폭을 기반으로 속도를 관리하기 위해 TCP의 내장 기술을 깨뜨리기 위해 무언가를하고 있다는 것을 이해하고 있습니까?


어떤 대답이 도움이 되었습니까? 그렇다면 질문에 대한 답변이 계속 나오지 않도록 답변을 수락해야합니다. 또는 자신의 답변을 제공하고 수락 할 수 있습니다.
Ron Maupin

답변:


12

벨이 당신에게 진실을 말하고 있습니다. 5Mbps (또는 그 이상)를 5Mbps 연결로 푸시하려고하면 모든 파일이 깔끔한 순서로 읽습니다 (읽기 : 대기열). 백 로그가 없기 때문에 핑이 지연없이 종료됩니다. 그러나 이제 응답이 큐의 끝에 있습니다. TCP는 정확히 여기에있는 일을하고 있습니다-발신자가 허용 된 수신 창을 채우고 있습니다.

영향을 줄이는 데 도움이되도록 회선 측에서 수행 할 수있는 작업 (QoS, WRED 등)이 있지만 이는 발신자와 수신자 대역폭 사이에 큰 차이가있을 때 보게 될 것입니다. 나는 수년 동안 그와 함께 살았습니다 (T1, 6Mbps DS3, 심지어 10Mbps 케이블 모뎀) ISP에게 측면의 큐 크기를 줄 이도록 요청할 수는 있지만 패킷 드롭을 초래할 것이므로 그렇게하지는 않습니다. .


4
TCP는 창 크기를 정확하고 신속하게 설정하기 위해 발생하는 패킷 손실에 의존 하므로 200-1000ms (85-420 패킷, 1500B @ 5Mbps)는 en.wikipedia.org/wiki/Bufferbloat 도메인에 있습니다. 아마 10 패킷 (25ms). 나는 많은 고객들이 불만을 제기하지 않는 한, 사업자에게 QoS 제품을 주문하기가 더 쉬우 며, 더 안전한 버퍼 값을 가져야하고 고객 요구에 따라 주문할 수 있어야하는 경우가 아니라면 운영자가 제품에서이를 변경할 가능성이 없다는 것에 전적으로 동의합니다. 흥미롭게도 Google의 QUIC는 대기 시간이 시작될 때 선택적으로 전송 속도를 늦출 수 있습니다.
ytti

고마워 Ricky, 나는 당신이 말하는 것을 들었지만 더 많이 읽은 후에 TCP의 Flow Control은 백로 그를보고 수신기가 처리 할 수있는 속도로 창을 조정해서는 안됩니까? 따라서 클라이언트 또는 라우터 (벨 네트워크의 홉 2)에 과부하가 걸리지 않습니까? 나에게 그것은 시나리오를 정확하게 설명하는 읽은 bufferbloat에 대한 귀하의 참조처럼 보입니다.
Stunpals

3
TCP는 패킷 손실 (또는 ECN)없이 병목 현상을 감지 할 수 없습니다. 라우터 대기열이 충분히 깊고 수신 창이 충분히 큰 경우 큰 백 로그를 만들 수 있습니다. RFC1323 타임 스탬프가 도움이 될 수 있지만, Windows가 TS를 "사용"할 수있게하는 심각한 문제가 있습니다. (초기 TS = 0을 전송하여 TS를 "협상"하려고 시도 함)
Ricky Beam

4

요즘에는 대부분의 "QoS"형식에 AQM이 포함되지 않습니다. 이것은 오늘날 많은 일반적인 장치, 특히 케이블 모뎀과 무선 장치에서 볼 수있는 끔찍한 지연을 초래합니다. 따라서 "qos 켜기"를 권장하는 것만으로는 도움이되지 않습니다. 실제로 Netgear의 제품 중 하나 이상에서 "QoS"에 대한 속도 제한기를 설정하면 결과가 크게 저하됩니다 ....

최근에 새로운 공정 대기열 + AQM 알고리즘이 매우 잘 작동하는 것으로 나타 났으며, 속도 제한기를 설정하는 것 외에는 거의 구성이 필요하지 않습니다. fq_codel이라고하며 현재 대부분의 Linux에서 널리 사용 가능하며 BSD로 포팅되었습니다. openwrt 배리어 브레이커, cerowrt 및 gargoyle의 기본 "QoS"의 일부인 ACC라는 혁신적인 자동 속도 조정 체계와 함께 sfqred라는 이전 버전을 사용합니다.

따라서 오작동하는 링크 앞에서이를 기반으로 상자를 슬래시하고 QoS 속도 제한기를 켜십시오 (제공자 인바운드 및 아웃 바운드 설정보다 약간 낮게 설정하여 제어 할 수 있음) + fq_codel, 그것을 사용하는 모든 사람에게 훨씬 더 나은 성능을 얻을 수 있습니다 . 내 말은 놀랄만큼 잘 : IETF 등은 IETF에서 아래 iccrg 작업 그룹에 보고서를 데모을 참조하십시오

bufferbloat 문제점 및 수정 사항에 대한 자세한 내용은 다음을 참조하십시오.

http://www.bufferbloat.net/projects/cerowrt/wiki/Bloat-videos

우리는 물론 여러 ISP CPE 벤더들이 몇 개월 전에이 새로운 것들에 대한 훌륭한 연구를 발표 한 케이블 랩과 같이주의를 기울 이도록 노력하고 있으며, 특히 케이블 모뎀의 현재의 오작동에 대한 세부 사항도 포함하고 있습니다.

http://www.cablelabs.com/downloads/pubs/Active_Queue_Management_Algorithms_DOCSIS_3_0.pdf


1

당신이보고있는 것은 전적으로 전형적인 것입니다. 많은 서비스 제공 업체는 때때로 서비스 거부 공격에 사용 된 ICMP (전통적인 핑 및 추적 경로 포함)의 우선 순위를 낮추기 위해 속도를 제한하거나 QoS 메커니즘을 사용합니다.

링크가 정체되지 않은 경우 우선 순위가 낮아도 트래픽이 대기 중이 아니므로 영향을 미치지 않습니다. 이 기간 동안 ICMP 패킷이 즉시 전달되고 전혀 지연되지 않기 때문에 대기 시간이 짧게 유지됩니다.

링크가 정체되면 우선 순위가 높은 큐가 더주의를 기울입니다. 큐 메커니즘에 따라 우선 순위가 낮은 큐의 각 패킷에 대해 우선 순위가 높은 큐의 여러 패킷을 전달하거나 우선 순위가 높은 큐에 아무것도없는 경우에만 전달할 수 있습니다. 어쨌든, 우선 순위가 낮은 대기열로 강등 된 패킷은 일반적으로 정체가없는 링크보다 오래 지연되어 대기 시간이 길어집니다.


1
답장을 보내 주셔서 감사합니다. ICMP의 우선 순위를 얻었지만 다른 트래픽에 영향을 줄 수 있으며 ICMP는 문제를 설명하기위한 것일뿐입니다. 내가 Ricky에게 전하려고 할 때, 흐름 제어가 제대로 작동하지 않으면 수신자보다 높은 대역폭을 가진 발신자가 그를 오프라인 DOS로 가져갈 것이기 때문에 흐름 제어는 TCP가 작동하는 이유입니다. 전화 접속이 1000Mbps 연결과 통신 할 수있는 이유는 무엇입니까? 파일 전송 중에 적절한 표준 대기 시간으로 실행되는 경우 공명 수준을 유지하고 지붕을 통과하지 않으면 서 잘못 생각합니까?
Stunpals

1

당신은 아마도 bufferbloat로 고통 받고 있으며 AQM (Active Queue Management)을 원할 것입니다. Linux 용 스크립트를 작성하여 이것을 쉽게 만들 수 있습니다.

#!/bin/bash
# Traffic shaping script (AQM, fq_codel+tbf)
# Copyright 2018 Mikko Rantalainen <mikko.rantalainen@gmail.com>
# License: MIT (X11)
# Usage:
#   21/0.8 Mbps connection (ADSL2): DOWNLINK_RATE=21.7Mbit UPLINK_RATE=0.8Mbit TBF_LATENCY=500ms bin/traffic-shaping start
#   100/100 Mbps connection: ./traffic-shaping
#   1/1 GBps connection: DOWNLINK_RATE=1Gbit UPLINK_RATE=1Gbit TBF_LATENCY=10ms bin/traffic-shaping start
# Note that using low TBF_LATENCY will require powerful CPU.
#   

set -e

DEV="${DEV:=$(ip route | grep "^default " | grep -Po "(?<=dev )[^ ]+")}"

# ingress:
DOWNLINK_RATE="${DOWNLINK_RATE:=104000kbit}" # or e.g. "21.5Mbit"
# egress:
UPLINK_RATE="${UPLINK_RATE:=105000kbit}"

CODEL_INTERVAL="${CODEL_INTERVAL:=100ms}" # usually 100ms, high speed links with low latency may need lower values
CODEL_TARGET="${CODEL_TARGET:=5ms}" # unit "us" is also available, usually 5%-10% of CODEL_INTERVAL
CODEL_LIMIT="${CODEL_LIMIT:=1001}" # decrease to reduce latency, too low values will limit throughput
CODEL_FLOWS="${CODEL_FLOWS:=1024}"

# set burst as high as possible without causing dropped packets at the start of the connections
DOWNLINK_BURST="${DOWNLINK_BURST:=6500}"
UPLINK_BURST="${UPLINK_BURST:=6500}"

TBF_LATENCY="${TBF_LATENCY:=14ms}" # set to lower latency to improve control over bandwidth limiting, UPLINK_BURST bytes must be able to be sent in this time

IFB="$DEV.ingress"

INITCWND="${INITCWND:=20}"
INITRWND="${INITRWND:=20}"

configure_shaping()
{
    # EGRESS (outgoing traffic, "uploads"):

    # setup bandwidth limiting:
    tc qdisc add dev "$DEV" root handle 1: tbf rate "$UPLINK_RATE" burst "$UPLINK_BURST" latency "$TBF_LATENCY"

    # setup fq_codel for bandwidth shaping
    tc qdisc add dev "$DEV" parent 1: fq_codel limit "$CODEL_LIMIT" target "$CODEL_TARGET" interval "$CODEL_INTERVAL" flows "$CODEL_FLOWS" noecn


    # INGRESS (incoming traffic, "downloads"):

    # setup bandwidth limiting (ingress limiting needs IFB or Intermediate Functional Block, see https://wiki.linuxfoundation.org/networking/ifb):
    tc qdisc add dev "$DEV" handle ffff: ingress
    ip link add name "$IFB" type ifb
    tc qdisc add dev "$IFB" root handle 1: tbf rate "$DOWNLINK_RATE" burst "$DOWNLINK_BURST" latency "$TBF_LATENCY"

    # setup fq_codel for bandwidth shaping
    tc qdisc add dev "$IFB" parent 1: fq_codel limit "$CODEL_LIMIT" target "$CODEL_TARGET" interval "$CODEL_INTERVAL" flows "$CODEL_FLOWS" ecn
    ip link set dev "$IFB" up

    # connect ingress filtering to actual WAN device
    tc filter add dev "$DEV" parent ffff: protocol all prio 10 u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev "$IFB"

    # configure initcwnd and initrwnd
    ip route change $(ip route | grep ^default) initcwnd "$INITCWND" initrwnd "$INITRWND"
}

remove_shaping()
{
    tc qdisc list | grep -q "ingress" && tc qdisc del dev "$DEV" ingress || true
    tc qdisc list | grep -q "codel" && tc qdisc del dev "$DEV" root || true
    ip link show | grep -q "$IFB" && ip link del "$IFB" || true
}

status()
{
        echo "─── queue discipline configuration: ──────────────────"
        tc qdisc list
        echo "   TIP: use e.g. 'sudo tc qdisc del dev $DEV ingress' to remove ingress filtering"
        echo "   TIP: use e.g. 'sudo tc qdisc del dev $DEV root' to remove egress filtering"
        echo "─── ip link show: ────────────────────────────────────"
        ip link show
        echo "   TIP: use e.g. 'sudo ip link del $IFB' to remove ingress device"
}

color_status()
{
    status | grep --color=auto -E "^|$DEV|$IFB|rate [^ ]+"
}

# handle parameters

ACTION="$1"
shift || true

while [ ! -z "$1" ]
do
    case "$1" in
        -v|--verbose)
            echo "Device: $DEV"
            echo "Downlink rate (ingress): $DOWNLINK_RATE"
            echo "Uplink rate (egress): $UPLINK_RATE"
            set -x
            ;;
        *)
            if [ ! -z "$2" ]; then
                echo "Unknown parameter: '$2'" 1>&2
                exit 1
            fi
            ;;
    esac
    shift
done

case "$ACTION" in
    start)
        remove_shaping
        configure_shaping
        ;;
    stop)
        remove_shaping
        ;;
    status)
        color_status
        ;;
    restart)
        remove_shaping
        configure_shaping
        ;;
    *)
        echo "Unknown action: $1" 1>&2
        echo "Usage: $0 <start|stop|restart|status> [--verbose|-v]" 1>&2
        exit 1
esac

당신은 단순히 스크립트를 저장 traffic-shaping하고 chmod a+x그것을하고 (물론, 소스 코드를 읽은 후) 루트로 실행합니다.

당신의 유스 케이스를 위해, 나는 제안 할 것이다

DOWNLINK_RATE=5.0Mbit UPLINK_RATE=5.0Mbit TBF_LATENCY=500ms ./traffic-shaping start


linux-lowlatency시스템이 모든 패키지를 처리하는 작업을 유지하기 위해 커널 을 실행해야 할 수도 있습니다 .
Mikko Rantalainen


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.