Posts Tagged ‘код’

pgmproxy

Sunday, September 3rd, 2017

На FOSDEM 2016 видео потоците в локалната мрежа бяха носени през UDP, което при загуби по мрежата водеше до разни неприятни прекъсвания и обърквания на ffmpeg-а.

След разговори по темата за мрежа без загуби, пакети, пренасяни от еднорози и изграждане на infiniband мрежа в ULB, бях стигнал до идеята да търся или нещо с forward error correction, или някакъв reliable multicast. За FEC се оказа, че има някаква реализация от едно време за ffmpeg за PRO-MPEG, която не е била приета по някакви причини, за reliable multicast открих два протокола – PGM и NORM.

За PGM се оказа, че има хубава реализация, която 1) я има в Debian, 2) има прилични примери и 3) може да има средно ужасна документация, но source е сравнително четим и става за дебъгване. Измъкнах си старото ttee, разчистих кода от разни ненужни неща и си направих едно тривиално proxy, което да разнася пакети между UDP и PGM (и stdin/stdout за дебъгване). Може да се намери на https://github.com/krokodilerian/pgmproxy, като в момента е в proof-of-concept състояние и единственото, което мога да кажа е, че успявам да прекарам през него един FLAC през мрежата и да го слушам :) Следват тестове в мрежа със загуби (щото в моя локален wifi са доста малко) и доизчистване, че да го ползваме на FOSDEM.

2013-03-24 traffic analysis tool

Monday, March 25th, 2013

(докъде стигнах, да качвам код в github)

https://github.com/krokodilerian/trafstat.git

Система за събиране и анализ на трафик, базирано на tcp retransmit-и и bgp routing таблици.

Аз я използвам на няколко места да си анализирам трафика и да го балансирам откъде да минава. Имаме пусната една версия на ts.hahpss.com, на която може да гледате от един български сайт как изглежда трафика към вас.

Системата за мен е много по-хубава от различните варианти с ping от време на време (smokeping, mtr и т.н.), понеже е върху целия трафик на web сървъра, който реално потребителите виждат, а не нещо, което може да има различно поведение и различни shaper-и.

Кодът е леко допипнат, за да става за публична употреба, но има още доста да се желае (например трябва да сложа един __packed__ атрибут на една структура, дето пращам по мрежата). В момента може да се каже, че е в works-for-me версия, но мисля, че повечето админи биха се справили да го подкарат при себе си. Изисква да може да си пипнете web сървъра и да може да вземете отнякъде read-only BGP feed.

Състои се от няколко компонента:

– модул за nginx, който за всеки request взима колко трафик е направен, колко е било mss-то на връзката (за да може да се изчисли броя сегменти) и броя tcp retransmit-и, и го праща до един централен сървър по UDP. Мариян е навит да напише същия модул за apache.

– сървър, който получава udp пакетите и ги пише във файл (реално може да прави директно заявки в базата и може да го оправя в бъдеще).

– cron script, който попълва в базата данни за всички router-и, за които знае системата routing таблиците им (prefix-и и aspath-ове).

– друг cron script, който на колкото-време-му-кажете хваща лога на демона, сдъвква го и вади заявки, с които да запише трафика по префикси и типове.

– още един скрипт, който веднъж на час почиства нулевите редове и архивира данните в една таблица, за да може да се анализират (т.е. дава ви почасови данни).

Има и някакви визуализиращи неща, които ще се появят по-късно.

Не съм решил какъв да е лиценза, защото и вътре има няколко неща, които не са мои (bgpdump от ripe), приемам идеи.

Threaded tee

Saturday, July 21st, 2012

Понеже не намерих нещо такова (след малко търсене) преправих един стар source да прави нещо като unix-кото tee, но thread-нато и без да пише на stdout. Трябваше ми, за да мога да записвам изхода на dvgrab и едновременно с това да го пращам към vlc, което да го stream-ва навън.

Може да се свали от /progs/ttee-0.1.tgz. Има някакви остатъци от старата задачка вътре (която беше нещо такова, само че с четене от unix domain datagram socket и само един output, в mysql), ако някой много много много държи, може да си го качи някъде в github, само да каже да сипя вътре в архива, че е public domain като лиценз.
(а по някое време мисля да напиша подробно за как stream-ваме и записваме в initLab)

Update: Оправена версия – /progs/ttee-0.2.tgz, с нормален ring buffer и с малко git history вътре.
Update 2: Работеща версия – /progs/ttee-0.3.tgz, оправени няколко бъга, които водеха до загуба на данни.
(решението ми хрумна в 4:30 сутринта и вместо да спя, patch-вах)