optimizing traffic control for isp mikrotik routeros 5 pcq

optimizing traffic control for isp mikrotik routeros 5 pcq

mikrotik logo

Оптимизиране на трафика контрол за ISP – Mikrotik RouterOS 5 – PCQ/queue tree

Когато стане въпрос за ограничаване на трафика в Микротик всеки предлага simple queue. По принцип да, наистина е много удобно в един ред да ограничаваш един адрес и в двете посоки. Но когато адресите на нашите потребители нараснат положението започва да се усложнява първо в трафик контрола. Главния проблем идва от там, че всеки един пакет линеино преглежда всички правила в simple queue и когато те са 100 всичко е наред но нараснат ли до 1000 или повече, ресурса на процесора е на привършване. Първият сигнал за това са повишени и неравномерни стоиности в отговора на пинг както към машината така и през нея. Вторият и още по ясен сигнал е “дропенето” на пакети. Всъщност проблема не идва от колко потребители имаш и колко трафик ще направят те а от броя на пакети които преминават през правилата на queue. В нашия случай имаме една машина с над 1000 правила в simple queue която видимо има проблемите които споменах по горе. След като сме стигнало до тук имаме два варианта или да купим нов и по мощен хардуер или да се опитаме да оптимизираме трафик контрола. Тръгвайки по по трудния път нека първо да покажа конфигурацията.

Intel® Pentium® Processor T4200
(1M Cache, 2.00 GHz, 800 MHz FSB
 
# DEVICE   VENDOR                  NAME                                                           IRQ
 0 04:05.0  Intel Corporation       82541GI Gigabit Ethernet Controller (rev: 5)                   9
 1 04:04.0  ATI Technologies Inc    ES1000 (rev: 2)                                                11
 2 03:00.4  Intel Corporation       82573E KCS (Active Management) (rev: 3)                        11
 3 03:00.3  Intel Corporation       Active Management Technology - SOL (rev: 3)                    10
 4 03:00.0  Intel Corporation       82573E Gigabit Ethernet Controller (Copper) (rev: 3)           9
 5 00:1f.3  Intel Corporation       82801G (ICH7 Family) SMBus Controller (rev: 1)                 10
 6 00:1f.2  Intel Corporation       82801GB/GR/GH (ICH7 Family) SATA IDE Controller (rev: 1)       10
 7 00:1f.1  Intel Corporation       82801G (ICH7 Family) IDE Controller (rev: 1)                   11
 8 00:1f.0  Intel Corporation       82801GB/GR (ICH7 Family) LPC Interface Bridge (rev: 1)         0
 9 00:1e.0  Intel Corporation       82801 PCI Bridge (rev: 225)                                    0
10 00:1d.7  Intel Corporation       82801G (ICH7 Family) USB2 EHCI Controller (rev: 1)             11
11 00:1d.3  Intel Corporation       82801G (ICH7 Family) USB UHCI Controller #4 (rev: 1)           11
12 00:1d.2  Intel Corporation       82801G (ICH7 Family) USB UHCI Controller #3 (rev: 1)           11
13 00:1d.1  Intel Corporation       82801G (ICH7 Family) USB UHCI Controller #2 (rev: 1)           10
14 00:1d.0  Intel Corporation       82801G (ICH7 Family) USB UHCI Controller #1 (rev: 1)           11
15 00:1c.5  Intel Corporation       82801GR/GH/GHM (ICH7 Family) PCI Express Port 6 (rev: 1)       255
16 00:1c.4  Intel Corporation       82801GR/GH/GHM (ICH7 Family) PCI Express Port 5 (rev: 1)       255
17 00:1c.0  Intel Corporation       82801G (ICH7 Family) PCI Express Port 1 (rev: 1)               255
18 00:00.0  Intel Corporation       E7230/3000/3010 Memory Controller Hub (rev: 0)                 0

На мен специално ми се вижда слаба но ще трябва да се задоволим с това с което разполагаме.

Първото нещо което ми направи неприятно впечатление е неравномерното натоварване на ядрата на процесора. Едното почти държеше 100% а другото подскачаше здраво. Това е явен знак, че има проблем с прекъсванията от лан картите и затова ги разделих всяка да се обработва само от едно ядро.

system resource irq set numbers=9 cpu=1
system resource irq set numbers=12 cpu=0

след което получих следния резултат.

[admin@main] > system resource irq print
 # IRQ USERS                                   CPU        ACTIVE-CPU COUNT
 0 1   i8042                                   auto       0          2
 1 4   serial                                  auto       0          4
 2 6   floppy                                  auto       0          3
 3 9   acpi                                    auto       0          0
 4 12  i8042                                   auto       0          2
 5 14  ide0                                    auto       0          0
 6 15  ide1                                    auto       0          0
 7 16  usb5                                    auto       0          0
 8 17  vlans                                   1          1          71987
 9 18  usb4                                    auto       0          0
10 19  usb3                                    auto       0          156
       ata_piix
11 23  usb2                                    auto       0          0
       usb1
12 43  internet                                0          0          79372

Лан интерфейса vlans се обработва от 1 ядро а internet от 0, всички останали irq имат стойности auto. Видимо нещата се поуспокоиха но ядрата продължаваха да подскачат много неравномерно от 60% до 100%. Този път изключих и rps на интерфейса internet. rps всъщност е функционалност за балансиране на натоварването на лан картите но в случая на нас ни пречи именно защото имаме високо натоварена система и времето за отговор на ядрата е по голямо когато се прави балансинг отколкото ако отговаря само едно ядро на една карта.

[admin@main] > system resource irq rps disable numbers=internet
[admin@main] > system resource irq rps print
Flags: X - disabled
 #   NAME
 0 X internet
 1   vlans

Само с тази стъпка аз получих доста добър резулат защото виждах как ядрата се товарят равномерно но стоиностите бяха много високи 75-100% дропенето на пакети почти изчезна но пинга си остана много висок навсякъде. Явно беше, че със simple queue трафик контрола на тази машина няма да го бъде и трябва да се помисли сериозно за оптимизация.

Ако съм честен дълго се ровех в google и когато търсех с ключови думи често стигах края на страниците с резултати и въпреки всичко пак се връщах в manual страницата на http://www.mikrotik.com/ докато накрая не намерих решението пак там. Общо взето нека си представим, че имаме 6 различни скорости и това са 40, 20, 10, 4, 2, и 1 mbits. Разполагаме само с два мрежови интерфейса и това са vlans към нашите потребители и internet към Интернет. Основните правила които ще приложим са тези.

ip firewall mangle add chain=forward src-address-list=40M action=mark-connection new-connection-mark=40M passthrough=yes comment="Clients 40Mbits" disabled=no
ip firewall mangle add chain=forward connection-mark=40M action=mark-packet new-packet-mark=40M passthrough=no disabled=no
queue type add name="PCQ_down_40M" kind=pcq pcq-rate=40M pcq-classifier=dst-address
queue type add name="PCQ_up_40M" kind=pcq pcq-rate=40M pcq-classifier=src-address
queue tree add name=Download parent=vlans queue=default priority=1
queue tree add name=down_40M parent=Download packet-mark=40M queue=PCQ_down_40M
queue tree add name=Upload parent=internet queue=default priority=1
queue tree add name=40M parent=Upload packet-mark=40M queue=PCQ_up_40M
 
ip firewall mangle add chain=forward src-address-list=20M action=mark-connection new-connection-mark=20M passthrough=yes comment="Clients 20Mbits" disabled=no
ip firewall mangle add chain=forward connection-mark=20M action=mark-packet new-packet-mark=20M passthrough=no disabled=no
queue type add name="PCQ_down_20M" kind=pcq pcq-rate=20M pcq-classifier=dst-address
queue type add name="PCQ_up_20M" kind=pcq pcq-rate=20M pcq-classifier=src-address
queue tree add name=down_20M parent=Download packet-mark=20M queue=PCQ_down_20M
queue tree add name=20M parent=Upload packet-mark=20M queue=PCQ_up_20M
 
ip firewall mangle add chain=forward src-address-list=10M action=mark-connection new-connection-mark=10M passthrough=yes comment="Clients 10Mbits" disabled=no
ip firewall mangle add chain=forward connection-mark=10M action=mark-packet new-packet-mark=10M passthrough=no disabled=no
queue type add name="PCQ_down_10M" kind=pcq pcq-rate=10M pcq-classifier=dst-address
queue type add name="PCQ_up_10M" kind=pcq pcq-rate=10M pcq-classifier=src-address
queue tree add name=down_10M parent=Download packet-mark=10M queue=PCQ_down_10M
queue tree add name=10M parent=Upload packet-mark=10M queue=PCQ_up_10M
 
ip firewall mangle add chain=forward src-address-list=4M action=mark-connection new-connection-mark=4M passthrough=yes comment="Clients 4Mbits" disabled=no
ip firewall mangle add chain=forward connection-mark=4M action=mark-packet new-packet-mark=4M passthrough=no disabled=no
queue type add name="PCQ_down_4M" kind=pcq pcq-rate=4M pcq-classifier=dst-address
queue type add name="PCQ_up_4M" kind=pcq pcq-rate=4M pcq-classifier=src-address
queue tree add name=down_4M parent=Download packet-mark=4M queue=PCQ_down_4M
queue tree add name=4M parent=Upload packet-mark=4M queue=PCQ_up_4M
 
ip firewall mangle add chain=forward src-address-list=2M action=mark-connection new-connection-mark=2M passthrough=yes comment="Clients 2Mbits" disabled=no
ip firewall mangle add chain=forward connection-mark=2M action=mark-packet new-packet-mark=2M passthrough=no disabled=no
queue type add name="PCQ_down_2M" kind=pcq pcq-rate=2M pcq-classifier=dst-address
queue type add name="PCQ_up_2M" kind=pcq pcq-rate=2M pcq-classifier=src-address
queue tree add name=down_2M parent=Download packet-mark=2M queue=PCQ_down_2M
queue tree add name=2M parent=Upload packet-mark=2M queue=PCQ_up_2M
 
ip firewall mangle add chain=forward src-address-list=1M action=mark-connection new-connection-mark=1M passthrough=yes comment="Clients 1Mbits" disabled=no
ip firewall mangle add chain=forward connection-mark=1M action=mark-packet new-packet-mark=1M passthrough=no disabled=no
queue type add name="PCQ_down_1M" kind=pcq pcq-rate=1M pcq-classifier=dst-address
queue type add name="PCQ_up_1M" kind=pcq pcq-rate=1M pcq-classifier=src-address
queue tree add name=down_1M parent=Download packet-mark=1M queue=PCQ_down_1M
queue tree add name=1M parent=Upload packet-mark=1M queue=PCQ_up_1M

Потребителите ще ги описваме в адрес листата на firewall като само задаваме ip адреса и тарифата по този начин.

ip firewall address-list add list=40M address=10.19.1.2
ip firewall address-list add list=40M address=10.19.1.3
ip firewall address-list add list=20M address=10.19.1.4
ip firewall address-list add list=20M address=10.19.1.5
ip firewall address-list add list=10M address=10.19.1.6
ip firewall address-list add list=10M address=10.19.1.7
ip firewall address-list add list=4M address=10.19.1.8
ip firewall address-list add list=4M address=10.19.1.9
ip firewall address-list add list=2M address=10.19.1.0
ip firewall address-list add list=2M address=10.19.1.10
ip firewall address-list add list=1M address=10.19.1.11
ip firewall address-list add list=1M address=10.19.1.12

Общо взето това е всичко, някак си изглежда много сложно пред simple queue но уверявам ви не е. И след като видите с 30% по малко натоварената си машина определено ще разберете, че си е заслужавало труда. ping влезе в нормални стойности, “дропенето” тотално изчезна, двете ядра се товарят равномерно и видимо рутера се справя със ситуацията и ясно се вижда, че може още правила да поеме.
mikrotik queue

mikrotik queue

mikrotik queue

mikrotik queue

optimizing traffic control for isp mikrotik routeros 5 pcq

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.