Using TSDuck ad monitor IP (TS) fluit

Hodie solutiones paratae factae sunt pro magna IP(TS) profluentia, e.g VB и iQmunerum satis locupletem habent ac plerumque magnas operariorum operas cum TV servitiis similes habent solutiones. Hic articulus describitur solutio secundum apertum fontem project TSDuck, destinata ad minimam potestatem IP(TS) fluit utendo contra CC (continuitatem contra) ac bitrate. Applicatio possibilis est vigilantia amissione fasciculorum vel totius fluxus per alveum conductum L2 (quod normaliter monitorari non potest, exempli gratia, legendo calculis damnum in queues).

Brevissime de TSDuck

TSDuck fons apertus est (2-Clause BSD licentia) programmata (copia consolandi utilitates et bibliotheca ad explicandas tuas utilitates vel plugins) ad manipulationem TS rivorum. Prout initus, potest laborare cum IP (multicast/unicast), http, hls, dvb tuners, dektec dvb-asi demodulator, internus TS amnis generator est et e lima legens. Output notare potest fasciculi, IP (multicast/unicast), hls, dektec dvb-asi et HiDes modulatores, histriones (mplayer, vlc, xine) et guttatim. Inter input et output, varias negotiationes processores efficere potes, exempli gratia, PIDs remapping, faciens ruere/discendere, dividere CC calculis, calculare bitrates aliasque operationes typicas pro TS fluminum.

In hoc articulo, IP rivi (multicast) adhibebuntur pro input, processores bitrate_monitoris (ex nomine patet quid hoc est) et continuitas (analysis CC counter) adhibebitur. Sine ullis quaestionibus, IP multicastum reponere potes cum alio input genere suffulti TSDuck.

sunt officialis builds / packages TSDuck ad frequentissimum OS. Nullae sunt pro Debian, sed eas pro Debian 8 et Debian sine ullis quaestionibus scribere potuimus.

Deinceps TSDuck versio 3.19-1520 adhibetur, Linux ut OS (debian 10 ad solutionem parandam adhibebatur), CentOS 7 ad usum actualem adhibitum erat)

Praeparans TSDuck et OS

Ante vigilantiam realem fluit, opus fac ut TSDuck recte operetur et guttae non occurrant in gradu retis vel OS (socket). Hoc requiritur ut postea suspicari non debeas ubi guttae cecidere - in reticulo vel "intra servo." Potes guttas in card retis inhibere cum praecepto ethtool -S ethX, tuning ab eodem ethtool fieri (plerumque debes quiddam RX augere (-G) et interdum aliquas offload disable (-K)). Pro generali commendatione, visum est portum separatum uti ad negotiationem analyticam, si fieri potest, accipiendam, hoc positivis falsis extenuabit ob hoc quod gutta simul in portum analystoris incidit ob praesentiam aliorum negotiationis. Si hoc fieri non potest (uteris mini-computer/NUC uno portu), tunc valde opportune est prioritatem negotiationis analystae configurare respectu reliquarum machinae in quam analystor conectitur. Circa ambitus virtuales, hic diligenter debes invenire et guttas fasciculi a portu physica incipientes invenire et cum applicatione intra machinam virtualem terminare.

Generare et recipere rivum intra exercitum

Primum gradum in TSDuck parando, negotiationem generabimus et intra unum exercitum retibus utentes.

Praeparans ambitum:

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

Amet paratus. Analyser negotiationis launch:

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

ubi "-p 1 -t 1" significat vos postulo ut bitrate computare omnem secundam et informationem proponere de bitrate in secundo.
Deductis negotiationis generans cum celeritate X Mbit / s:

tsp -I craft 
 -P regulate -b 10000000 
 -O ip -p 7 -e --local-port 6000 239.0.0.1:1234

ubi "-p 7 -e" significat quod debes 7 TS packets in 1 IP conleci et facere difficile (-e), i.e. semper exspecta 7 TS packets ab ultimis processus antequam mittat formationis ipsius fasciculi IP.

Analyser incipit nuntiis expectata propono:

* 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

Nunc aliquas guttas addamus:

ip netns exec P iptables -I INPUT -d 239.0.0.1 -m statistic --mode random --probability 0.001 -j DROP

nuntiique sic apparent;

* 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 

quae expectatur. Inactivum fasciculum disable (ip netns exec P iptables -F) et generans bitrate 100 Mbit/s augere conamur. Analystor refert fasciculum errorum CC et circa 75 Mbit/s pro 100. Conamur e figurare quis reprehendat - generans non servare vel quaestionem non esse in eo, hoc facere incipimus generare. certum numerum facis (700000 TS = 100000 IP facis)

# 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

Ut vides, facillime IP generata sunt omnino 100000 (151925460-151825460). Ita figuramus quid cum analysi aguntur, hoc facere quod reprehendo cum RX occurro in veth1, stricte aequale est TX contra in veth0, tunc inspicimus quid agatur in gradu nervus:

# 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 

Hic videre potes numerum guttae = 24355. In TS fasciculis hoc 170485 vel 24.36% 700000 est, ut videmus eadem 25% bitrati damnati esse guttae in UDP nervum. Guttae in UDP nervum plerumque occurrunt ob defectum quiddam, videamus quae defalta nervum quiddam magnitudine et maximi magnitudine nervum quiddam sint:

# sysctl net.core.rmem_default
net.core.rmem_default = 212992
# sysctl net.core.rmem_max
net.core.rmem_max = 212992

Si igitur applicationes non expresse petant magnitudinem quiddam, bases creantur cum quiddam 208 KB, sed si plura petant, adhuc id quod petierunt non accipient. Cum in tsp potes magnitudinem quiddam pro IP input ponere (--buffer-size), non tangemus defaltam nervum magnitudinem, sed solum ponemus magnitudinem maximam nervum quiddam et magnitudinem quiddam expresse per argumenta tsp expresse denota:

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

Cum hoc quiddam nervum iungendum est, bitrate nuntiata nunc circiter 100Mbps sunt, CC errores non sunt.

Consummatio CPU fundatur in ipsa applicatione tsp. Quoad nucleum unum i5-4260U CPU @ 1.40GHz, ad resolvendum fluxum 10Mbit/s, 3-4% CPU requiretur, 100Mbit/s 25%, 200Mbit/s - 46%. Cum damnum% occasum fasciculi, CPU onus paene non augetur (sed minui potest).

In ferramentis fertilioribus, rivos plus 1Gb/s sine ullis problematibus generare et resolvere potuit.

Testis in ipsa network pecto

Post experimentum in par veth, debes accipere duas turmas vel duos portus unius exercitus, coniungere portus inter se, discurrere generans in uno, et analystor in secundo. Nihil hic admiror, sed totum pendet in ferramentis, quo infirmior est, eo plus hic erit.

Accepit data per magna ratio (Zabbix)

tsp non habet aliquem machinae-readabilem API similem SNMP vel similem. CC nuntiis necesse est ut saltem 1 secundo ad tempus aggregari (cum magno centesimae amissionis fasciculi, possunt esse centeni/mille/ decem milia per alterum secundum bitrate).

Quapropter, ut notitias servent et graphas pro CC errores hauriant et aliquantulum accidentia ulterius mordeant, possunt sequentia optiones fieri:

  1. Parse et aggregatum (per CC) tsp output, i.e. transform in formam desideravit.
  2. Adde ipsum tsp et/vel bitrate_monitorem et continuum processus plugins ita ut effectus sit output in forma machinae readable apta rationi vigilantiae.
  3. Applicationem tuam scribe super bibliothecam tsduck.

Patet, secundum laboris impensas, optio 1 simplicissima est, praesertim cum ipsum tsduck in lingua vulgari (per recentiora signa) lingua (C ++) conscriptum esse.

Simplex prototypum parser + aggregatoris in bash monstravit fluxum 10 Mbit/s et 50 fasciculum amissi (pessimi casus), vercundus processus 3—4 temporibus plus CPU consumptus quam ipse processus tsp. Haec missio inconveniens est. Prototypum hoc est fragmen infra

Noodles in basha

#!/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

Praeterquam quod haec ingrata lente operantur, nulla sunt fila normalia in bash, bash jobs processuum independentium sunt et habui scribere valorem absentisPackets semel in secunda parte effectus (cum acceptis nuntiis bitrate secundo secundo venientibus). Quam ob rem bash solus relictus est et fasciculus (parser + aggregator) in golang scribere placuit. Consumptio CPU similium codicis in golang 4-5 temporibus minor est quam ipse processus tsp. Acceleratio involucri ponendo vercundus cum golang circiter 16 vicibus fuit et altiore eventu acceptus est (CPU supra caput per 25% in casu gravissimo). Fons file golang sita est hic.

Deductis fascia

Ad involucrum deducendum, simplex religio templates systemd factum (hic). Ponitur ipsum fasciculum in fasciculum binarium exaratum (ire constructum tsduck-stat.go), situm in /opt/tsduck-stat/. Ponitur golang adhibitum horologii monotonic sustentationem (>=1.9).

Exempli gratia creare opus est ut systemctl currunt mandatum [Inscriptio protected]1234:XNUMX, tunc currunt cum systemctl incipiendi [Inscriptio protected]: 1234.

Inventio de Zabbix

Ut zabbix invenire possit operas cursus. coetus album generans in forma inquisitionis Zabbix, ponitur in eodem loco sita - in /opt/tsduck-stat. Currere inventa per zabbix-agente, debes addere .conf file in indicem cum configurationibus zabbix agentis ut parametri usoris addere.

Zabbix template

Template creatus est (tsduck_stat_template.xml) autodiscovery regulam, elementum, graphum et felis prototypa continet.

Brevis maculosus (quod si aliquis uti voluerit)

  1. Fac quod tsp condiciones "speciales" sub "ideale" facis non cadere (directe connectuntur generans et analyser), si guttae sunt, vide punctum 2 vel textus articuli de hac re.
  2. Hitum fac maximi quiddam nervum (net.core.rmem_max=8388608).
  3. Compilare tsduck-stat.go (ire construere tsduck-stat.go).
  4. Pone munus template in /lib/systemd/system.
  5. Officia incipiunt utentes systemctl, calculi reprehendo qui inceperunt apparere (grep "" /dev/shm/tsduck-stat/*). Numero officiorum numero multicast rivi. Hic debes creare iter ad catervam multicastam, fortasse rp_filter disable vel iter ad fontem ip creare.
  6. Curre invention.sh, fac generat json.
  7. Pone zabbix agente config, sileo agente zabbix.
  8. Formulam ad zabbix adplica, applica ad exercitum in quo vigilantia exercetur et zabbix agentis inauguratus est, circiter 5 minuta expecta, vide ut nova elementa, graphes et triggers apparuerint.

exitum

Using TSDuck ad monitor IP (TS) fluit

Negotium enim cognoscendi fasciculi iacturam fere satis est, saltem nulla vigilantia melior est.

Re quidem vera CC "damna" accidere possunt cum splicatio imaginum fragmentorum (quantum scio, hoc modo insertiones televisificarum localium in Russica Foederatione, i.e. sine recalculando CC occurro) accidere possunt, hoc memorandum est. In solutionibus proprietatis, quaestio haec partim circumvenit detecta SCTE-35 tags (si adduntur a generante flumine).

Ex parte onerariae qualitatis vigilantia, jitter vigilantia non sufficit, quia Instrumentum TV (sive machinis modulatoribus sive fine) ad hunc modulum requisita habet nec semper possibile est jitbuffer indefinite inflare. Et jitter innatare potest, cum transitus instrumentis utitur cum magnis buffers et QoS non configuratur vel satis non configuratur ad talem mercaturam realem tradendam.

Source: www.habr.com

Add a comment