Kugwiritsa ntchito TSDuck kuyang'anira IP (TS) ikuyenda

Masiku ano, pali njira zokonzekera (zaumwini) zowunikira mitsinje ya IP (TS), mwachitsanzo. VB ΠΈ iQ, ali ndi ntchito zambiri ndipo nthawi zambiri ogwira ntchito akuluakulu omwe amagwira ntchito pa TV amakhala ndi mayankho otere. Nkhaniyi ikufotokoza yankho lochokera ku polojekiti yotseguka TSDuck, yopangidwira kuwongolera kochepa kwa ma IP (TS) mitsinje ndi CC (continuity counter) counter ndi bitrate. Kugwiritsa ntchito kotheka ndikuwongolera kutayika kwa mapaketi kapena kuyenda konse kudzera munjira yobwereketsa ya L2 (yomwe singayang'anitsidwe bwino, mwachitsanzo, powerenga zowerengera zotayika pamizere).

Mwachidule kwambiri za TSDuck

TSDuck ndi pulogalamu yotseguka (2-Clause BSD license) pulogalamu (zothandizira zotonthoza ndi laibulale yopangira zida kapena mapulagini) pakuwongolera mitsinje ya TS. Monga cholowetsa, imatha kugwira ntchito ndi IP (multicast/unicast), http, hls, dvb tuners, dektec dvb-asi demodulator, pali jenereta yamkati ya TS-stream ndikuwerenga kuchokera pamafayilo. Kutulutsa kumatha kukhala kulembera fayilo, IP (multicast/unicast), hls, dektec dvb-asi ndi HiDes modulators, osewera (mplayer, vlc, xine) ndi dontho. Ma processor osiyanasiyana amatha kuphatikizidwa pakati pazolowetsa ndi zotulutsa, mwachitsanzo, kukonzanso kwa PID, kukwapula / kugwetsa, kusanthula kauntala kwa CC, kuwerengera kwa bitrate, ndi zina zomwe zimachitika pamitsinje ya TS.

M'nkhaniyi, mitsinje ya IP (multicast) idzagwiritsidwa ntchito ngati cholowetsa, ma processor bitrate_monitor (kuchokera ku dzina likuwonekeratu kuti ndi chiyani) ndi kupitiriza (kusanthula ma counters CC) amagwiritsidwa ntchito. Mutha kusintha mosavuta IP multicast ndi mtundu wina wolowetsa wothandizidwa ndi TSDuck.

Likupezeka zomanga / phukusi TSDuck pamakina ambiri omwe akugwira ntchito pano. Sapezeka kwa Debian, koma tinakwanitsa kuwamanga pansi pa debian 8 ndi debian 10 popanda vuto lililonse.

Kenako, mtundu wa TSDuck 3.19-1520 umagwiritsidwa ntchito, Linux imagwiritsidwa ntchito ngati OS (debian 10 idagwiritsidwa ntchito pokonzekera yankho, CentOS 7 idagwiritsidwa ntchito kwenikweni)

Kukonzekera TSDuck ndi OS

Musanayambe kuyang'anira kuyenda kwenikweni, muyenera kuonetsetsa kuti TSDuck ikugwira ntchito molondola ndipo palibe madontho pa intaneti khadi kapena OS (socket). Izi zimafunika kuti musamaganize pambuyo pake pomwe madontho adagwera - pamaneti kapena "mkati mwa seva". Mutha kuyang'ana madontho pamlingo wamakhadi a netiweki ndi lamulo la ethtool -S ethX, kukonza kumachitika ndi ethtool yomweyo (nthawi zambiri, muyenera kukulitsa buffer ya RX (-G) ndipo nthawi zina kuletsa zotsitsa zina (-K)). Monga malingaliro ambiri, atha kulangizidwa kuti agwiritse ntchito doko losiyana kuti alandire magalimoto omwe amawunikidwa, ngati n'kotheka, izi zimachepetsa zolakwa zabodza zomwe zimagwirizanitsidwa ndi mfundo yakuti dontho linachitika ndendende pa doko la analyzer chifukwa cha kupezeka kwa magalimoto ena. Ngati izi sizingatheke (mini-kompyuta / NUC yokhala ndi doko limodzi imagwiritsidwa ntchito), ndiye kuti ndizofunikira kwambiri kukhazikitsa patsogolo kwa magalimoto omwe akuwunikidwa pokhudzana ndi zina zonse pa chipangizo chomwe analyzer amalumikizidwa. Ponena za malo enieni, apa muyenera kusamala ndikupeza madontho a paketi kuyambira pa doko lakuthupi ndikumaliza ndi kugwiritsa ntchito mkati mwa makina enieni.

Mbadwo ndi kulandila kwa mtsinje mkati mwa olandira

Monga gawo loyamba pokonzekera TSDuck, tidzapanga ndikulandila magalimoto mkati mwa gulu limodzi logwiritsa ntchito maukonde.

Kukonzekera chilengedwe:

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

Chilengedwe chakonzeka. Timayambira 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

pomwe "-p 1 -t 1" zikutanthauza kuti muyenera kuwerengera bitrate sekondi iliyonse ndikuwonetsa zambiri za bitrate sekondi iliyonse.
Timayamba jenereta yamagalimoto ndi liwiro la 10Mbps:

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

kumene "-p 7 -e" amatanthauza kuti muyenera kunyamula mapaketi 7 TS mu 1 IP paketi ndi kuchita molimba (-e), i.e. nthawi zonse dikirani mapaketi a 7 TS kuchokera ku purosesa yomaliza musanatumize paketi ya IP.

Analyzer akuyamba kutulutsa mauthenga omwe akuyembekezeredwa:

* 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

Tsopano onjezani madontho:

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

ndipo mauthenga ngati awa akuwoneka:

* 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 

zomwe zikuyembekezeka. Letsani kutayika kwa paketi (ip netns exec P iptables -F) ndikuyesera kuonjezera bitrate ya jenereta ku 100Mbps. Analyzer amafotokoza zolakwika zambiri za CC ndi pafupifupi 75 Mbps m'malo mwa 100. Tikuyesera kudziwa yemwe ali ndi mlandu - jenereta ilibe nthawi kapena vuto siliri mmenemo, chifukwa ichi timayamba kupanga chiwerengero chokhazikika cha mapaketi (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

Monga mukuwonera, ndendende 100000 mapaketi a IP adapangidwa (151925460-151825460). Kotero ife tikuwona zomwe zikuchitika ndi analyzer, kuti tichite izi timayang'ana ndi RX counter pa veth1, ndiyofanana kwambiri ndi TX counter pa veth0, ndiye timayang'ana zomwe zikuchitika pazitsulo:

# 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 mukhoza kuona chiwerengero cha madontho = 24355. Mu mapaketi a TS, izi ndi 170485 kapena 24.36% ya 700000, kotero tikuwona kuti 25% yomweyi ya bitrate yotayika ndi madontho mu socket ya udp. Kutsika mu socket ya UDP nthawi zambiri kumachitika chifukwa cha kusowa kwa buffer, yang'anani kukula kwa socket buffer ndi kukula kwa socket buffer:

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

Chifukwa chake, ngati mapulogalamu sakufunsani kukula kwa buffer, sockets amapangidwa ndi buffer ya 208 KB, koma ngati apempha zambiri, sangalandirebe zomwe zapemphedwa. Popeza mutha kuyika kukula kwa bafa mu tsp pakulowetsa kwa IP (-buffer-size), sitikhudza kukula kwa socket, koma kungoyika kukula kwa socket buffer ndikulongosola kukula kwa bafa momveka bwino kudzera mu mikangano ya 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

Ndikukonzekera uku kwa socket buffer, tsopano bitrate yomwe yanenedwa ili pafupi 100Mbps, palibe zolakwika za CC.

Malinga ndi kugwiritsa ntchito kwa CPU kwa tsp application yokha. Zogwirizana ndi core i5-4260U CPU @ 1.40GHz, 10Mbps flow analysis ifunika 3-4% CPU, 100Mbps - 25%, 200Mbps - 46%. Mukayika % Packet Loss, katundu pa CPU samawonjezeka (koma akhoza kuchepa).

Pazida zopanga zambiri, zinali zotheka kupanga ndi kusanthula mitsinje yopitilira 1Gb / s popanda vuto lililonse.

Kuyesa pa makhadi enieni amtaneti

Pambuyo poyesa pa veth peyala, muyenera kutenga makamu awiri kapena madoko awiri a khamu limodzi, kugwirizanitsa madoko kwa wina ndi mzake, kuyendetsa jenereta pa imodzi, ndi analyzer pa chachiwiri. Panalibe zodabwitsa apa, koma kwenikweni zonse zimadalira hardware, zofooka ndizo, ndizosangalatsa kwambiri pano.

Kugwiritsa ntchito zomwe zalandilidwa ndi njira yowunikira (Zabbix)

tsp ilibe API yowerengeka ndi makina ngati SNMP kapena yofananira. Mauthenga a CC ayenera kuphatikizidwa kwa mphindi imodzi (ndi kuchuluka kwa paketi kutayika, pakhoza kukhala mazana / zikwi / makumi a zikwi pa sekondi iliyonse, kutengera bitrate).

Chifukwa chake, kuti musunge zidziwitso zonse ndikujambula ma graph pazolakwa za CC ndi bitrate ndikupanga ngozi zamtundu wina, pangakhale izi:

  1. Phatikizani ndikuphatikiza (ndi CC) zotsatira za tsp, i.e. sinthani kukhala mawonekedwe omwe mukufuna.
  2. Malizitsani tsp yokha ndi / kapena mapulagini a purosesa bitrate_monitor ndi kupitiriza kotero kuti zotsatira zake zimaperekedwa mu mawonekedwe owerengeka ndi makina oyenera kuwunikira.
  3. Lembani pulogalamu yanu pamwamba pa laibulale ya tsduck.

Mwachiwonekere, kusankha 1 ndikosavuta kwambiri pakuchita khama, makamaka poganizira kuti tsduck yokha imalembedwa m'chinenero chochepa (ndi zamakono) chinenero (C ++)

Chitsanzo chosavuta cha bash parser + aggregator chinawonetsa kuti pamtsinje wa 10Mbps ndi 50% kutayika kwa paketi (zoipa kwambiri), ndondomeko ya bash idadya nthawi 3-4 CPU kuposa momwe tsp ndondomeko yokha. Izi ndizosavomerezeka. Kwenikweni chidutswa cha chitsanzo ichi pansipa

Zakudyazi pamwamba

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

Kuphatikiza pa kukhala wodekha mosagwirizana, palibe ulusi wabwinobwino mu bash, ntchito za bash ndizosiyana ndipo ndimayenera kulemba mtengo wa missingPackets kamodzi sekondi imodzi kumbali (polandira mauthenga a bitrate omwe amabwera sekondi iliyonse). Zotsatira zake, bash adasiyidwa yekha ndipo adasankhidwa kuti alembe chopukutira (parser + aggregator) mu golang. Kugwiritsa ntchito kwa CPU kwa code ya golang yofanana ndi nthawi 4-5 kuposa momwe tsp ndondomeko yokha. Kuthamanga kwa wrapper chifukwa cha kusintha kwa bash ndi golang kunakhala pafupifupi nthawi 16 ndipo zotsatira zake ndizovomerezeka (CPU pamwamba pa 25% pazovuta kwambiri). Fayilo ya golang source ilipo apa.

Kuyambitsa wrapper

Kukhazikitsa wrapper, template yosavuta ya serviced idapangidwa (apa). Chovalacho chikuyenera kupangidwa kukhala fayilo ya binary (pitani kumanga tsduck-stat.go) yomwe ili mkati /opt/tsduck-stat/. Zimaganiziridwa kuti mukugwiritsa ntchito golang mothandizidwa ndi wotchi ya monotonic (> = 1.9).

Kuti mupange chitsanzo cha ntchitoyo, muyenera kuyendetsa systemctl enable command [imelo ndiotetezedwa]:1234, ndiye thamangani ndi systemctl start [imelo ndiotetezedwa]: 1234.

Kupeza kuchokera ku Zabbix

Kuti zabbix athe kupeza ntchito zomwe zikuyenda, zachitika jenereta ya mndandanda wamagulu (discovery.sh), mumpangidwe wofunikira kuti Zabbix apezeke, amaganiziridwa kuti ili pamalo omwewo - mu /opt/tsduck-stat. Kuti mugwiritse ntchito zabbix-agent, muyenera kuwonjezera .conf wapamwamba ku bukhu la kasinthidwe ka zabbix-agent kuti muwonjezere gawo la ogwiritsa ntchito.

Zabbix template

Adapanga template (tsduck_stat_template.xml) ili ndi lamulo la autodiscover, prototypes, ma graph, ndi zoyambitsa.

Mndandanda wachidule (chabwino, bwanji ngati wina asankha kuugwiritsa ntchito)

  1. Onetsetsani kuti tsp sichiponya mapaketi pansi pa "zabwino" (jenereta ndi analyzer zimagwirizana mwachindunji), ngati pali madontho, onani ndime 2 kapena malemba a nkhaniyi pankhaniyi.
  2. Pangani kukonza socket buffer (net.core.rmem_max=8388608).
  3. Lembani tsduck-stat.go (pitani kumanga tsduck-stat.go).
  4. Ikani template ya utumiki mu /lib/systemd/system.
  5. Yambitsani ntchito ndi systemctl, onetsetsani kuti zowerengera zayamba kuwoneka (grep "" /dev/shm/tsduck-stat/*). Chiwerengero cha ntchito potengera kuchuluka kwa ma streams owulutsa ambiri. Apa mungafunike kupanga njira yopita ku gulu la multicast, mwina kuletsa rp_filter kapena kupanga njira yopita ku gwero ip.
  6. Thamangani discovery.sh, onetsetsani kuti ikupanga json.
  7. Onjezani zabbix agent config, yambitsaninso wothandizira zabbix.
  8. Kwezani template ku zabbix, igwiritseni ntchito kwa wolandirayo yemwe akuyang'aniridwa ndipo wothandizira zabbix aikidwa, dikirani pafupi maminiti a 5, muwone ngati pali zinthu zatsopano, ma grafu ndi zoyambitsa.

chifukwa

Kugwiritsa ntchito TSDuck kuyang'anira IP (TS) ikuyenda

Pantchito yozindikira kutayika kwa paketi, ndi pafupifupi kokwanira, ndikwabwino kuposa kusawunika.

Zowonadi, "kutayika" kwa CC kumatha kuchitika pophatikiza zidutswa zamavidiyo (monga momwe ndikudziwira, umu ndi momwe zoyikamo zimapangidwira kumalo ochezera a TV ku Russian Federation, i.e. popanda kuwerengeranso kauntala ya CC), izi ziyenera kukumbukiridwa. Mayankho aumwini amalepheretsa pang'ono vutoli pozindikira zilembo za SCTE-35 (ngati ziwonjezedwa ndi jenereta).

Pankhani yowunikira khalidwe lamayendedwe, pali kusowa kwa jitter monitoring (IAT). Zida za TV (zikhale zosinthira kapena zida zomaliza) zili ndi zofunikira pazigawozi ndipo sizotheka nthawi zonse kukulitsa jitbuffer kuti ikhale yopanda malire. Ndipo jitter imatha kuyandama pomwe zida zokhala ndi ma buffer akulu zikugwiritsidwa ntchito podutsa ndipo QoS sinasanjidwe kapena yosakonzedwa bwino kuti itumize kuchuluka kwanthawi yeniyeni yotere.

Source: www.habr.com

Kuwonjezera ndemanga