Illum, hemm soluzzjonijiet lesti (proprjetarji) għall-monitoraġġ tal-flussi IP(TS), pereżempju
Fil-qosor ħafna dwar TSduck
TSDuck huwa softwer b'sors miftuħ (liċenzja BSD b'2 Klawżoli) (sett ta' utilitajiet tal-console u librerija għall-iżvilupp ta' utilitajiet jew plugins tad-dwana) għall-manipulazzjoni ta' flussi TS. Bħala input, jista 'jaħdem bl-IP (multicast/unicast), http, hls, dvb tuners, dektec dvb-asi demodulator, hemm ġeneratur intern TS-stream u qari mill-fajls. L-output jista 'jkun bil-miktub għal fajl, IP (multicast/unicast), hls, dektec dvb-asi u modulaturi HiDes, plejers (mplayer, vlc, xine) u qatra. Jistgħu jiġu inklużi diversi proċessuri tat-traffiku bejn l-input u l-output, pereżempju, PID remapping, scrambling / descrambling, analiżi tal-kontro CC, kalkolu tal-bitrate, u operazzjonijiet tipiċi oħra għal flussi TS.
F'dan l-artikolu, IP streams (multicast) se jintużaw bħala input, il-proċessuri bitrate_monitor (mill-isem huwa ċar x'inhu) u kontinwità (analiżi ta 'CC counters) huma użati. Tista 'faċilment tissostitwixxi IP multicast ma' tip ta 'input ieħor appoġġjat minn TSduck.
Huma disponibbli
Sussegwentement, tintuża l-verżjoni TSduck 3.19-1520, tintuża Linux bħala l-OS (debian 10 intuża biex jipprepara s-soluzzjoni, CentOS 7 intuża għal użu reali)
Tħejjija TSduck u OS
Qabel ma timmonitorja l-flussi reali, għandek bżonn tiżgura li TSDuck jaħdem b'mod korrett u m'hemm l-ebda qtar fil-livell tal-kard tan-netwerk jew tal-OS (socket). Dan huwa meħtieġ sabiex ma taqtax aktar tard fejn seħħew il-qtar - fuq in-netwerk jew "ġewwa s-server". Tista 'tiċċekkja qtar fil-livell tal-kard tan-netwerk bil-kmand ethtool -S ethX, l-irfinar isir mill-istess ethtool (ġeneralment, għandek bżonn iżżid il-buffer RX (-G) u xi drabi tiddiżattiva xi offloads (-K)). Bħala rakkomandazzjoni ġenerali, jista 'jiġi avżat li jintuża port separat biex jirċievi t-traffiku analizzat, jekk possibbli, dan jimminimizza pożittivi foloz assoċjati mal-fatt li l-waqgħa seħħet eżattament fuq il-port tal-analizzatur minħabba l-preżenza ta' traffiku ieħor. Jekk dan ma jkunx possibbli (jintuża mini-kompjuter/NUC b'port wieħed), allura huwa ferm mixtieq li tiġi stabbilita l-prijoritizzazzjoni tat-traffiku analizzat fir-rigward tal-bqija fuq l-apparat li miegħu huwa konness l-analizzatur. Rigward ambjenti virtwali, hawnhekk trid toqgħod attent u tkun tista’ ssib packet drops li jibdew minn port fiżiku u jispiċċaw b’applikazzjoni ġewwa magna virtwali.
Ġenerazzjoni u riċeviment ta 'fluss ġewwa l-ospitant
Bħala l-ewwel pass fil-preparazzjoni ta 'TSDuck, aħna se niġġeneraw u nirċievu traffiku fi ħdan host wieħed bl-użu ta' netns.
It-tħejjija tal-ambjent:
ip netns add P #создаём netns P, в нём будет происходить анализ трафика
ip link add type veth #создаём veth-пару - veth0 оставляем в netns по умолчанию (в этот интерфейс будет генерироваться трафик)
ip link set dev veth1 netns P #veth1 - помещаем в netns P (на этом интерфейсе будет приём трафика)
ip netns exec P ifconfig veth1 192.0.2.1/30 up #поднимаем IP на veth1, не имеет значения какой именно
ip netns exec P ip ro add default via 192.0.2.2 #настраиваем маршрут по умолчанию внутри nents P
sysctl net.ipv6.conf.veth0.disable_ipv6=1 #отключаем IPv6 на veth0 - это делается для того, чтобы в счётчик TX не попадал посторонний мусор
ifconfig veth0 up #поднимаем интерфейс veth0
ip route add 239.0.0.1 dev veth0 #создаём маршрут, чтобы ОС направляла трафик к 239.0.0.1 в сторону veth0
L-ambjent huwa lest. Nibdew l-analizzatur tat-traffiku:
ip netns exec P tsp --realtime -t
-I ip 239.0.0.1:1234
-P continuity
-P bitrate_monitor -p 1 -t 1
-O drop
fejn "-p 1 -t 1" tfisser li għandek bżonn tikkalkula l-bitrate kull sekonda u turi informazzjoni dwar il-bitrate kull sekonda
Nibdew il-ġeneratur tat-traffiku b'veloċità ta '10Mbps:
tsp -I craft
-P regulate -b 10000000
-O ip -p 7 -e --local-port 6000 239.0.0.1:1234
fejn "-p 7 -e" tfisser li għandek bżonn tippakkja 7 pakketti TS f'pakkett IP 1 u tagħmel dan iebes (-e), i.e. dejjem stenna 7 pakketti TS mill-aħħar proċessur qabel ma tibgħat pakkett IP.
L-analizzatur jibda joħroġ il-messaġġi mistennija:
* 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/s
Issa żid ftit qtar:
ip netns exec P iptables -I INPUT -d 239.0.0.1 -m statistic --mode random --probability 0.001 -j DROP
u messaġġi bħal dawn jidhru:
* 2020/01/03 14:57:11 - continuity: packet index: 80,745, PID: 0x0000, missing 7 packets
* 2020/01/03 14:57:11 - continuity: packet index: 83,342, PID: 0x0000, missing 7 packets
li huwa mistenni. Itfi telf ta 'pakketti (ip netns exec P iptables -F) u pprova żżid il-bitrate tal-ġeneratur għal 100Mbps. L-analizzatur jirrapporta mazz ta 'żbalji CC u madwar 75 Mbps minflok 100. Qed nippruvaw insemmu min għandu t-tort - il-ġeneratur m'għandux ħin jew il-problema mhix fiha, għal dan nibdew niġġeneraw numru fiss ta' pakketti (700000 pakkett TS = 100000 pakkett IP):
# 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 0
Kif tistgħu taraw, ġew iġġenerati eżattament 100000 pakkett IP (151925460-151825460). Mela ejja naraw x'qed jiġri bl-analizzatur, għal dan niċċekkjaw mal-counter RX fuq veth1, huwa strettament ugwali għall-counter TX fuq veth0, imbagħad inħarsu lejn dak li jiġri fil-livell tas-socket:
# 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
Hawnhekk tista 'tara n-numru ta' qtar = 24355. F'pakketti TS, dan huwa 170485 jew 24.36% ta '700000, għalhekk naraw li dawk l-istess 25% tal-bitrate mitlufa huma qtar fis-sokit udp. Qtar f'socket UDP normalment iseħħ minħabba nuqqas ta 'buffer, ħares lejn id-daqs default tal-buffer tas-socket u d-daqs massimu tal-buffer tas-socket:
# sysctl net.core.rmem_default
net.core.rmem_default = 212992
# sysctl net.core.rmem_max
net.core.rmem_max = 212992
Għalhekk, jekk l-applikazzjonijiet ma jitolbux b'mod espliċitu daqs tal-buffer, is-sokits jinħolqu b'buffer ta' 208 KB, iżda jekk jitolbu aktar, xorta ma jirċievux dak li kien mitlub. Peress li tista 'tissettja d-daqs tal-buffer f'tsp għall-input tal-IP (-buffer-size), aħna mhux se tmiss id-daqs tas-socket default, iżda nissettja biss id-daqs massimu tal-buffer tas-socket u nispeċifika d-daqs tal-buffer b'mod espliċitu permezz tal-argumenti tsp:
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 drop
B'dan l-irfinar tal-buffer tas-socket, issa l-bitrate rrappurtata hija ta 'madwar 100Mbps, m'hemm l-ebda żball CC.
Skont il-konsum tas-CPU tal-applikazzjoni tsp innifsu. Relattivament għal qalba waħda i5-4260U CPU @ 1.40GHz, analiżi tal-fluss 10Mbps se teħtieġ 3-4% CPU, 100Mbps - 25%, 200Mbps - 46%. Meta tissettja l-% Telf ta' Pakketti, it-tagħbija fuq is-CPU prattikament ma tiżdiedx (iżda tista' tonqos).
Fuq ħardwer aktar produttiv, kien possibbli li jiġu ġġenerati u analizzati flussi ta 'aktar minn 1Gb / s mingħajr problemi.
Ittestjar fuq karti tan-netwerk reali
Wara l-ittestjar fuq par veth, għandek bżonn tieħu żewġ hosts jew żewġ portijiet ta 'host wieħed, qabbad il-portijiet ma' xulxin, ibda l-ġeneratur fuq wieħed, u l-analizzatur fuq it-tieni. Ma kien hemm l-ebda sorpriża hawn, iżda fil-fatt dan kollu jiddependi fuq il-ħadid, l-aktar dgħajfa, l-aktar interessanti se jkun hawn.
L-użu tad-dejta riċevuta mis-sistema ta’ monitoraġġ (Zabbix)
tsp m'għandux API li tinqara mill-magni bħal SNMP jew simili. Il-messaġġi CC għandhom jiġu aggregati għal mill-inqas 1 sekonda (b'persentaġġ għoli ta 'telf ta' pakketti, jista 'jkun hemm mijiet/eluf/għexieren ta' eluf kull sekonda, skont il-bitrate).
Għalhekk, sabiex tissejvja kemm l-informazzjoni kif ukoll tiġbed graffs għal żbalji CC u bitrate u tagħmel xi tip ta 'inċidenti, jista' jkun hemm l-għażliet li ġejjin:
- Parse u aggrega (b'CC) l-output ta 'tsp, i.e. jaqilbu fil-forma mixtieqa.
- Lesti tsp innifsu u/jew plugins tal-proċessur bitrate_monitor u kontinwità sabiex ir-riżultat jingħata f'forma li tinqara mill-magni adattata għas-sistema ta 'monitoraġġ.
- Ikteb l-applikazzjoni tiegħek fuq il-librerija tsduck.
Ovvjament, l-għażla 1 hija l-eħfef f'termini ta 'sforz, speċjalment meta wieħed iqis li tsduck innifsu huwa miktub f'lingwa ta' livell baxx (bi standards moderni) (C ++)
Prototip sempliċi bash parser + aggregator wera li fuq fluss ta '10Mbps u telf ta' pakkett ta '50% (l-agħar każ), il-proċess bash ikkunsma 3-4 darbiet aktar CPU mill-proċess tsp innifsu. Dan ix-xenarju huwa inaċċettabbli. Attwalment biċċa minn dan il-prototip hawn taħt
Noodles fuq nett
#!/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
done
Minbarra li jkun bil-mod inaċċettabbli, m'hemm l-ebda ħjut normali f'bash, l-impjiegi bash huma proċessi separati, u kelli nikteb il-valur ta 'missingPackets darba kull sekonda fuq l-effett sekondarju (meta nirċievi messaġġi bitrate li jiġu kull sekonda). Bħala riżultat, bash tħalla waħdu u ġie deċiż li tikteb tgeżwir (parser + aggregator) fil-golang. Il-konsum tas-CPU ta 'kodiċi golang simili huwa 4-5 darbiet inqas mill-proċess tsp innifsu. It-tħaffif tat-tgeżwir minħabba s-sostituzzjoni ta 'bash b'golang irriżulta li kien madwar 16-il darba u b'mod ġenerali r-riżultat huwa aċċettabbli (overhead CPU b'25% fl-agħar każ). Il-fajl tas-sors golang jinsab
Mexxi wrapper
Biex tibda t-tgeżwir, sar l-eħfef mudell tas-servizz għal systemd (
Biex toħloq istanza tas-servizz, trid tħaddem il-kmand ta' abilitazzjoni systemctl [protett bl-email]:1234 imbagħad run b'systemctl start [protett bl-email]: 1234.
Skoperta minn Zabbix
Sabiex zabbix ikun jista' jiskopri servizzi li jmexxu, dan isir
Zabbix template
Lista ta' kontroll qasira (tajjeb, x'jiġri jekk xi ħadd jiddeċiedi li jużaha)
- Kun żgur li tsp ma twaqqax pakketti taħt kundizzjonijiet "ideali" (ġeneratur u analizzatur huma konnessi direttament), jekk ikun hemm qtar, ara l-paragrafu 2 jew it-test tal-artikolu dwar din il-kwistjoni.
- Agħmel irfinar tal-buffer tas-socket massimu (net.core.rmem_max=8388608).
- Ikkompila tsduck-stat.go (mur ibni tsduck-stat.go).
- Poġġi l-mudell tas-servizz f'/lib/systemd/system.
- Ibda s-servizzi b'systemctl, iċċekkja li l-counters bdew jidhru (grep "" /dev/shm/tsduck-stat/*). In-numru ta 'servizzi bin-numru ta' flussi multicast. Hawnhekk jista 'jkollok bżonn toħloq rotta għall-grupp multicast, forsi tiddiżattiva rp_filter jew toħloq rotta għall-ip tas-sors.
- Mexxi discovery.sh, kun żgur li tiġġenera json.
- Żid il-konfigurazzjoni tal-aġent zabbix, ibda mill-ġdid l-aġent zabbix.
- Tella' l-mudell fuq zabbix, applikah mal-host li qed jiġi mmonitorjat u ż-zabbix-agent huwa installat, stenna madwar 5 minuti, ara jekk hemmx oġġetti, graphs u triggers ġodda.
Riżultat
Għall-kompitu ta 'skoperta ta' telf ta 'pakketti, huwa kważi biżżejjed, għall-inqas huwa aħjar minn ebda monitoraġġ.
Tabilħaqq, "telf" CC jista 'jseħħ meta jingħaqdu frammenti tal-vidjo (sa fejn naf jien, dan huwa kif l-inserzjonijiet isiru f'ċentri tat-TV lokali fil-Federazzjoni Russa, jiġifieri mingħajr ma jiġi kkalkulat mill-ġdid il-counter CC), dan għandu jiġi mfakkar. Is-soluzzjonijiet proprjetarji jevadu parzjalment din il-problema billi jiskopru t-tikketti SCTE-35 (jekk miżjuda mill-ġeneratur tan-nixxiegħa).
F'termini ta 'monitoraġġ tal-kwalità tat-trasport, hemm nuqqas ta' monitoraġġ tal-jitter (IAT). It-tagħmir tat-TV (kemm jekk ikun modulaturi jew apparat tat-tarf) għandu rekwiżiti għal dan il-parametru u mhux dejjem ikun possibbli li jintefaħ il-jibuffer għall-infinit. U jitter jista 'float meta tagħmir b'buffers kbar jintuża fi tranżitu u QoS ma jkunx ikkonfigurat jew mhux konfigurat tajjeb biżżejjed biex jittrasmetti tali traffiku f'ħin reali.
Sors: www.habr.com