Mampiasa TSDuck hanaraha-maso ny renirano IP(TS).

Amin'izao fotoana izao, misy vahaolana efa vita (proprietary) ho an'ny fanaraha-maso ny renirano IP (TS), ohatra VB ΠΈ iQ, manana sehatra maro be izy ireo ary matetika ireo mpandraharaha lehibe mifandray amin'ny serivisy fahitalavitra dia manana vahaolana toy izany. Ity lahatsoratra ity dia mamaritra vahaolana mifototra amin'ny tetikasa open source TSDuck, natao ho an'ny fanaraha-maso kely indrindra ny IP(TS) stream amin'ny alΓ lan'ny CC(continuity counter) counter sy bitrate. Ny fampiharana azo atao dia ny fanaraha-maso ny fahaverezan'ny fonosana na ny fikorianan'ny rehetra amin'ny alΓ lan'ny fantsona L2 nofaina (izay tsy azo araha-maso ara-dalΓ na, ohatra, amin'ny alΓ lan'ny famakiana ny kaontera very amin'ny filaharana).

Tena fohy momba ny TSDuck

TSDuck dia rindrankajy open source (licence 2-Clause BSD) (fitaovana fampiononana sy tranomboky ho an'ny fampivoarana kojakoja manokana na plugins) ho an'ny fanodikodinana ny renirano TS. Amin'ny maha-input azy dia afaka miasa amin'ny IP (multicast/unicast), http, hls, dvb tuners, dektec dvb-asi demodulator, misy TS-stream generator anatiny sy mamaky avy amin'ny rakitra. Ny vokatra dia azo soratana amin'ny rakitra, IP (multicast/unicast), hls, dektec dvb-asi ary HiDes modulators, mpilalao (mplayer, vlc, xine) ary mitete. Azo ampidirina eo anelanelan'ny fampidirana sy ny vokatra ny processeurs fifamoivoizana isan-karazany, ohatra, ny famerenan'ny PID, ny fikojakojana / ny famotsorana, ny famakafakana CC counter, ny kajy bitrate, ary ny asa mahazatra hafa ho an'ny renirano TS.

Ato amin'ity lahatsoratra ity, ny IP streams (multicast) dia hampiasaina ho fampidirana, ny processeurs bitrate_monitor (avy amin'ny anarana dia mazava hoe inona izany) ary ny fitohizana (famakafakana ny CC counters) no ampiasaina. Azonao atao ny manolo mora ny IP multicast amin'ny karazana fampidirana hafa tohanan'ny TSDuck.

Azo atao fananganana / fonosana ofisialy TSDuck ho an'ny ankamaroan'ny rafitra miasa ankehitriny. Tsy misy amin'ny Debian izy ireo, fa nahavita nanangana azy ireo tamin'ny debian 8 sy debian 10 tsy nisy olana izahay.

Manaraka, ny version TSDuck 3.19-1520 dia ampiasaina, Linux no ampiasaina ho OS (debian 10 no nampiasaina hanomanana ny vahaolana, CentOS 7 no nampiasaina ho an'ny tena fampiasana)

Manomana TSDuck sy OS

Alohan'ny hanaraha-maso ny fikorianan'ny tena dia mila mahazo antoka ianao fa miasa tsara ny TSDuck ary tsy misy latsaka amin'ny haavon'ny karatra tambajotra na OS (socket). Ilaina izany mba tsy haminavina any aoriana hoe aiza no nitrangan'ny rotsak'orana - tao amin'ny tambajotra na "ao anaty server". Azonao atao ny manamarina ny latsaka amin'ny haavon'ny karatra tambajotra miaraka amin'ny baiko ethtool -S ethX, ny ethtool dia atao amin'ny alΓ lan'ny ethtool (matetika, mila mampitombo ny buffer RX (-G) ianao ary indraindray manafoana ny enta-mavesatra (-K)). Amin'ny maha-tolo-kevitra ankapobeny, dia azo atao ny manoro hevitra ny hampiasa seranan-tsambo mitokana handraisana ny fifamoivoizana nodinihina, raha azo atao, dia manamaivana ny fahatsarana diso mifandraika amin'ny zava-misy fa teo amin'ny seranan-tsambo analyzera no nitrangan'izany noho ny fisian'ny fifamoivoizana hafa. Raha tsy azo atao izany (mini-solosaina / NUC amin'ny seranan-tsambo iray no ampiasaina), dia tena ilaina ny manamboatra ny laharam-pahamehana amin'ny fifamoivoizana voadinika mifandraika amin'ny ambiny amin'ny fitaovana izay mifandray amin'ny analyse. Mikasika ny tontolo virtoaly, eto dia mila mitandrina ianao ary afaka mahita ny packet drops manomboka amin'ny seranana ara-batana ary mifarana amin'ny fampiharana ao anaty milina virtoaly.

Famoronana sy fandraisana ny renirano ao anatin'ny mpampiantrano

Ho dingana voalohany amin'ny fanomanana TSDuck, dia hamokatra sy hahazo fifamoivoizana ao anatin'ny mpampiantrano tokana mampiasa netns.

Fanomanana ny tontolo iainana:

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

Efa vonona ny tontolo iainana. Manomboka ny mpandinika fifamoivoizana izahay:

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

izay "-p 1 -t 1" dia midika fa mila manao kajy ny bitrate isaky ny segondra ianao ary mampiseho fampahalalana momba ny bitrate isaky ny segondra
Manomboka amin'ny hafainganam-pandeha 10Mbps ny mpamokatra fifamoivoizana:

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

izay ny "-p 7 -e" dia midika fa mila manangona fonosana TS 7 ianao ao anaty fonosana IP 1 ary manao izany mafy (-e), izany hoe. andraso foana ny fonosana TS 7 avy amin'ny processeur farany alohan'ny handefasana fonosana IP.

Ny mpandinika dia manomboka mamoaka ireo hafatra andrasana:

* 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

Ampio rano kely izao:

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

ary misy hafatra toy izao:

* 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 

izay andrasana. Atsaharo ny fahaverezan'ny fonosana (ip netns exec P iptables -F) ary andramo hampitombo ny bitrate ho 100Mbps. Ny mpandinika dia mitatitra andiana hadisoana CC ary manodidina ny 75 Mbps fa tsy 100. Miezaka ny hamantatra hoe iza no tokony homena tsiny - tsy manam-potoana ny mpamokatra na tsy ao anatin'izany ny olana, noho izany dia manomboka mamorona isa raikitra izahay. fonosana (700000 TS fonosana = 100000 IP fonosana):

# 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

Araka ny hitanao dia fonosana IP 100000 katroka no novokarina (151925460-151825460). Andeha hojerentsika ny zava-mitranga amin'ny analyzer, noho izany dia manamarina amin'ny kaontera RX amin'ny veth1, mitovy tanteraka amin'ny kaontera TX amin'ny veth0, avy eo mijery ny zava-mitranga amin'ny ambaratonga 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 

Eto ianao dia afaka mahita ny isan'ny mitete = 24355. Ao amin'ny TS packets dia 170485 na 24.36% amin'ny 700000, ka hitantsika fa ireo 25% amin'ny bitrate very dia mitete ao amin'ny socket udp. Ny fitetezana ao amin'ny socket UDP dia matetika mitranga noho ny tsy fahampian'ny buffer, jereo ny haben'ny socket buffer default sy ny haben'ny socket buffer ambony indrindra:

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

Noho izany, raha toa ka tsy mangataka mazava ny haben'ny buffer ny fampiharana, dia noforonina miaraka amin'ny buffer 208 KB ny sockets, fa raha mangataka bebe kokoa izy ireo dia mbola tsy mahazo izay nangatahana. Koa satria azonao atao ny mametraka ny haben'ny buffer amin'ny tsp ho an'ny fampidirana IP (-buffer-size), dia tsy hikasika ny haben'ny socket default izahay, fa mametraka ny haben'ny buffer farany indrindra ary mamaritra mazava ny haben'ny buffer amin'ny alΓ lan'ny tohan-kevitra 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

Miaraka amin'ity fanitsiana ny socket buffer ity, ankehitriny ny bitrate voalaza dia eo amin'ny 100Mbps, tsy misy hadisoana CC.

Araka ny fanjifana CPU ny fampiharana tsp mihitsy. Mifandray amin'ny CPU iray i5-4260U @ 1.40GHz, ny famakafakana ny fikorianan'ny 10Mbps dia mitaky CPU 3-4%, 100Mbps - 25%, 200Mbps - 46%. Rehefa mametraka ny% Packet Loss, ny enta-mavesatra eo amin'ny CPU dia saika tsy mitombo (fa mety hihena).

Amin'ny fitaovana mamokatra kokoa, azo atao ny mamorona sy mamakafaka ireo renirano mihoatra ny 1Gb / s tsy misy olana.

Fitsapana amin'ny tena karatra tambajotra

Aorian'ny fitsapana amin'ny mpivady veth dia mila maka mpampiantrano roa na seranana roa amin'ny mpampiantrano iray ianao, mampifandray ireo seranana amin'ny tsirairay, manomboka ny mpamokatra amin'ny iray, ary ny mpandinika amin'ny faharoa. Tsy nisy fahagagana teto, fa raha ny marina dia miankina amin'ny vy izany rehetra izany, ny malemy kokoa, ny mahaliana kokoa dia eto.

Mampiasa ny angona voarain'ny rafitra fanaraha-maso (Zabbix)

tsp dia tsy manana API azo vakiana amin'ny milina toy ny SNMP na mitovy. Ny hafatra CC dia tsy maintsy atambatra mandritra ny 1 segondra farafahakeliny (miaraka amin'ny isan-jaton'ny fahaverezan'ny fonosana, mety misy an-jatony/arivo/aliny isan-tsegondra, arakaraka ny bitrate).

Noho izany, mba hitahiry ny vaovao sy hanao sary ho an'ny hadisoana CC sy bitrate ary hanao karazana lozam-pifamoivoizana, dia mety misy ireto safidy manaraka ireto:

  1. Parse sy aggregate (amin'ny CC) ny vokatra tsp, i.e. avadika ho endrika irina.
  2. Vitao ny tsp ny tenany sy/na ny plugins bitrate_monitor sy ny fitohizan'ny processeur mba hanomezana endrika azo vakiana amin'ny milina mifanaraka amin'ny rafitra fanaraha-maso ny vokatra.
  3. Soraty eo an-tampon'ny tranomboky tsduck ny fampiharanao.

Mazava ho azy fa ny safidy 1 no mora indrindra amin'ny ezaka, indrindra raha jerena fa ny tsduck dia nosoratana tamin'ny fiteny ambany (amin'ny fenitra maoderina) (C ++)

Ny prototype bash parser+aggregator tsotra dia nampiseho fa tamin'ny stream 10Mbps sy ny fahaverezan'ny fonosana 50% (tranga ratsy indrindra), ny fizotran'ny bash dia nandany CPU in-3-4 mihoatra noho ny fizotran'ny tsp. Tsy azo ekena io scenario io. Raha ny marina dia ampahany amin'ity prototype ity eto ambany

Paty eo ambony

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

Ho fanampin'ny miadana tsy azo ekena, tsy misy kofehy mahazatra ao amin'ny bash, ny asa bash dia dingana samihafa, ary tsy maintsy nanoratra ny sandan'ny missingPackets indray mandeha isan-tsegondra aho amin'ny voka-dratsiny (rehefa mahazo hafatra bitrate izay tonga isaky ny segondra). Vokatr'izany dia navela irery ny bash ary nanapa-kevitra ny hanoratra fonosana (parser + aggregator) amin'ny golang. Ny fanjifana CPU amin'ny code golang mitovy amin'izany dia 4-5 heny noho ny fizotran'ny tsp. Ny hafainganam-pandehan'ny wrapper noho ny fanoloana ny bash tamin'ny golang dia nivadika ho in-16 ary amin'ny ankapobeny dia azo ekena ny vokatra (CPU overhead amin'ny 25% amin'ny tranga ratsy indrindra). Ny rakitra loharano golang dia hita eto.

Run wrapper

Mba hanombohana ny fonosana dia natao ny modely serivisy tsotra indrindra ho an'ny systemd (eto). Ny fonony mihitsy dia tokony hatambatra ho rakitra binary (mandehana manangana tsduck-stat.go) hita ao amin'ny /opt/tsduck-stat/. Heverina fa mampiasa golang ianao miaraka amin'ny fanohanan'ny famantaranandro monotonika (>=1.9).

Mba hamoronana ohatra amin'ny serivisy dia mila mampiasa ny baiko systemctl enable ianao [email voaaro]:1234 dia mihazakazaka miaraka amin'ny systemctl manomboka [email voaaro]: 1234.

Fahitana avy amin'i Zabbix

Mba ahafahan'ny zabbix mahita serivisy mihazakazaka dia vita izany mpamokatra lisitry ny vondrona (discovery.sh), amin'ny endrika takiana amin'ny fikarohana Zabbix, heverina fa eo amin'ny toerana iray ihany no misy azy - ao amin'ny /opt/tsduck-stat. Mba hampandehanana ny fikarohana amin'ny alΓ lan'ny zabbix-agent dia mila manampy ianao .conf rakitra mankany amin'ny lahatahiry fanamafisana zabbix-agent mba hanampiana ny parameter mpampiasa.

Zabbix template

Modely noforonina (tsduck_stat_template.xml) dia ahitana ny fitsipika autodiscover, prototype singa, grafika ary trigger.

Lisitra fohy (eny, ahoana raha misy olona manapa-kevitra ny hampiasa izany)

  1. Ataovy azo antoka fa tsy mandatsaka fonosana ao anatin'ny fepetra "ideal" ny tsp (mifandraika mivantana ny mpamokatra sy ny analyzer), raha misy mitete, jereo ny paragrafy 2 na ny lahatsoratry ny lahatsoratra momba izany.
  2. Ataovy ny fanamafisam-peo ambony indrindra (net.core.rmem_max=8388608).
  3. Manangona tsduck-stat.go (mandehana manangana tsduck-stat.go).
  4. Apetraho ao amin'ny /lib/systemd/system ny mΓ΄dely serivisy.
  5. Atombohy ny serivisy miaraka amin'ny systemctl, jereo fa nanomboka niseho ny kaontinanta (grep "" /dev/shm/tsduck-stat/*). Ny isan'ny serivisy amin'ny isan'ny multicast stream. Eto ianao dia mety mila mamorona zotra mankany amin'ny vondrona multicast, angamba manakana ny rp_filter na mamorona lalana mankany amin'ny loharano ip.
  6. Ampandehano ny discovery.sh, ataovy azo antoka fa miteraka json izany.
  7. Ampio zabbix agent config, restart zabbix agent.
  8. Ampidiro ao amin'ny zabbix ny mΓ΄dely, ampiharo amin'ny mpampiantrano izay arahi-maso ary apetraka ny zabbix-agent, andraso 5 minitra eo ho eo, jereo raha misy zavatra vaovao, grafika ary trigger.

vokatra

Mampiasa TSDuck hanaraha-maso ny renirano IP(TS).

Ho an'ny asa fitadiavana ny fahaverezan'ny fonosana dia saika ampy izany, farafaharatsiny tsara kokoa noho ny tsy misy fanaraha-maso.

Eny tokoa, mety hitranga ny "fatiantoka" CC rehefa manambatra sombin-dahatsary (raha ny fahalalako azy, dia toy izao ny fomba fanaovana insert ao amin'ny foibe fahitalavitra ao an-toerana ao amin'ny Federasiona Rosiana, izany hoe tsy misy kajy ny CC counter), tsy maintsy tsaroana izany. Ny vahaolana amin'ny fananan-tany dia mandingana amin'ny ampahany ity olana ity amin'ny alΓ lan'ny fahitana ny marika SCTE-35 (raha ampiana ny mpamokatra stream).

Eo amin’ny fanaraha-maso ny kalitaon’ny fitaterana dia tsy ampy ny fanaraha-maso jitter (IAT). Ny fitaovana amin'ny fahitalavitra (na modulators na fitaovana farany) dia manana fepetra ho an'ity mari-pamantarana ity ary tsy azo atao foana ny mampiakatra ny jitbuffer amin'ny tsy manam-petra. Ary afaka mitsingevana ny jitter rehefa ampiasaina amin'ny fitaterana ny fitaovana misy buffer lehibe ary tsy voarindra na tsy voarindra tsara ny QoS mba handefasana fifamoivoizana amin'ny fotoana tena izy.

Source: www.habr.com

Add a comment