Praegu on olemas valmis (patenditud) lahendused IP(TS)-voogude jĂ€lgimiseks, nĂ€iteks ja , need pakuvad ĂŒsna laia funktsioonide valikut ja sellised lahendused on tavaliselt suurte operaatorite kĂ€sutuses, kes tegelevad TV-teenustega. Selles artiklis kĂ€sitletakse avatud lĂ€htekoodiga projektil pĂ”hinevat lahendust , mis on mĂ”eldud IP(TS)-voogude minimaalseteks jĂ€lgimiseks CC (continuity counter) ja bitikiiruselt. Ăks vĂ”imalik rakendusala on pakettide vĂ”i voogude kadumise kontrollimine renditud L2-kanali kaudu (mida ei saa normaalselt jĂ€lgida, nĂ€iteks kaotuse arvestite lugemise kaudu jĂ€rjekordades).
TSDuckist lĂŒhidalt
TSDuck on avatud lĂ€htekoodiga (2-Clause BSD litsents) tarkvara (konsol utiliitide komplekt ja raamatukogu oma utiliitide vĂ”i pluginite arendamiseks) TS-voogude manipuleerimiseks. Sisendina suudab see töötada IP (multicast/unicast), http, hls, dvb-tuunerite, dektec dvb-asi demodulaatoriga, sisaldab sisseehitatud TS-voo generaatorit ja faili lugemist. VĂ€ljundina saab see salvestada faili, IP (multicast/unicast), hls, dektec dvb-asi ja HiDes modulaatoritesse, mĂ€ngijatesse (mplayer, vlc, xine) ja drop. Sisse- ja vĂ€ljundide vahel saab kasutada erinevaid liiklustöötlejaid, nĂ€iteks PID-de ĂŒmberkaardistamine, krĂŒptimine/dekrĂŒptimine, CC-loendurite analĂŒĂŒs, bitikiirusetabeli arvutamine ja teised tĂŒĂŒpilised TS-voogude toimingud.
Selles artiklis kasutatakse sisendina IP-vooge (multicast), kasutades bitrate_monitor (nimest on selge, mis see on) ja continuity (CC-loendurite analĂŒĂŒs) töötlejat. Probleemideta saab IP multicast vahetada mĂ”ne muu TSDucki toetatud sisendiviisi vastu.
On olemas TSDuck enamikule kaasaegsetele opsĂŒsteemidele. Debianile neid ei ole, kuid Debian 8 ja Debian 10 jaoks Ă”nnestus need probleemideta kokku panna.
Kasutatakse TSDuck versiooni 3.19-1520, opsĂŒsteemina on Linux (lahenduse ettevalmistamiseks kasutati debian 10, tĂ”eliseks kasutamiseks â CentOS 7)
TSDucki ja opsĂŒsteemi ettevalmistamine
Enne kui hakkate jĂ€lgima reaalseid vooge, veenduge, et TSDuck töötab korralikult ning et vĂ”rgukaardi vĂ”i operatsioonisĂŒsteemi (soketi) tasemel ei esine katkestusi. See on vajalik, et hiljem ei peaks arutama, kus katkestused toimusid â kas vĂ”rgus vĂ”i "serveri sees". Katkestusi vĂ”rgu tasemel saab kontrollida kĂ€suga ethtool -S ethX, hÀÀlestust teostatakse sama ethtooliga (tavaliselt tuleb suurendada RX-puhvrit (-G) ja mĂ”nikord keelata mĂ”ned offload'id (-K)). Ăhe ĂŒldise soovitusena vĂ”iks soovitada kasutada analĂŒĂŒsitava liikluse vastuvĂ”tmiseks eraldi porti, kui see on vĂ”imalik, see minimeerib valehĂ€ireid, mis vĂ”ivad tekkida, kui katkestus toimub analĂŒsaatori pordis teiste liikluse tĂ”ttu. Kui sellist vĂ”imalust ei ole (kasutatakse miniarvutit/NUC-d ĂŒhe pordiga), siis on vĂ€ga soovitatav seadistada analĂŒĂŒsitava liikluse prioriteet muudele seadmel, kuhu analĂŒsaator on ĂŒhendatud. Virtuaalsete keskkondade osas tuleb olla ettevaatlik ja osata leida katkestusi, alustades fĂŒĂŒsilisest pordist ja lĂ”petades rakendusega virtuaalmajas.
Voogude genereerimine ja vastuvÔtt hosti sees
Esimese sammuna TSDuck'i ettevalmistamisel genereerime ja vĂ”tame vastu liiklust ĂŒhe hosti sees, kasutades netns.
Valmistame keskkonna ette:
ip netns add P #loome netns P, kus toimub liikluse analĂŒĂŒs
ip link add type veth #loome veth-paar - veth0 jÀÀb vaikimisi netns-i (sellele liidesele genereeritakse liiklus)
ip link set dev veth1 netns P #veth1 - paigutame netns P-sse (sellel liidesele toimub liikluse vastuvÔtt)
ip netns exec P ifconfig veth1 192.0.2.1/30 up #tÔstame IP veth1-le, pole oluline, mis see on
ip netns exec P ip ro add default via 192.0.2.2 #seame vaikimisi marsruudi netns P sees
sysctl net.ipv6.conf.veth0.disable_ipv6=1 #lĂŒlitame IPv6 vĂ€lja veth0-l - see tehakse, et TX loendisse ei satuks kĂ”rvaline mĂŒra
ifconfig veth0 up #tÔstame liidese veth0
ip route add 239.0.0.1 dev veth0 #loome marsruudi, et OS suunaks liikluse 239.0.0.1 suunas veth0-leKeskkond on valmis. KĂ€ivitame liikluse analĂŒsaatori:
ip netns exec P tsp --realtime -t
-I ip 239.0.0.1:1234
-P continuity
-P bitrate_monitor -p 1 -t 1
-O dropkus â-p 1 -t 1â tĂ€hendab, et bitikiirus arvutatakse iga sekundi tagant ja bitikiirusest teave kuvatakse iga sekundi tagant
KĂ€ivitame liikluse generaatori kiirusel 10 Mbit/s:
tsp -I craft
-P regulate -b 10000000
-O ip -p 7 -e --local-port 6000 239.0.0.1:1234kus «-p 7 -e» tÀhendab, et tuleb pakkida 7 TS-paketti 1 IP-paketiks ja teha seda range seadistusega (-e), st alati oodata viimase protsessori kÀest 7 TS-paketti enne IP-paketi saatmist.
AnalĂŒsaator hakkab kuvama oodatud teateid:
* 2020/01/03 14:55:44 - bitrate_monitor: 2020/01/03 14:55:44, TS bitrate: 9,970,016 bits/s
* 2020/01/03 14:55:45 - bitrate_monitor: 2020/01/03 14:55:45, TS bitrate: 10,022,656 bits/s
* 2020/01/03 14:55:46 - bitrate_monitor: 2020/01/03 14:55:46, TS bitrate: 9,980,544 bits/sNĂŒĂŒd lisame veidi katkestusi:
ip netns exec P iptables -I INPUT -d 239.0.0.1 -m statistic --mode random --probability 0.001 -j DROPja ilmnevad sellised teated:
* 2020/01/03 14:57:11 - continuity: paket indeks: 80,745, PID: 0x0000, 7 paketti puuduvad
* 2020/01/03 14:57:11 - continuity: paket indeks: 83,342, PID: 0x0000, 7 paketti puuduvad mis on oodatud. LĂŒlitame katkestuste kaotamise vĂ€lja (ip netns exec P iptables -F) ja proovime suurendada generaatori bitrate'i 100 Mbit/s. AnalĂŒsaator teatab hulgaliselt CC- vigu ja umbes 75 Mbit/s asemel 100. Proovime vĂ€lja selgitada, kas sĂŒĂŒdi on generaator vĂ”i on probleem mujal, selleks kĂ€ivitame fikseeritud arvu paketid (700000 TS-paketti = 100000 IP-paketti):
# ifconfig veth0 | grep TX
TX packets 151825460 bytes 205725459268 (191.5 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# tsp -I craft -c 700000 -P regulate -b 100000000 -P count -O ip -p 7 -e --local-port 6000 239.0.0.1:1234
* count: PID 0 (0x0000): 700,000 packets
# ifconfig veth0 | grep TX
TX packets 151925460 bytes 205861259268 (191.7 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0Nagu nĂ€ha, on genereeritud tĂ€pselt 100000 IP-paketti (151925460-151825460). Seega uurime, mis toimub analĂŒsaatoriga, selleks vĂ”rreldes RX loenduri vÀÀrtusega veth1-l, mis on tĂ€pselt vĂ”rdne TX loenduri vÀÀrtusega veth0-l, ja seejĂ€rel vaatame, mis toimub soketitasemel:
# ip netns exec P cat /proc/net/udp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops
133: 010000EF:04D2 00000000:0000 07 00000000:00000000 00:00000000 00000000 0 0 72338 2 00000000e0a441df 24355 Siin on nÀhtav kadude arv = 24355. TS-pakettides on see 170485 ehk 24,36% 700000-st, seega nÀeme, et need 25% kadunud bittide voogus on kadud UDP-soketis. Kadud UDP-soketis tekivad tavaliselt mÀlu puuduse tÔttu, vaatame, kui suur on vaikimisi soketi puhver ja maksimaalne soketi puhver:
# sysctl net.core.rmem_default
net.core.rmem_default = 212992
# sysctl net.core.rmem_max
net.core.rmem_max = 212992Seega, kui rakendused ei kĂŒsi puhvri suurust selgelt, luuakse soketid puhvri suurusega 208 Kb, kuid kui kĂŒsitakse rohkem, siis ei saada ikkagi soovitud suurust. Kuna tsp jaoks IP-sisendi puhul on vĂ”imalik mÀÀrata puhvri suurus (âbuffer-size), siis ei puuduta vaikimisi soketi suurust, vaid mÀÀrame vaid maksimaalse soketi puhvri suuruse ja mÀÀrame puhvri suuruse selgelt tsp argumentide kaudu:
sysctl net.core.rmem_max=8388608
ip netns exec P tsp --realtime -t -I ip 239.0.0.1:1234 -b 8388608 -P continuity -P bitrate_monitor -p 1 -t 1 -O dropSellise soketi puhvri hÀÀlestamisega on nĂŒĂŒd raporteeritud bittide voog umbes 100 Mbit/s, CC-vigu ei esine.
TSP rakenduse poolt CPU kasutamine. Ăhe i5-4260U CPU @ 1,40 GHz tuuma puhul 10 Mbit/s voogude analĂŒĂŒsimiseks kulub 3-4% CPU, 100 Mbit/s â 25%, 200 Mbit/s â 46%. Pakettide kaotusprotsendi mÀÀramisel CPU koormus praktiliselt ei suurene (aga vĂ”ib vĂ€heneda).
TĂ”husamal riistvaral on probleemideta suudetud genereerida ja analĂŒĂŒsida vooge ĂŒle 1 Gbit/s.
Testimine reaalsel vÔrgukaardil
PĂ€rast testimist veth-paaril tuleb vĂ”tta kaks hosti vĂ”i ĂŒhe hosti kaks porti, ĂŒhendada portidega omavahel, ĂŒhel kĂ€ivitada generaator, teisel analĂŒsaator. Siin ei juhtunud ĂŒllatusi, kuid tegelikult sĂ”ltub see kĂ”ik riistvarast â mida nĂ”rgem, seda huvitavam see siin on.
Saadud andmete kasutamine monitooringusĂŒsteemis (Zabbix)
TSP-l ei ole mingit masinloetavat API-d nagu SNMP vĂ”i sarnast. CC-sĂ”numeid tuleb koondada vĂ€hemalt 1 sekundi kaupa (kui pakettide kaotusprotsent on kĂ”rge, vĂ”ivad neid olla sadades, tuhandes vĂ”i kĂŒmnetes tuhandetes sekundis, sĂ”ltuvalt bitimÀÀrast).
Seega, et sÀilitada nii teavet kui ka joonistada graafikud CC-vigadest ja bitimÀÀrast ning teha mÔningaid avariid, vÔivad jÀrgmised variandid olla:
- Parse ja koguda (CC jÀrgi) tsp vÀljundit, st muuta see vajaliku vormi.
- TĂ€iendada ise tsp ja/vĂ”i protsessoripluginaid bitrate_monitor ja continuity, et tulemus oleks masinloetaval kujul, mis sobib monitooringusĂŒsteemile.
- Kirjutada oma rakendus tsduck raamatukogu peal.
Ilmselgelt on töömahtude aspektist variant 1 kÔige lihtsam, eriti arvestades, et ise tsduck on kirjutatud madala taseme (kaasaegsete mÔÔdikute jÀrgi) keeles (C++).
Lihtne parser+agregaatori prototĂŒĂŒp bashis nĂ€itas, et 10Mbit/s voolul ja 50% pakettide kadumise (halvim variant) korral tarbis bashiprotsess 3-4 korda rohkem CPU-d kui tsp protsess ise. Selline arengu variant on vastuvĂ”etamatu. Siin on osa sellest prototĂŒĂŒbist.
Bashi nuudlid
#!/usr/bin/env bash
missingPackets=0
ccErrorSeconds=0
regexMissPackets='^* (.+) - continuity:.*missing ([0-9]+) packets$'
missingPacketsTime=""
ip netns exec P tsp --realtime -t -I ip -b 8388608 "239.0.0.1:1234" -O drop -P bitrate_monitor -p 1 -t 1 -P continuity 2>&1 |
while read i
do
#line example:* 2019/12/28 23:41:14 - continuity: packet index: 6,078, PID: 0x0100, missing 5 packets
#line example 2: * 2019/12/28 23:55:11 - bitrate_monitor: 2019/12/28 23:55:11, TS bitrate: 4,272,864 bits/s
if [[ "$i" == *continuity:* ]]
then
if [[ "$i" =~ $regexMissPackets ]]
then
missingPacketsTimeNew="${BASH_REMATCH[1]}" #timestamp (seconds)
if [[ "$missingPacketsTime" != "$missingPacketsTimeNew" ]] #new second with CC error
then
((ccErrorSeconds += 1))
fi
missingPacketsTime=$missingPacketsTimeNew
packets=${BASH_REMATCH[2]} #TS missing packets
((missingPackets += packets))
fi
elif [[ "$i" == *bitrate_monitor:* ]]
then
: #...
fi
doneLisaks sellele, et see töötab ebanormaalselt aeglaselt, puuduvad bash'is normaalsed lĂ”imed, bash tööd on iseseisvad protsessid ja tuli iga sekundi jooksul salvestada vÀÀrtus missingPackets kĂŒlgefektina (saades iga sekundi jooksul bittide kiirusest teateid). LĂ”puks jĂ€eti bash rahule ja otsustati kirjutada golangâis wrapper (parser + agregaat). CPU tarbimine sarnase koodi puhul golangâis on 4-5 korda vĂ€iksem kui tsp protsessi puhul. Wrapperi kiirus golangâi kasutamise tĂ”ttu paraneb ligikaudu 16 korda ja ĂŒldiselt on tulemus vastuvĂ”etav (CPU ĂŒlejÀÀk kĂ”ige halvemal juhul 25%). Algne fail golang'is asub .
Wrapperi kÀivitamine
Wrapperi kĂ€ivitamiseks on loodud lihtne teenusemall systemd jaoks (). Eeldatakse, et wrapper on kompileeritud binaarfailiks (go build tsduck-stat.go), mis on paigutatud /opt/tsduck-stat/. Eeldatakse, et kasutatakse golangâi, mis toetab monotonic kellale (>=1.9).
Teenuse eksemplari loomiseks tuleb kÀivitada kÀsk systemctl enable tsduck-stat@239.0.0.1:1234, seejÀrel algatada kasutades systemctl start tsduck-stat@239.0.0.1:1234.
Discovery Zabbixist
Kuna zabbix peab suunatud teenuste avastamiseks looma (discovery.sh), Zabbixi avastamiseks vajalikus formaadis, eeldatakse, et see on seal samas â /opt/tsduck-stat. Avasta Zabbix-agentiga seotud kĂ€ivitamiseks tuleb lisada zabbix-agendi konfigureerimise kausta, et lisada user-parameeter.
Zabbixi mall
(tsduck_stat_template.xml) sisaldab automaatavastamise reeglit, andmeelementide, diagrammide ja signaalide prototĂŒĂŒpe.
LĂŒhike kontrollnimekiri (juhuks kui keegi soovib kasutada)
- Veendu, et tsp ei kukuta pakette 'ideaalses' keskkonnas (generaator ja analĂŒsaator on otse ĂŒhendatud), kui kukkumisi on, vaata p.2 vĂ”i artikli teksti selle kohta.
- Tee maksimum soketi puhvri hÀÀlestamine (net.core.rmem_max=8388608).
- Kompileeri tsduck-stat.go (go build tsduck-stat.go).
- Aseta teenuse mall /lib/systemd/system.
- KÀivita teenused systemctl abil, kontrolli, et loendurid hakkavad ilmuma (grep «» /dev/shm/tsduck-stat/*). Teenuste arv peab vastama multicasti voogude arvule. Siin vÔib olla vajalik luua marsruut multicasti gruppi, vÔib-olla deaktiveerida rp_filter vÔi luua marsruut source ip jaoks.
- KĂ€ivita discovery.sh, veendu, et see genereerib json.
- Sisesta zabbix-agendi konfiguratsioon, taaskÀivita zabbix-agent.
- Laadi mall fail zabbix, rakenda see hostile, kus toimub jÀlgimine ja on installitud zabbix-agent, oota umbes 5 minutit, vaata, et uued andmeelemendid, graafikud ja triggarid on ilmunud.
Tulemus

Pakettide kaotuse tuvastamiseks on see peaaegu piisav, parem on kui mitte mingit jÀlgimist.
TĂ”epoolest, CC-"kaotused" vĂ”ivad tekkida videofragmente ĂŒhendades (kui ma Ă”igesti tean, nii tehakse sisestusi kohalikes telejaamades Venemaal, st CC-arvesti ei arvestata), seda tuleb meeles pidada. Proprietaarsetes lahendustes on see probleem osaliselt mööda hiilimiseks SCTE-35 mĂ€rkide tuvastamine (kui need lisatakse voogedastuse generaatoriga).
Transpordi kvaliteedi jĂ€lgimise seisukohalt puudub jitter (IAT) jĂ€lgimine, kuna TV-seadmed (olgu need modulaatorid vĂ”i lĂ”ppseadmed) vajavad seda parameetrit ning jitbufferit ei saa alati lĂ”pmatuseni suurendada. Jitter vĂ”ib muutuda, kui ĂŒlekandel kasutatakse suurte puhverdatud seadmeid ja QoS ei ole sarnase reaalajas liikluse edastamiseks seadistatud vĂ”i pole piisavalt hĂ€sti seadistatud.
Allikas: habr.com
