Kushandisa TSDuck kutarisa IP (TS) kuyerera

Nhasi, kune yakagadzirira-yakagadzirwa (yemuridzi) mhinduro dzekutarisa IP (TS) inoyerera, semuenzaniso. VB ΠΈ iQ, vane akapfuma seti yemabasa uye kazhinji maoperator makuru anobata neTV masevhisi ane mhinduro dzakafanana. Ichi chinyorwa chinotsanangura mhinduro kubva pane yakavhurika sosi purojekiti TSDuck, yakagadzirirwa kushoma kutonga kweIP (TS) inoyerera uchishandisa CC (inoenderera kaunda) counter uye bitrate. Chishandiso chinogoneka ndechekutarisisa kurasikirwa kwemapaketi kana kuyerera kwese kuburikidza neyakahaiwa L2 chiteshi (iyo isingagone kutariswa zvakajairika, semuenzaniso, nekuverenga zviverengero zvekurasika mumitsetse).

Muchidimbu nezveTSDuck

TSDuck ndeye yakavhurika sosi (2-Clause BSD rezinesi) software (seti yezvishandiso zvekoni uye raibhurari yekugadzira yako ega ekushandisa kana plugins) yekunyengedza TS hova. Sekupinza, inogona kushanda neIP (multicast/unicast), http, hls, dvb tuners, dektec dvb-asi demodulator, pane yemukati TS rwizi jenareta uye kuverenga kubva mafaera. Iyo inobuda inogona kurekodha kufaira, IP (multicast/unicast), hls, dektec dvb-asi uye HiDes modulators, vatambi (mplayer, vlc, xine) uye kudonha. Pakati pezvakapinza uye zvinobuda, unogona kugonesa akasiyana traffic processors, semuenzaniso, kudzokorora maPID, kuita kukwenya / kudhirowa, kuongorora maCC counters, kuverenga bitrate uye mamwe maoperation akajairika kune TS hova.

Muchikamu chino, IP nzizi (multicast) ichashandiswa sekuisa, bitrate_monitor processors (kubva pazita zviri pachena kuti chii ichi) uye kuenderera (CC counter analysis) processors ichashandiswa. Pasina chero matambudziko, unogona kutsiva IP multicast neimwe mhando yekuisa inotsigirwa neTSDuck.

Available pamutemo anovaka / mapakeji TSDuck yeakawanda azvino OS. Iko hakuna yeDebian, asi isu takakwanisa kuiunganidza yeDebian 8 uye Debian 10 pasina matambudziko.

Tevere, TSDuck vhezheni 3.19-1520 inoshandiswa, Linux inoshandiswa seOS (debian 10 yakashandiswa kugadzira mhinduro, CentOS 7 yakashandiswa kushandiswa chaiko)

Kugadzirira TSDuck uye OS

Usati watarisa kuyerera chaiko, iwe unofanirwa kuve neshuwa kuti TSDuck inoshanda nemazvo uye kuti madonhwe haaitike pane network kadhi kana OS (socket) level. Izvi zvinodikanwa kuti usazofembera gare gare kwakaitika madonhwe - pane network kana "mukati mesevha." Iwe unogona kutarisa madonhwe padanho retiweki kadhi nemirairo ethtool -S ethX, tuning inoitwa neiyo ethtool imwechete (kazhinji unoda kuwedzera RX buffer (-G) uye dzimwe nguva kudzima zvimwe zvinoburitsa (-K)). Sekurudziro yakajairika, zvinokurudzirwa kushandisa chiteshi chakasiyana kuti ugamuchire yakaongororwa traffic, kana zvichibvira, izvi zvinoderedza manyepo nekuda kwekuti kudonha kwakaitika panguva imwe chete pachiteshi che analyzer nekuda kwekuvapo kweimwe traffic. Kana izvi zvisingagoneke (uri kushandisa mini-kombuta/NUC ine chiteshi chimwe chete), zvino zvinokurudzirwa kuti ugadzirise kukosha kweiyo yakaongororwa traffic maererano neyakasara pachigadzirwa icho analyzer yakabatana. Nezvezvakatipoteredza nharaunda, pano iwe unofanirwa kungwarira uye kukwanisa kuwana madonhwe epaketi kutanga kubva pachiteshi chepanyama uye kupera nekushandisa mukati memuchina chaiwo.

Kugadzira uye kugamuchira rwizi mukati memuenzi

Sedanho rekutanga mukugadzirira TSDuck, isu tichagadzira uye nekugashira traffic mukati memuiti mumwe chete tichishandisa mambure.

Kugadzirira nharaunda:

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

Mamiriro ezvinhu akagadzirira. Tangisa traffic analyzer:

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

apo "-p 1 -t 1" zvinoreva kuti unoda kuverenga bitrate sekondi yega yega uye kuratidza ruzivo nezve bitrate sekondi yega yega.
Isu tinotangisa traffic jenareta nekumhanya kwe10 Mbit / s:

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

uko "-p 7 -e" zvinoreva kuti iwe unofanirwa kurongedza 7 TS mapaketi mu1 IP packet uye uzviite zvakaoma (-e), i.e. gara wakamirira 7 TS mapaketi kubva kune yekupedzisira processor usati watumira kuumbwa kweIP packet.

Iyo analyzer inotanga kuratidza iwo anotarisirwa mameseji:

* 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

Zvino ngatiwedzerei mamwe madonhwe:

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

uye mameseji akaita seaya anooneka:

* 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 

zvinotarisirwa. Isu tinodzima kurasikirwa kwepaketi (ip netns exec P iptables -F) uye edza kuwedzera jenareta bitrate ku100 Mbit / s. Iyo analyzer inoshuma boka rezvikanganiso zveCC uye nezve 75 Mbit / s panzvimbo ye100. Tiri kuedza kufunga kuti ndiani ane mhosva - jenareta haisi kuchengeta kana kuti dambudziko harisi mairi, kuita izvi tinotanga kubudisa a nhamba yakatarwa yemapakiti (700000 TS mapaketi = 100000 IP mapaketi):

# 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

Sezvauri kuona, chaizvo 100000 IP mapaketi akagadzirwa (151925460-151825460). Saka isu tinoona zviri kuitika neanalyzer, kuti tiite izvi tinotarisa neRX counter pa veth1, yakanyatso kuenzana neTX counter pa veth0, tobva tatarisa zviri kuitika pasocket level:

# 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 

Pano iwe unogona kuona nhamba yemadonhwe = 24355. MuTS packets iyi 170485 kana 24.36% ye700000, saka tinoona kuti imwechete 25% ye bitrate yakarasika madonhwe muUDP socket. Madonhwe paUDP socket anowanzoitika nekuda kwekushaikwa kwebuffer, ngationei kuti iyo default socket buffer size uye yakakura socket buffer size ndeiyi:

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

Saka, kana zvikumbiro zvikasakumbira zvakajeka saizi yebhafa, masokisi anogadzirwa aine 208 KB buffer, asi kana vakakumbira zvimwe, havazogashira zvavanenge vakumbira. Sezvo mu tsp unogona kuseta saizi yebuffer yeIP yekupinda (--buffer-saizi), isu hatibatike saizi yesoketi, asi tinongoisa yakakura socket buffer saizi uye tsanangura saizi yebuffer zvakajeka kuburikidza ne tsp nharo:

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

Nekugadzirisa uku kwesocket buffer, iyo bitrate yakashumwa ikozvino inenge 100Mbps, hapana zvikanganiso zveCC.

Zvichienderana neCPU kushandiswa netsp application pachayo. Nezve imwe core i5-4260U CPU @ 1.40GHz, kuongorora kuyerera kwe10Mbit/s, 3-4% yeCPU ichadiwa, 100Mbit/s - 25%, 200Mbit/s - 46%. Pakuisa% kurasikirwa kwepaketi, iyo CPU mutoro hauwedzere (asi unogona kudzikira).

Pane zvakawanda zvinogadzira Hardware, zvaigoneka kugadzira uye kuongorora hova dzinopfuura 1Gb/s pasina matambudziko.

Kuedza pamakadhi etiweki chaiwo

Mushure mekuedza pane veth pair, iwe unofanirwa kutora mauto maviri kana maviri madoko emugadziri mumwe, batanidza zviteshi kune mumwe nemumwe, mhanyisa jenareta pane imwe, uye analyzer pane yechipiri. Pakanga pasina zvinoshamisa pano, asi chaizvoizvo zvose zvinoenderana ne hardware, iyo isina simba iyo, iyo inonyanya kufadza ichava pano.

Kushandisa iyo data yakagamuchirwa neyekutarisa system (Zabbix)

tsp haina chero muchina-inoverengeka API seSNMP kana yakafanana. CC meseji inoda kuunganidzwa kanokwana 1 sekondi panguva (ine yakakwira muzana yekurasikirwa kwepaketi, panogona kuita mazana / zviuru / makumi ezviuru pasekondi, zvichienderana ne bitrate).

Saka, kuitira kuchengetedza ruzivo uye kudhirowa magirafu eCC zvikanganiso uye bitrate uye kuita imwe mhando yetsaona mberi, panogona kuve neanotevera sarudzo:

  1. Parse uye aggregate (neCC) iyo tsp inobuda, i.e. kuchishandura kuita fomu yaunoda.
  2. Wedzera iyo tsp pachayo uye / kana iyo bitrate_monitor uye yekuenderera mberi processor plugins kuitira kuti mhedzisiro yacho ibude mumuchina-inoverengeka fomu yakakodzera kune yekutarisa sisitimu.
  3. Nyora chikumbiro chako pamusoro peraibhurari yetsduck.

Zviripachena, maererano nemari yebasa, sarudzo 1 ndiyo yakapfava, kunyanya tichifunga kuti tsduck pachayo yakanyorwa mune yakaderera-nhanho (nemazuva ano maitiro) mutauro (C ++)

A simple prototype of parser + aggregator in bash yakaratidza kuti pakuyerera kwe10 Mbit/s uye 50% packet loss (yakaipisisa nyaya), bash process yakapedza 3-4 times more CPU pane tsp process pachayo. Mamiriro ezvinhu aya haatenderwi. Chaizvoizvo chidimbu cheiyo prototype chiri pazasi

Noodles pa 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

Pamusoro pekuti izvi zvinoshanda zvisingagamuchirwe zvishoma nezvishoma, hapana akajairwa tambo mubash, bash mabasa akazvimiririra maitiro uye ndaifanira kunyora yakarasikaPackets kukosha kamwechete sekondi padivi mhedzisiro (pakugamuchira bitrate meseji inouya yega sekondi). Nekuda kweizvozvo, bash yakasiiwa yega uye zvakasarudzwa kunyora wrapper (parser + aggregator) mugolang. Iyo CPU kushandiswa kwekodhi yakafanana mugolang ndeye 4-5 nguva shoma pane iyo tsp maitiro pachayo. Kukwidziridzwa kwekuputira nekutsiva bash negolang kwaive ka16 uye zvakazara mhedzisiro inogamuchirwa (CPU pamusoro ne25% mune yakaipisisa kesi). Iyo golang source file iripo pano.

Kuvhura wrapper

Kuvhura iyo wrapper, iri nyore sevhisi template ye systemd yakagadzirwa (pano) Zvinofungidzirwa kuti wrapper pachayo inoumbwa kuita bhinari faira (enda kuvaka tsduck-stat.go), iri mukati /opt/tsduck-stat/. Zvinofungidzirwa kuti golang rinoshandiswa ne monotonic wachi rutsigiro (> = 1.9).

Kuti ugadzire sevhisi yemuenzaniso unofanirwa kumhanya iyo systemctl inogonesa command [email inodzivirirwa]:1234, wobva wamhanya nesystemctl kutanga [email inodzivirirwa]: 1234.

Kuwanikwa kubva kuZabbix

Kuti zabbix iwane kuwanikwa kwekumhanya masevhisi, group list jenareta (discovery.sh), muchimiro chinodiwa pakuwanikwa kweZabbix, inofungidzirwa kuti iri munzvimbo imwechete - mu /opt/tsduck-stat. Kuti umhanye kuwanikwa kuburikidza nezabbix-agent, unofanirwa kuwedzera .conf file kune dhairekitori ine zabbix-agent masisitimu ekuwedzera mushandisi parameter.

Zabbix template

Yakagadzirwa template (tsduck_stat_template.xml) ine autodiscovery mutemo, element, graph, uye trigger prototypes.

Rondedzero pfupi (ko kana mumwe munhu afunga kuishandisa)

  1. Ita shuwa kuti tsp haidonhedze mapaketi pasi pe "yakanaka" mamiriro (jenereta uye analyzer yakabatana zvakananga), kana paine madonhwe, ona pfungwa 2 kana chinyorwa chechinyorwa panyaya iyi.
  2. Ita tuning yeiyo yakanyanya socket buffer (net.core.rmem_max=8388608).
  3. Nyora tsduck-stat.go (enda unovaka tsduck-stat.go).
  4. Isa iyo sevhisi template mukati /lib/systemd/system.
  5. Tanga masevhisi uchishandisa systemctl, tarisa kuti zviverengero zvatanga kuoneka (grep "" /dev/shm/tsduck-stat/*). Huwandu hwemasevhisi zvichienderana nenhamba yekutepfenyura akawanda. Pano ungangoda kugadzira nzira yekuenda kuboka remulticast, pamwe kudzima rp_filter kana kugadzira nzira inoenda kunobva ip.
  6. Mhanya discovery.sh, ita shuwa kuti inogadzira json.
  7. Isa iyo zabbix mumiriri config, tangazve zabbix mumiriri.
  8. Isa iyo template ku zabbix, ishandise kune iyo inoitisa iyo yekutarisa uye yabbix-agent inoiswa, mirira anenge maminetsi mashanu, ona kuti zvinhu zvitsva zve data, magirafu uye zvinokonzeresa zvinoonekwa.

mugumisiro

Kushandisa TSDuck kutarisa IP (TS) kuyerera

Kune iro basa rekuona kurasikirwa kwepaketi, rinenge rakakwana, zvirinani zviri nani pane kusatarisisa.

Muchokwadi, CC "kurasikirwa" kunogona kuitika kana splicing mavhidhiyo zvimedu (sezvandinoziva, iyi ndiyo nzira yekuisirwa kunoitwa munzvimbo dzeterevhizheni munzvimbo muRussian Federation, i.e. pasina kuverengera CC counter), izvi zvinofanirwa kuyeukwa. Mune mhinduro dzevaridzi, dambudziko iri rakatenderedzwa zvishoma nekuona SCTE-35 ma tag (kana akawedzerwa nejenareta rerukova).

Kubva pakuona kwekutarisa kwemhando yekufambisa, jitter monitoring (IAT) haina kukwana, nekuti Midziyo yeTV (ingave ma modulator kana ekupedzisira) ine zvinodikanwa zveiyi parameter uye hazvigoneke nguva dzose kupinza jitbuffer nekusingaperi. Uye jitter inogona kuyangarara kana chekufambisa chichishandisa michina ine mabhafa mahombe uye QoS haina kugadzirwa kana kuti haina kugadzirwa zvakanaka kuti itumire yakadaro realtime traffic.

Source: www.habr.com

Voeg