L-użu ta 'TSDuck biex Tissorvelja IP(TS) Streams

Illum, hemm soluzzjonijiet lesti (proprjetarji) għall-monitoraġġ tal-flussi IP(TS), pereżempju VB и iQ, għandhom sett ta 'funzjonijiet pjuttost għani u ġeneralment operaturi kbar li jittrattaw servizzi tat-TV għandhom soluzzjonijiet bħal dawn. Dan l-artikolu jiddeskrivi soluzzjoni bbażata fuq proġett open source TSduck, iddisinjat għal kontroll minimu ta 'flussi ta' IP(TS) permezz ta 'CC(countinity counter) counter u bitrate. Applikazzjoni possibbli hija li tikkontrolla t-telf ta 'pakketti jew il-fluss kollu minn kanal L2 mikrija (li ma jistax jiġi mmonitorjat normalment, pereżempju, billi jinqara l-counters tat-telf fil-kjuwijiet).

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 bini/pakketti uffiċjali TSduck għall-biċċa l-kbira tas-sistemi operattivi attwali. Mhumiex disponibbli għal Debian, iżda rnexxielna nibnuhom taħt debian 8 u debian 10 mingħajr problemi.

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:

  1. Parse u aggrega (b'CC) l-output ta 'tsp, i.e. jaqilbu fil-forma mixtieqa.
  2. 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ġġ.
  3. 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 hawn.

Mexxi wrapper

Biex tibda t-tgeżwir, sar l-eħfef mudell tas-servizz għal systemd (hawn). It-tgeżwir innifsu suppost jiġi kkompilat f'fajl binarju (go build tsduck-stat.go) li jinsab f'/opt/tsduck-stat/. Huwa preżunt li qed tuża golang b'appoġġ għal arloġġ monotoniku (>=1.9).

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 ġeneratur tal-lista tal-grupp (discovery.sh), fil-format meħtieġ għall-iskoperta ta 'Zabbix, huwa preżunt li jinsab fl-istess post - f' /opt/tsduck-stat. Biex tmexxi l-iskoperta permezz ta 'zabbix-agent, trid iżżid fajl .conf għad-direttorju tal-konfigurazzjoni zabbix-agent biex iżżid il-parametru tal-utent.

Zabbix template

Mudell maħluq (tsduck_stat_template.xml) fih ir-regola ta' skoperta awtomatika, prototipi ta' oġġetti, graffs u triggers.

Lista ta' kontroll qasira (tajjeb, x'jiġri jekk xi ħadd jiddeċiedi li jużaha)

  1. 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.
  2. Agħmel irfinar tal-buffer tas-socket massimu (net.core.rmem_max=8388608).
  3. Ikkompila tsduck-stat.go (mur ibni tsduck-stat.go).
  4. Poġġi l-mudell tas-servizz f'/lib/systemd/system.
  5. 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.
  6. Mexxi discovery.sh, kun żgur li tiġġenera json.
  7. Żid il-konfigurazzjoni tal-aġent zabbix, ibda mill-ġdid l-aġent zabbix.
  8. 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

L-użu ta 'TSDuck biex Tissorvelja IP(TS) Streams

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

Żid kumment