#server-performance

Έλεγχος κυκλοφορίας στο Linux (tc): ένας πρακτικός οδηγός

12 λεπτά ανάγνωσης - 5 Ιουνίου 2026

hero section cover

Έλεγχος εύρους ζώνης, ιεράρχηση της κυκλοφορίας και διαμόρφωση εισερχόμενης και εξερχόμενης κίνησης σε Linux με το tc. Λειτουργικές ρυθμίσεις HTB, IFB, DSCP και fq_codel για πραγματικούς διακομιστές.

Έλεγχος κυκλοφορίας στο Linux (tc): ένας πρακτικός οδηγός

Η εντολή tc σας παρέχει άμεσο έλεγχο του τρόπου με τον οποίο ο διακομιστής σας διαχειρίζεται την κυκλοφορία του δικτύου. Μπορείτε να περιορίσετε το εύρος ζώνης ανά υπηρεσία, να διατηρήσετε την ανταπόκριση διαδραστικών συνεδριών όπως το SSH όταν παρατηρούνται απότομες αυξήσεις στις μαζικές μεταφορές δεδομένων και να διαμορφώσετε τόσο τις εξερχόμενες όσο και τις εισερχόμενες ροές από ένα μόνο εργαλείο. Ο οδηγός αυτός καλύπτει τις βασικές έννοιες, μια λειτουργική ρύθμιση HTB, τη διαμόρφωση εισερχόμενης κίνησης με IFB, την ιεράρχηση βάσει DSCP και τον τρόπο εντοπισμού σφαλμάτων όταν παρουσιάζεται κάποιο πρόβλημα.


 

Πώς λειτουργεί το tc

Κάθε tc ρύθμιση αποτελείται από τέσσερα κινούμενα μέρη:

  • qdisc (queuing discipline). Ο χρονοπρογραμματιστής που συνδέεται με μια διεπαφή δικτύου. Αποφασίζει πώς τα πακέτα εισάγονται και εξάγονται από την ουρά.
  • Class. Μια υποδιαίρεση μέσα σε ένα qdisc με κλάσεις. Σκεφτείτε το σαν μια λωρίδα κυκλοφορίας με δικό της όριο ταχύτητας.
  • Φίλτρο. Ελέγχει τις κεφαλίδες των πακέτων (IP, θύρες, σημάδια) και αντιστοιχίζει κάθε πακέτο σε μια κλάση.
  • Action. Τι συμβαίνει σε ένα πακέτο όταν ανταποκρίνεται στα κριτήρια: προώθηση, απόρριψη, ανακατεύθυνση.

Αυτά σχηματίζουν ένα δέντρο. Τα πακέτα εισέρχονται στο ριζικό qdisc, περνούν από φίλτρα, ταξινομούνται σε κλάσεις από ένα major:minor χειριστή και καταλήγουν σε ουρά σε ένα qdisc φύλλου για μετάδοση.

Για οτιδήποτε πιο περίπλοκο από την αντιστοίχιση βάσει θύρας, επισημάνετε τα πακέτα με iptables ή nftables στον πίνακα mangle και, στη συνέχεια, χρησιμοποιήστε το fw φίλτρο tc για να τα ταξινομήσετε βάσει της σήμανσης. Έχει πολύ καλύτερη επεκτασιμότητα από την αλυσιδωτή εφαρμογή u32 κανόνων για κάθε τύπο κίνησης.

Εξερχόμενη έναντι εισερχόμενης

Η κατεύθυνση έχει σημασία. Ο πυρήνας μπορεί να αποθηκεύσει προσωρινά και να καθυστερήσει τα εξερχόμενα πακέτα, κάτι που επιτρέπει την πραγματική διαμόρφωση της κυκλοφορίας. Τα εισερχόμενα πακέτα έχουν ήδη διανύσει το δίκτυο τη στιγμή που τα βλέπετε, οπότε μπορείτε μόνο να τα ελέγξετε (να τα απορρίψετε αν υπερβούν ένα όριο) εκτός αν τα ανακατευθύνετε πρώτα σε μια συσκευή IFB.

ΧαρακτηριστικόΕξερχόμενηΕισερχόμενη
ΚατεύθυνσηΕξερχόμεναΕισερχόμενη
ΔιαμόρφωσηΕγγενήςΑπαιτεί IFB
ΠολιτικήΥποστηρίζεταιΥποστηρίζεται
Τυπική χρήσηQoS, κατανομή εύρους ζώνης, ρύθμιση ρυθμούΠεριορισμός ρυθμού, βασική αντιμετώπιση DDoS

Τα qdiscs που θα χρησιμοποιήσετε στην πράξη

  • HTB (Hierarchical Token Bucket). Με κατηγορίες. Χρησιμοποιήστε το όταν θέλετε εγγυημένο ελάχιστο εύρος ζώνης ανά υπηρεσία με τη δυνατότητα να δανειστείτε αχρησιμοποίητη χωρητικότητα από άλλες κατηγορίες.
  • TBF (Token Bucket Filter). Χωρίς κλάσεις. Χρησιμοποιήστε το όταν απλώς χρειάζεστε να περιορίσετε ολόκληρη τη διεπαφή σε έναν ενιαίο ρυθμό.
  • fq_codel (Fair Queuing Controlled Delay). Συνδυάζει τη δικαιοσύνη ανά ροή με την ενεργή διαχείριση ουρών για την εξάλειψη του bufferbloat. Αποτελεί το προεπιλεγμένο qdisc στις περισσότερες διανομές Linux από την έκδοση systemd 217 και παρέχεται ως προεπιλογή στο RHEL 9. Να το συνδέετε πάντα ως τελικό qdisc κάτω από κλάσεις HTB, διαφορετικά μια μεμονωμένη «άπληστη» ροή μπορεί να μονοπωλήσει ολόκληρη την κλάση.

Εγκατάσταση του tc σε διακομιστή Linux

tc διατίθεται μαζί με το πακέτο iproute2. Στα Debian και Ubuntu, εγκαταστήστε το με την εντολή apt-get install iproute2. Στα RHEL και τα παράγωγά τους, yum install iproute. Θα χρειαστείτε δικαιώματα root ή sudo.

Βρείτε πρώτα το σωστό όνομα της διεπαφής. Η λανθασμένη ονομασία της διεπαφής είναι ο πιο συνηθισμένος λόγος για τον οποίο μια ρύθμιση δεν έχει κανένα αποτέλεσμα:

ip link show

Ελέγξτε τι υπάρχει ήδη στη διεπαφή, συμπεριλαμβανομένων των μετρητών σε πραγματικό χρόνο:

tc -s qdisc show dev eth0

Διαγράψτε οποιοδήποτε υπάρχον root qdisc πριν εφαρμόσετε μια νέα ρύθμιση, για να αποφύγετε RTNETLINK answers: File exists σφάλματα:

tc qdisc del dev eth0 root 2>/dev/null || true

Αν ενημερώνετε έναν υπάρχοντα κανόνα αντί να ξεκινάτε από το μηδέν, χρησιμοποιήστε replace αντί για add για μια ατομική αντικατάσταση.

Η εκφόρτωση υλικού, όπως τα TSO και GSO, ομαδοποιεί τα πακέτα με τρόπους που παρεμβαίνουν στη διαμόρφωση. Απενεργοποιήστε τα στη διαμορφωμένη διεπαφή:

sudo ethtool -K eth0 tso off gso off

Ορίστε fq_codel ως το προεπιλεγμένο qdisc σε επίπεδο συστήματος για νέες διεπαφές:

sysctl -w net.core.default_qdisc=fq_codel

Για διακομιστές με υψηλό φόρτο εργασίας, συνδυάστε το με τον αλγόριθμο ελέγχου συμφόρησης BBR (πυρήνας 4.9+). Το BBR διατηρεί υψηλή απόδοση χωρίς να αυξάνει τις ουρές:

sysctl -w net.ipv4.tcp_congestion_control=bbr

Μια συνήθεια ασφαλείας αν διαμορφώνετε ένα απομακρυσμένο σύστημα μέσω SSH: ανοίξτε μια δεύτερη συνεδρία και έχετε tc qdisc del dev eth0 root έτοιμο για επικόλληση. Ένας λανθασμένος κανόνας φίλτρου μπορεί να σας αποκλείσει αμέσως.

Διαμόρφωση της εξερχόμενης κίνησης με το HTB

Το HTB σας επιτρέπει να ορίσετε για κάθε υπηρεσία ένα εγγυημένο ελάχιστο (rate) και ένα ανώτατο όριο (ceil). Το αχρησιμοποίητο εύρος ζώνης κατευθύνεται σε όποιον το χρειάζεται, με σειρά προτεραιότητας. Ακολουθεί μια λειτουργική ρύθμιση τριών επιπέδων για μια ανερχόμενη σύνδεση 1 Gbps.

Δημιουργήστε το ριζικό qdisc HTB. Το default 30 στέλνει κάθε μη ταξινομημένο πακέτο στην κλάση 1:30 αντί να το αφήσει να παρακάμψει τους κανόνες σας:

tc qdisc add dev eth0 root handle 1: htb default 30

Περιορίστε τη συνολική διακίνηση στα 900 Mbps. Ρυθμίζετε πάντα τη διαμόρφωση ελαφρώς κάτω από την πραγματική χωρητικότητα της σύνδεσης, διαφορετικά δημιουργείται ουρά σε κάποιον ανάντη δρομολογητή ή μόντεμ που δεν ελέγχετε:

tc class add dev eth0 parent 1: classid 1:1 htb rate 900mbit ceil 900mbit

Ορίστε τα επίπεδα υπηρεσιών. Οι χαμηλότερες prio τιμές λαμβάνουν πρώτα το αχρησιμοποίητο εύρος ζώνης:

# High priority: web and API traffic
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 500mbit ceil 900mbit prio 1
 
# Medium priority: database replication
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 300mbit ceil 900mbit prio 2
 
# Low priority: bulk and backup traffic
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 100mbit ceil 900mbit prio 3

Προσθέστε fq_codel ως το qdisc «φύλλου» σε κάθε κλάση, ώστε μια μεμονωμένη ροή να μην μπορεί να κυριαρχήσει στο επίπεδό της:

tc qdisc add dev eth0 parent 1:10 handle 10: fq_codel
tc qdisc add dev eth0 parent 1:20 handle 20: fq_codel
tc qdisc add dev eth0 parent 1:30 handle 30: fq_codel

Τώρα ταξινομήστε την κίνηση. Για απλή αντιστοίχιση θυρών, u32 είναι η ταχύτερη μέθοδος:

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
  match ip dport 443 0xffff flowid 1:10

Για οτιδήποτε εξαρτάται από την κατάσταση, προσθέστε σήμανση στα iptables και αντιστοιχίστε τη σήμανση με fw:

iptables -t mangle -A OUTPUT -p tcp --dport 5432 -j MARK --set-mark 2
tc filter add dev eth0 protocol ip parent 1:0 prio 2 handle 2 fw flowid 1:20

Διαμόρφωση της εισερχόμενης κίνησης με IFB

Δεν είναι δυνατή η εγγενής διαμόρφωση της εισερχόμενης κυκλοφορίας, καθώς τη στιγμή που ένα πακέτο φτάνει, έχει ήδη καταναλώσει το εύρος ζώνης σας. Η λύση είναι να ανακατευθύνετε την εισερχόμενη κυκλοφορία σε μια εικονική διεπαφή Intermediate Functional Block (IFB), όπου ο πυρήνας την αντιμετωπίζει ως εξερχόμενη και σας επιτρέπει να εφαρμόσετε qdiscs με κατηγορίες.

Φορτώστε το module και ενεργοποιήστε τη διεπαφή:

modprobe ifb numifbs=1
ip link set dev ifb0 up

Προσθέστε ένα qdisc εισερχόμενης κίνησης στη φυσική διεπαφή και ανακατευθύνετε τα πάντα προς ifb0:

tc qdisc add dev eth0 ingress handle ffff:
tc filter add dev eth0 parent ffff: protocol all u32 \
  match u32 0 0 action mirred egress redirect dev ifb0

Από εδώ, ifb0 συμπεριφέρεται όπως οποιαδήποτε άλλη διεπαφή. Εφαρμόστε το δέντρο HTB σας σε αυτήν ακριβώς όπως θα κάνατε στην εξερχόμενη κίνηση:

tc qdisc add dev ifb0 root handle 1: htb default 30
tc class add dev ifb0 parent 1: classid 1:1 htb rate 900mbit ceil 900mbit
tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 500mbit ceil 900mbit prio 1

Προτεραιοποίηση της κυκλοφορίας με DSCP

Το DSCP (Differentiated Services Code Point) επισημαίνει τα πακέτα με μια τιμή 6 bit στο byte TOS, οπότε τα tc φίλτρα σας να μπορούν να ταξινομούν βάσει ετικέτας αντί να αναζητούν θύρες σε όλο το σύνολο κανόνων. Κατά την αντιστοίχιση του DSCP στο tc, μετατοπίστε την τιμή προς τα αριστερά κατά 2 bit. Το DSCP EF (46) γίνεται 0xb8. Η μάσκα 0xfc απομονώνει τα 6 bit του DSCP από τα 2 bit του ECN.

Μια λογική προεπιλεγμένη αντιστοίχιση για φορτία εργασίας διακομιστών:

Τύπος κυκλοφορίαςDSCPTOS δεκαεξαδικόΠαραδείγματα
ΔιαδραστικόEF0xb8SSH, DNS, VoIP
ΕπιχειρήσειςAF410x88HTTP, HTTPS, API
ΜαζικήCS10x20Αντίγραφα ασφαλείας, FTP, ενημερώσεις πακέτων
Κατά βέλτιστο δυνατό τρόποCS00x00Όλα τα άλλα

Επισήμανση εξερχόμενων πακέτων στο iptables πριν φτάσουν στα tc φίλτρα σας:

iptables -t mangle -A OUTPUT -p tcp --dport 22 -j DSCP --set-dscp 46

Στη συνέχεια, αντιστοιχίστε την ετικέτα στο tc και δρομολογήστε το στη σωστή κατηγορία HTB:

# EF (SSH, VoIP) goes to the high-priority class
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
  match ip tos 0xb8 0xfc flowid 1:10
 
# AF41 (web traffic) goes to the medium class
tc filter add dev eth0 protocol ip parent 1:0 prio 2 u32 \
  match ip tos 0x88 0xfc flowid 1:20
 
# CS1 (bulk) goes to the low-priority class
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 \
  match ip tos 0x20 0xfc flowid 1:30

Παρακολούθηση και αντιμετώπιση προβλημάτων

Οι τρεις εντολές που θα χρησιμοποιείτε συνεχώς:

tc -s qdisc show dev eth0
tc -s class show dev eth0
tc -s filter show dev eth0

Παρακολουθήστε το dropped και overlimits μετρητές. Τα πακέτα που χάνονται σημαίνουν ότι η ουρά έχει κορεστεί· η υπέρβαση των ορίων σημαίνει ότι φτάσατε στο ανώτατο όριο της κατηγορίας και ο πυρήνας αναγκάστηκε να καθυστερήσει ή να απορρίψει κίνηση. Για ζωντανή προβολή:

watch -n 1 'tc -s class show dev eth0'

Προσθέστε -d για εσωτερικές παραμέτρους (target, interval, quantum) και -j για έξοδο JSON αν διοχετεύετε τα δεδομένα σε μια στοίβα μετρήσεων. Συνδυάστε το με ss -tin για να δείτε εκτιμήσεις RTT και επαναμεταδόσεις στο επίπεδο TCP.

Οι περισσότερες αστοχίες εμπίπτουν σε μια σύντομη λίστα:

ΣύμπτωμαΠιθανή αιτίαΛύση
RTNETLINK answers: File existsΤο root qdisc έχει ήδη ρυθμιστείtc qdisc del dev eth0 root πρώτα
Οι κανόνες εφαρμόζονται, αλλά η κίνηση δεν περιορίζεταιΛάθος διεπαφή ή το TSO/GSO παραμένει ενεργοποιημένοΕπιβεβαιώστε με ip link show, απενεργοποιήστε τις εκφορτώσεις με το ethtool -K
Το φίλτρο δεν ταιριάζει ποτέΛανθασμένη σύνταξη θύρας/IP ή ευθυγράμμιση μάσκαςΠροσθέστε μια αντίμετρο και ελέγξτε τον αριθμό των εμφανίσεων στο tc -s filter show
Οι κανόνες εξαφανίζονται μετά την επανεκκίνησηΗ διαμόρφωση βρίσκεται μόνο στη μνήμηΕνσωματώστε το σε ένα σενάριο και καλέστε το από το systemd ή έναν διαχειριστή του NetworkManager
Υψηλή καθυστέρηση στην κυκλοφορία προτεραιότηταςΔεν υπάρχει qdisc τύπου «leaf» ή το όριο ράφτας είναι πολύ χαμηλόΣυνδέστε fq_codel σε κατηγορίες leaf, αυξήστε burst

Αν ποτέ κλειδωθείτε έξω λόγω λανθασμένης διαμόρφωσης, η επαναφορά είναι απλή:

tc qdisc del dev eth0 root

tc δεν μπορείτε να δημιουργήσετε εύρος ζώνης που δεν διαθέτετε, αλλά σε μια καλά εξοπλισμένη ανερχόμενη σύνδεση αυτό κάνει τη διαφορά μεταξύ προβλέψιμης απόδοσης και ενός διακομιστή που καταρρέει τη στιγμή που ένας χρήστης ξεκινά μια μεγάλη μεταφορά δεδομένων. Αν χρειάζεστε το ακατέργαστο εύρος ζώνης και την ελευθερία να το διαμορφώσετε όπως θέλετε, ρίξτε μια ματιά στους αποκλειστικούς διακομιστές της FDC.

Blog

Προτεινόμενα αυτή την εβδομάδα

Περισσότερα άρθρα
Οδηγός χρήσης του iperf3: Δοκιμή ταχύτητας δικτύου σε Linux και Windows
#bandwidth#server-performance

Οδηγός χρήσης του iperf3: Δοκιμή ταχύτητας δικτύου σε Linux και Windows

Εγκαταστήστε το iperf3, εκτελέστε δοκιμές εύρους ζώνης και ρυθμίστε τα buffer TCP για ακριβή αποτελέσματα σε Linux και Windows. Καλύπτει δοκιμές UDP, αμφίδρομες δοκιμές και δοκιμές 10GbE+.

10 λεπτά ανάγνωσης - 7 Μαΐου 2026

Περισσότερα άρθρα
background image

Έχετε ερωτήσεις ή χρειάζεστε μια προσαρμοσμένη λύση

icon

Ευέλικτες επιλογές

icon

Παγκόσμια εμβέλεια

icon

Άμεση ανάπτυξη

icon

Ευέλικτες επιλογές

icon

Παγκόσμια εμβέλεια

icon

Άμεση ανάπτυξη