Вы здесь

HTB: программа для более удобного просмотра состояния классов и u32 фильтров

Приветствую!

Еще в 2007г. для себя написал программу, с помощью которой делал вывод 'tc -s class show ...' и 'tc -s filter show ...' более понятным для прочтения, ибо было крайне неудобно копаться в выводе tc, пытаясь найти и разобрать в куче крайне неудобоваримого текста нужное. Например:

Вывод tc -s class show dev eth3:

class htb 1:2 root rate 100000Kbit ceil 100000Kbit burst 14087b cburst 14087b
 Sent 60076018 bytes 50148 pkt (dropped 0, overlimits 0 requeues 0)
 rate 72bit 0pps backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 1097 ctokens: 1097

class htb 1:3 parent 1:2 rate 50000Kbit ceil 50000Kbit burst 7843b cburst 7843b
 Sent 60076018 bytes 50148 pkt (dropped 0, overlimits 0 requeues 0)
 rate 72bit 0pps backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 1216 ctokens: 1216

class htb 1:4 parent 1:3 leaf 4: prio 0 rate 256000bit ceil 256000bit burst 1631b cburst 1631b
 Sent 154909221 bytes 137570 pkt (dropped 1188, overlimits 0 requeues 0)
 rate 232288bit 22pps backlog 0b 3p requeues 0
 lended: 50148 borrowed: 0 giants: 0
 tokens: 45621 ctokens: 45621

class htb 1:5 parent 1:3 leaf 5: prio 0 rate 96000bit ceil 96000bit burst 1611b cburst 1611b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 rate 0bit 0pps backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 131184 ctokens: 131184

class htb 1:6 parent 1:3 leaf 6: prio 0 rate 5000Kbit ceil 5000Kbit burst 2224b cburst 2224b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 rate 0bit 0pps backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 3476 ctokens: 3476

Вывод tc -s filter show dev eth3:

filter parent 1: protocol ip pref 100 u32
filter parent 1: protocol ip pref 100 u32 fh 800: ht divisor 1
filter parent 1: protocol ip pref 100 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:4  (rule hit 292164192 success 50454)
  match c200ce03/ffffffff at 12 (success 698861 )
  match 00000019/0000ffff at 20 (success 50454 )
filter parent 1: protocol ip pref 100 u32 fh 800::801 order 2049 key ht 800 bkt 0 flowid 1:6  (rule hit 292113593 success 0)
  match c200ce2c/ffffffff at 12 (success 0 )

Что из всего этого делает моя программа:

Class 1:2 RATE: 100000Kbit ; CEIL: 100000Kbit
Current rate: 72bit ; 0pps
Shaper status: Inactive
Dropped: 0

Class 1:2=>1:3 RATE: 50000Kbit ; CEIL: 50000Kbit
Current rate: 72bit ; 0pps
Shaper status: Inactive
Dropped: 0

Class 1:2=>1:3=>1:4 RATE: 256000bit ; CEIL: 256000bit
Current rate: 232288bit ; 22pps
Shaper status: Active, backlog: 0b ; 3p
Dropped: 1188
Associated filters:
From: 194.0.206.3/32 dst port: 25

Class 1:2=>1:3=>1:5 RATE: 96000bit ; CEIL: 96000bit
Current rate: 0bit ; 0pps
Shaper status: Inactive
Dropped: 0

Class 1:2=>1:3=>1:6 RATE: 5000Kbit ; CEIL: 5000Kbit
Current rate: 0bit ; 0pps
Shaper status: Inactive
Dropped: 0
Associated filters:
From: 194.0.206.44/32

Classes total: 5
Total active: 1
Total used: 3

Данные выводятся согласно построенного дерева, а не как попало у tc. Можно посмотреть отдельно только полосы, задерживающие траффик, или через которые проходит траффик.
Если это хоть кому-нибудь может показаться полезным, могу выдать исходник (ebuild тоже могу сделать)...

ЗЫ
Не сочтите за рекламу (да и какая нафиг реклама: не заработка ради все это пишу). Ветку "Системное администрирование" я выбрал исходя из того, что такая вещь может понадобиться только админу.
Да, и еще - я умышленно подправил в class htb 1:4 данные, чтобы получить более наглядный пример полосы, задерживающей траффик. В реальности никаких подтасовок нет. :)

а программа выдает в реальном времени статистику(или хотябы с заданным интервалом)?
Выкладывай, комунить да понадобится

Это не статистика, а более понятная (как мне кажется) замена htb class show dev и htb filter show dev .
Т.е. - после вызова получаем картину, которая есть здесь и сейчас.

Уважаемый, а цена вопроса?

Какая может быть цена? Все совершенно бесплатно. Вот сейчас сижу, исходники причесываю. Надеюсь, через час-полтора выложу ссылку.
Или это в другом смысле вопрос?

Выложил ebuild и исходники. Хотя, если пользоваться ebuild-ом, он все равно сам их оттуда потянет.
Для успешной сборки никаких особых условий не требуется. Главное, чтобы была базовая система.

Снимаю шляпу, даже немного завидую, что учился на автослесаря)

To slepnoga:
Я еще на прошлой неделе получил EMail от форума с текстом вашего личного сообщения по теме топика. В ответ написал личным сообщением в этом форуме. Вы его получали? Мне пришел только EMail, а личное сообщение почему-то нет... Именно поэтому решил на всякий случай переспросить.

Да, и даже посмотрел на сборку - (с точки зрения пейсателя ебилдов) оно не доделано.

Основные претензии к билд-системе: "-j1". цель инсталл, LDFLAGS

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

Понятно. И что надо сделать? Вроде бы там все просто как сапог, а насчет -j1 - нужно ли там больше? Оно и так за 5 секунд собирается

а насчет -j1 - нужно ли там больше? 

Oно должно собиратся при любых значениях MAKEOPTS, а не только -j1 , по крайней мере не вылетать с ошибками.

и можно сделать инсталл в дестдир, а не в /usr/local ?

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

Цитата:
по крайней мере не вылетать с ошибками.

Были вылеты с ошибками? Я крайне удивлен... А можно посмотреть на сообщения?

Цитата:
и можно сделать инсталл в дестдир, а не в /usr/local ?

Не совсем понял... Я сейчас попробовал ebuild собрать - ставится в /usr/sbin... :

[23:06:43]root@xlin64:htbstat/# ebuild htbstat-0.9.ebuild install
 * htbstat-0.9.tar.bz2 RMD160 SHA1 SHA256 size ;-) ...                                          [ ok ]
 * checking ebuild checksums ;-) ...                                                            [ ok ]
 * checking auxfile checksums ;-) ...                                                           [ ok ]
 * checking miscfile checksums ;-) ...                                                          [ ok ]
 * checking htbstat-0.9.tar.bz2 ;-) ...                                                         [ ok ]
>>> Unpacking source...
>>> Unpacking htbstat-0.9.tar.bz2 to /var/tmp/portage/app-misc/htbstat-0.9/work
>>> Source unpacked in /var/tmp/portage/app-misc/htbstat-0.9/work
>>> Compiling source in /var/tmp/portage/app-misc/htbstat-0.9/work/htbstat-0.9 ...
make -j3 -j1
g++ -s -O2 -Wno-write-strings -c collect.cpp
g++ -s -O2 -Wno-write-strings -c a_tcp.cpp
g++ -s -O2 -Wno-write-strings -o htbstat htbstat.cpp collect.o a_tcp.o
>>> Source compiled.
>>> Test phase [not enabled]: app-misc/htbstat-0.9

>>> Install htbstat-0.9 into /var/tmp/portage/app-misc/htbstat-0.9/image/ category app-misc
make -j3 -j1 install
cp -v htbstat /var/tmp/portage/app-misc/htbstat-0.9/image//usr/sbin
`htbstat' -> `/var/tmp/portage/app-misc/htbstat-0.9/image//usr/sbin/htbstat'
>>> Completed installing htbstat-0.9 into /var/tmp/portage/app-misc/htbstat-0.9/image/

Цитата:
Oно должно собиратся при любых значениях MAKEOPTS, а не только -j1

Оно и собирается при любых... См. подсветку жирным шрифтом... /dev-lang/perl тоже так собирается.

Я не претендую на абсолютное знание вопроса, опыта в ebuildо-строении немного, точнее - совсем нет. Этот - первый сделанный. Прошу тапками не кидаться. Отлаживал его не на одной системе, специально пробовал на чужих системах, ошибок не обнаружил, иначе бы не стал выкладывать.
Так что - если все-таки есть ошибки или еще что-то, чего я не учел, пожалуйста, скажите, буду исправлять.

slep@mini ~/slepnoga/portage/app-misc/htbstat $ ebuild htbstat-0.9.ebuild install
 * htbstat-0.9.tar.bz2 RMD160 SHA1 SHA256 size ;-) ...                                                                          [ ok ]
 * checking ebuild checksums ;-) ...                                                                                            [ ok ]
 * checking auxfile checksums ;-) ...                                                                                           [ ok ]
 * checking miscfile checksums ;-) ...                                                                                          [ ok ]
 * checking htbstat-0.9.tar.bz2 ;-) ...                                                                                         [ ok ]
 * CPV:  app-misc/htbstat-0.9                                                                                                         
 * REPO: my-dev                                                                                                                       
 * USE:  amd64 elibc_glibc kernel_linux multilib userland_GNU                                                                         
>>> Unpacking source...                                                                                                               
>>> Unpacking htbstat-0.9.tar.bz2 to /var/tmp/portage/app-misc/htbstat-0.9/work                                                       
>>> Source unpacked in /var/tmp/portage/app-misc/htbstat-0.9/work                                                                     
>>> Preparing source in /var/tmp/portage/app-misc/htbstat-0.9/work/htbstat-0.9 ...                                                    
>>> Source prepared.                                                                                                                  
>>> Configuring source in /var/tmp/portage/app-misc/htbstat-0.9/work/htbstat-0.9 ...                                                  
>>> Source configured.                                                                                                                
>>> Compiling source in /var/tmp/portage/app-misc/htbstat-0.9/work/htbstat-0.9 ...                                                    
make -j4                                                                                                                              
g++ -s -O2 -Wno-write-strings -c collect.cpp                                                                                          
g++ -s -O2 -Wno-write-strings -c a_tcp.cpp                                                                                            
g++ -s -O2 -Wno-write-strings -o htbstat htbstat.cpp collect.o a_tcp.o                                                                
g++: collect.o: Нет такого файла или каталога                                                                                         
g++: a_tcp.o: Нет такого файла или каталога
htbstat.cpp: In function ‘int main(int, char**)’:
htbstat.cpp:51: предупреждение: результат ‘int system(const char*)’, декларированной с атрибутом warn_unused_result, игнорируется
htbstat.cpp:53: предупреждение: результат ‘int system(const char*)’, декларированной с атрибутом warn_unused_result, игнорируется
make: *** [htbstat] Ошибка 1
make: *** Ожидание завершения заданий...
 * ERROR: app-misc/htbstat-0.9 failed:
 *   emake failed

# Copyright 1999-2008 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header:  $

EAPI="2"

inherit eutils

DESCRIPTION="HTB class tree viewer of alexpro (Alexey Prokopchuk)"
HOMEPAGE="http://gentoo.homelan.lg.ua/distrib"
SRC_URI="http://gentoo.homelan.lg.ua/distrib/htbstat-0.9.tar.bz2"

LICENSE="GPL-2"
SLOT="0"
KEYWORDS="~amd64 ~x86"
RDEPEND="sys-apps/iproute2"


src_install() {
        emake DESTDIR=${D} install || die
}
~
"htbstat-0.9.ebuild" 21L, 565C                                                                          

CC=g++
CFLAGS=-s -O2 -Wno-write-strings
OBJS=collect.o a_tcp.o

all: $(OBJS) htbstat

%.o: %.cpp
        $(CC) $(CFLAGS) -c $<

%: %.cpp
        $(CC) $(CFLAGS) -o $@ $< $(OBJS)

$(OBJS): include/collect.h include/a_tcp.h include/int64.h htbstat.h

install: all
        cp -v htbstat $(DESTDIR)/usr/sbin

clean:
        rm -fv htbstat
        rm -fv *.o


Оно и собирается при любых... См. подсветку жирным шрифтом... /dev-lang/perl тоже так собирается.

repoman -v full в в папочке с ебилдом обязателен

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

Про repoman понял, завтра утром будем исправлять...
Вот это:

g++ -s -O2 -Wno-write-strings -c collect.cpp                                                                                          
g++ -s -O2 -Wno-write-strings -c a_tcp.cpp                                                                                            
g++ -s -O2 -Wno-write-strings -o htbstat htbstat.cpp collect.o a_tcp.o                                                                
g++: collect.o: Нет такого файла или каталога                                                                                         
g++: a_tcp.o: Нет такого файла или каталога

меня крайне удивило. Судя по логу - файлы *.o должны быть собраны. Хотя, если '-j4', то может быть, надо попробовать... Я '-j1' воткнул только потому, что не был уверен, что он соберется многопоточно.
Кстати, а можно узнать, какой версии portage? У себя поставлю, проверю. И на чужих системах проверю по возможности.

Кстати, а можно узнать, какой версии portage

могу тестить на любой , этот вывод с rc56

2 . меик не подхватывает мои флаги , что сделать понятно ( типа CFLAGS="$CFLAGS ваши флаги"), но это не Ъ

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

Исправлен Makefile, теперь все собирается хоть -j1, хоть -j100, и с CFLAGS все ОК.
Исправлен ebuild в соответствии с рекомендациями и требованиями repoman-a. Результат repoman лежит в каталоге ebuild-a (repoman-result.txt).
Попробуйте сейчас, все ли в порядке. Я проверял на нескольких системах - все нормально.
Вот ebuild и исходники.

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)