เวลาแฝงสูงระหว่างการดาวน์โหลด


9

ฉันมีปัญหาเดียวกันกับการเชื่อมต่อทางธุรกิจของฉัน 5Mbps เหมือนกับการโพสต์บนเว็บไซต์นี้อีกครั้ง ทันทีที่คอมพิวเตอร์เครื่องใดเริ่มการดาวน์โหลดเวลาแฝงในการกระโดดครั้งแรกที่ผ่านมา DFG ที่ ISP ของเราจัดหาให้ (เบลล์) ก็จะดับลง การฟ้อนรำครั้งแรกนี้น่าจะอยู่ในอาคารเดียวกันของเราและมี 1 มิลลิวินาทีอย่างต่อเนื่องเริ่มดาวน์โหลดเช่น windows update และกระโดดไป 200-1000ms

ฉันใช้เวลาหลายชั่วโมงบนโทรศัพท์พร้อมการสนับสนุนทุกอย่างที่บอกว่าคุณเข้าถึงแบนด์วิดท์สูงสุดที่มีอยู่มันเป็นเรื่องปกติสำหรับเวลาในการตอบสนองของคุณ แต่การอ่านของฉันบอกฉันว่าพวกเขากำลังทำลายบางสิ่งด้วย TCP ฉันได้ทำการทดสอบบนการเชื่อมต่อที่บ้านของชอว์และแม้แต่ในการดาวน์โหลดที่ใช้งาน Rogers LTE และถึง Mbps สูงสุดสำหรับบัญชีของฉัน แต่เวลาแฝงไม่ผ่านไปถึงหลังคา

ฉันเข้าใจถูกหรือไม่ว่า Bell กำลังทำอะไรบางอย่างเพื่อทำลายเทคโนโลยีในตัวของ TCP เพื่อจัดการอัตราของแบนด์วิดท์ที่มีอยู่ระหว่างจุดสิ้นสุด 2 จุดหรือไม่


คำตอบใดช่วยคุณได้บ้าง ถ้าเป็นเช่นนั้นคุณควรยอมรับคำตอบเพื่อที่คำถามจะไม่โผล่ขึ้นมาเรื่อย ๆ โดยมองหาคำตอบ หรือคุณสามารถให้และยอมรับคำตอบของคุณเอง
Ron Maupin

คำตอบ:


12

เบลล์กำลังบอกความจริงกับคุณ เมื่อคุณพยายามดัน 5Mbps (หรือมากกว่า) ลงในการเชื่อมต่อ 5Mbps ไฟล์ทุกอย่างจะเรียงลำดับอย่างเรียบร้อย (read: queue.) ping ของคุณดับโดยไม่ล่าช้าเนื่องจากไม่มีงานค้าง อย่างไรก็ตามการตอบกลับอยู่ในตอนท้ายของคิว TCP กำลังทำสิ่งที่ควรจะเป็นตรงนี้ผู้ส่งกำลังกรอกหน้าต่างรับที่ได้รับอนุญาต

มีหลายสิ่งที่คุณสามารถทำได้ที่ด้านข้างของบรรทัด (QoS, WRED, ฯลฯ ) เพื่อช่วยลดเอฟเฟกต์ แต่นี่เป็นสิ่งที่คุณจะเห็นเมื่อมีความแตกต่างอย่างมากระหว่างแบนด์วิดท์ของผู้ส่งและผู้รับ ฉันอยู่กับมันมาหลายปีแล้ว (T1, 6Mbps DS3, แม้แต่ 10Mbps cablemodem) คุณสามารถขอให้ ISP ลดขนาดคิวที่ด้านข้างของพวกเขา แต่พวกเขาไม่น่าจะทำเพราะมันจะส่งแพ็คเก็ตลดลง .


4
200-1000ms (แพ็คเก็ต 85-420, 1500B @ 5Mbps) อยู่ใน โดเมนen.wikipedia.org/wiki/Bufferbloatเนื่องจาก TCP ขึ้นอยู่กับการสูญเสียแพ็คเก็ตที่เกิดขึ้นกับขนาดหน้าต่างที่ถูกต้องและตั้งค่าอย่างรวดเร็วมันควรจะเป็น net win เพื่อลด อาจ 10 แพ็คเก็ต (25ms) ฉันเห็นด้วยอย่างเต็มที่ว่าผู้ประกอบการไม่น่าจะเปลี่ยนแปลงสิ่งนี้ในผลิตภัณฑ์ของพวกเขาเว้นแต่ลูกค้าจำนวนมากบ่นน่าจะง่ายกว่าที่จะสั่งซื้อผลิตภัณฑ์ QoS กับการเชื่อมต่อทางธุรกิจควรมีค่าบัฟเฟอร์ saner และพวกเขาควรจะสั่งได้ตามความต้องการของลูกค้า QUIC ของ Google ที่น่าสนใจอาจเลือกให้อัตราการส่งช้าลงเมื่อเวลาในการตอบสนองช้าลง
ytti

ขอบคุณ Ricky ฉันได้ยินสิ่งที่คุณกำลังพูด แต่หลังจากอ่านมากขึ้นควรควบคุมการไหลของ TCP ไม่ควรดูงานในมือและปรับหน้าต่างตามอัตราที่ผู้รับสามารถจัดการได้? ดังนั้นไม่โหลดลูกค้าหรือเราเตอร์ (hop 2 บนเครือข่าย Bells) มากเกินไปหรือไม่ สำหรับฉันดูเหมือนว่าการอ้างอิงของคุณไปยัง bufferbloat ที่ฉันได้อ่านซึ่งอธิบายสถานการณ์อย่างแน่นอน
Stunpals

3
TCP ไม่สามารถตรวจพบปัญหาคอขวดโดยไม่ต้องแพ็คเก็ตดร็อป (หรือ ECN) หากคิวเราเตอร์ลึกพอและหน้าต่างรับของคุณมีขนาดใหญ่พอคุณสามารถสร้างงานค้างจำนวนมากได้ การประทับเวลา RFC1323 อาจช่วยได้ แต่ฉันพบปัญหาสำคัญที่ทำให้ Windows "TS" ใช้งานได้ (มันพยายามที่จะ "เจรจา" TS โดยการส่ง TS เริ่มต้น = 0)
Ricky Beam

4

รูปแบบส่วนใหญ่ของ "QoS" ไม่รวม AQM เนื่องจากผู้ขายพบว่ามันยากเกินไปที่จะกำหนดค่า RED โดยอัตโนมัติโดยไม่ทำอันตราย สิ่งนี้นำไปสู่ความล่าช้าที่น่ากลัวที่คุณเห็นในอุปกรณ์ทั่วไปมากมายในปัจจุบันโดยเฉพาะอย่างยิ่งเคเบิลโมเด็มและไร้สาย ดังนั้นเพียงแค่แนะนำ "เปิด qos กับ" ... ไม่ช่วย อันที่จริงแล้วอย่างน้อยหนึ่งผลิตภัณฑ์ของ Netgear การเปิดตัว จำกัด อัตราสำหรับ "QoS" นำไปสู่ผลลัพธ์ที่แย่ลงอย่างมากมาย ....

เมื่อเร็ว ๆ นี้อัลกอริทึมการจัดคิวงานแสดง + AQM ใหม่ปรากฏว่าทำงานได้ดีมากและดีกว่าโดยแทบจะไม่ต้องการการกำหนดค่าใด ๆ เลยนอกจากการตั้งค่าตัว จำกัด อัตรา มันเรียกว่า fq_codel และตอนนี้มีให้ใช้อย่างแพร่หลายใน Linux ส่วนใหญ่และได้รับการจัดส่งไปยัง BSD เช่นกัน เป็นส่วนหนึ่งของ "QoS" เริ่มต้นใน openwrt barrier breaker, Cerowrt และ Gargoyle ใช้รุ่นก่อนหน้านี้ (ดีมาก) ที่เรียกว่า sfqred ด้วยรูปแบบการปรับอัตราอัตโนมัติที่เป็นนวัตกรรมที่เรียกว่า ACC

ดังนั้นคุณสามารถกระแทกกล่องตามสิ่งนี้ต่อหน้าลิงก์ที่ไม่เหมาะสมของคุณเปิด Limiter rate QoS (ตั้งค่าให้ต่ำกว่าผู้ให้บริการขาเข้าและขาออกเล็กน้อยเพื่อให้คุณควบคุม) + fq_codel และรับประสิทธิภาพที่ดีขึ้นมากสำหรับทุกคนที่ใช้มัน . ฉันหมายถึงดีกว่าอย่างน่าประหลาดใจ : ดูการสาธิต ietf ด้านล่างรายงานไปยังคณะทำงาน iccrg ที่ ietf เป็นต้น

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับปัญหาบัฟเฟอร์ของบัฟเฟอร์และการแก้ไขโปรดดู:

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

เรากำลังพยายามโน้มน้าวให้ผู้ขาย ISP CPE หลายรายให้ความสนใจเช่นเดียวกับ cablelabs ซึ่งตีพิมพ์การศึกษาที่ยอดเยี่ยมของสิ่งใหม่นี้เมื่อไม่กี่เดือนก่อนซึ่งยังมีรายละเอียดเกี่ยวกับพฤติกรรมของเคเบิลโมเด็มโดยเฉพาะในปัจจุบัน

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


1

สิ่งที่คุณเห็นเป็นเรื่องปกติ ผู้ให้บริการหลายรายจะ จำกัด อัตราและ / หรือใช้กลไก QoS เพื่อลดลำดับความสำคัญของ ICMP (ซึ่งรวมถึง ping และ traceroute แบบดั้งเดิม) เนื่องจากถูกใช้ในการปฏิเสธการโจมตีบริการในบางครั้ง

ในขณะที่การเชื่อมโยงไม่แออัดความสำคัญที่ลดลงจะไม่ส่งผลใด ๆ เลยเนื่องจากไม่มีการรับส่งข้อมูล ในช่วงเวลาเหล่านี้เวลาในการตอบสนองของคุณยังคงต่ำเนื่องจากแพ็คเก็ต ICMP จะถูกส่งต่อทันทีและจะไม่ล่าช้าเลย

เมื่อการเชื่อมโยงแออัดคิวลำดับความสำคัญที่สูงขึ้นจะได้รับความสนใจมากขึ้น ขึ้นอยู่กับกลไกการเข้าคิวมันอาจส่งต่อหลายแพ็คเก็ตจากคิวลำดับความสำคัญสูงกว่าสำหรับแต่ละแพ็คเก็ตจากคิวลำดับความสำคัญต่ำกว่าหรือส่งต่อเฉพาะเมื่อไม่มีสิ่งใดในลำดับความสำคัญสูงกว่า ไม่ว่าในกรณีใดแพ็คเก็ตที่ถูกลดระดับลงมาจะมีลำดับความสำคัญต่ำกว่าโดยทั่วไปจะถูกพักไว้นานกว่าบนลิงก์ที่ไม่มีความแออัดทำให้เพิ่มเวลาในการตอบสนอง


1
ขอบคุณ YLearn สำหรับคำตอบของคุณ ฉันได้รับความสำคัญของ ICMP แต่เราสามารถเห็นการรับส่งข้อมูลอื่นที่ได้รับผลกระทบและ ICMP เป็นเพียงเพื่อแสดงให้เห็นปัญหา ในขณะที่ฉันพยายามสื่อถึง Ricky ในความคิดเห็นของฉันคือ Flow Control เป็นเหตุให้ TCP ทำงานในฐานะผู้ส่งที่มีแบนด์วิดท์สูงกว่าตัวรับสัญญาณจะทำให้เขาออฟไลน์ DOS หาก Flow Control ทำงานไม่ถูกต้อง นั่นเป็นสาเหตุที่ dial-up สามารถสื่อสารกับการเชื่อมต่อ 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

ดูเพิ่มเติมที่: bufferbloat.net/projects/codel/wiki/…
Mikko Rantalainen

โปรดทราบว่าคุณอาจต้องเรียกใช้linux-lowlatencyเคอร์เนลเพื่อให้ระบบทำงานของการประมวลผลแพคเกจทั้งหมด
Mikko Rantalainen

ดูเพิ่มเติมที่: apenwarr.ca/log/20110110
Mikko Rantalainen

ดูเพิ่มเติมที่: jfcarter.net/~jimc/documents/voip-qos-1609.html
Mikko Rantalainen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.