Lilo TSDuck lati Atẹle IP (TS) ṣiṣan

Loni, awọn solusan ti a ti ṣetan (ohun-ini) wa fun ibojuwo awọn ṣiṣan IP (TS), fun apẹẹrẹ VB и iQ, won ni a iṣẹtọ ọlọrọ ṣeto ti awọn iṣẹ ati ki o maa tobi awọn oniṣẹ awọn olugbagbọ pẹlu TV iṣẹ ni iru awọn solusan. Nkan yii ṣe apejuwe ojutu kan ti o da lori iṣẹ akanṣe orisun ṣiṣi TSDuck, Ti a ṣe apẹrẹ fun iṣakoso kekere ti awọn ṣiṣan IP (TS) nipasẹ CC (counter counter) counter ati bitrate. Ohun elo ti o ṣeeṣe ni lati ṣakoso ipadanu ti awọn apo-iwe tabi gbogbo sisan nipasẹ ikanni L2 iyalo kan (eyiti a ko le ṣe abojuto deede, fun apẹẹrẹ, nipa kika awọn iṣiro pipadanu ni awọn ila).

Gan ni soki nipa TDuck

TSDuck jẹ orisun ṣiṣi (iwe-aṣẹ BSD-Clause 2) sọfitiwia (eto awọn ohun elo console ati ile-ikawe kan fun idagbasoke awọn ohun elo aṣa tabi awọn afikun) fun ifọwọyi awọn ṣiṣan TS. Bi ohun input, o le ṣiṣẹ pẹlu awọn IP (multicast/unicast), http, hls, dvb tuners, dektec dvb-asi demodulator, nibẹ ni ohun ti abẹnu TS ṣiṣan monomono ati kika lati awọn faili. Ijade le jẹ kikọ si faili kan, IP (multicast/unicast), hls, dektec dvb-asi ati HiDes modulators, awọn ẹrọ orin (mplayer, vlc, xine) ati ju silẹ. O le mu ọpọlọpọ awọn ilana iṣowo ṣiṣẹ laarin titẹ sii ati iṣelọpọ, fun apẹẹrẹ, atunṣe PID, scrambling / decrambling, itupalẹ counter CC, iṣiro bitrate, ati awọn iṣẹ aṣoju miiran fun awọn ṣiṣan TS.

Ninu nkan yii, awọn ṣiṣan IP (multicast) yoo ṣee lo bi titẹ sii, awọn olutọpa bitrate_monitor (lati orukọ ti o han ohun ti o jẹ) ati ilosiwaju (itupalẹ ti awọn iṣiro CC) ni a lo. O le ni rọọrun rọpo multicast IP pẹlu iru igbewọle miiran ti o ni atilẹyin nipasẹ TDuck.

Wa osise kọ / jo TSDuck fun julọ lọwọlọwọ awọn ọna šiše. Wọn ko wa fun Debian, ṣugbọn a ṣakoso lati kọ wọn labẹ debian 8 ati debian 10 laisi awọn iṣoro eyikeyi.

Nigbamii ti, ẹya TSDuck 3.19-1520 ti lo, Linux ti lo bi OS (debian 10 ni a lo lati ṣeto ojutu naa, a lo CentOS 7 fun lilo gidi)

Ngbaradi TSDuck ati OS

Ṣaaju ki o to ṣe abojuto awọn ṣiṣan gidi, o nilo lati rii daju pe TDuck ṣiṣẹ ni deede ati pe ko si awọn silẹ ni kaadi nẹtiwọki tabi ipele OS (iho). Eyi ni a nilo lati ma ṣe gboju nigbamii nibiti awọn isubu ti waye - lori nẹtiwọọki tabi “inu olupin naa”. O le ṣayẹwo awọn silė ni ipele kaadi nẹtiwọki pẹlu aṣẹ ethtool -S ethX, yiyi jẹ nipasẹ ethtool kanna (nigbagbogbo, o nilo lati mu ifipamọ RX pọ si (-G) ati nigbakan mu diẹ ninu awọn pipaṣẹ (-K)). Gẹgẹbi iṣeduro gbogbogbo, o le ni imọran lati lo ibudo lọtọ fun gbigba ijabọ atupale, ti o ba ṣeeṣe, eyi dinku awọn idaniloju eke ti o ni nkan ṣe pẹlu otitọ pe isubu naa ṣẹlẹ ni deede lori ibudo atupale nitori wiwa awọn ijabọ miiran. Ti eyi ko ba ṣee ṣe (kọmputa kekere kan / NUC pẹlu ibudo kan ni a lo), lẹhinna o jẹ iwunilori pupọ lati ṣeto iṣaju iṣaju ti ijabọ atupale ni ibatan si iyokù lori ẹrọ ti a ti sopọ mọ atunnkanka naa. Nipa awọn agbegbe foju, nibi o nilo lati ṣọra ki o ni anfani lati wa awọn silẹ soso ti o bẹrẹ lati ibudo ti ara ati ipari pẹlu ohun elo inu ẹrọ foju kan.

Iran ati gbigba ti a ṣiṣan inu awọn ogun

Gẹgẹbi igbesẹ akọkọ ni ngbaradi TSDuck, a yoo ṣe ipilẹṣẹ ati gba ijabọ laarin agbalejo kan nipa lilo awọn neti.

Ngbaradi ayika:

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

Ayika ti šetan. A bẹrẹ oluyẹwo ijabọ:

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

nibi ti "-p 1 -t 1" tumọ si pe o nilo lati ṣe iṣiro awọn bitrate ni gbogbo iṣẹju-aaya ati ṣafihan alaye nipa bitrate ni gbogbo iṣẹju-aaya
A bẹrẹ olupilẹṣẹ ijabọ pẹlu iyara ti 10Mbps:

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

nibiti "-p 7 -e" tumọ si pe o nilo lati gbe awọn apo-iwe 7 TS sinu apo 1 IP ati ṣe lile (-e), i.e. nigbagbogbo duro 7 TS awọn apo-iwe lati ero isise to kẹhin ṣaaju fifiranṣẹ apo IP kan.

Oluyanju bẹrẹ ṣiṣejade awọn ifiranṣẹ ti a nireti:

* 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

Bayi fi diẹ ninu awọn silė:

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

ati awọn ifiranṣẹ bi eleyi han:

* 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 

eyi ti o ti ṣe yẹ. Pa pipadanu soso kuro (ip netns exec P iptables -F) ki o si gbiyanju lati mu iwọn iwọn monomono pọ si 100Mbps. Oluyanju ṣe ijabọ opo ti awọn aṣiṣe CC ati nipa 75 Mbps dipo 100. A n gbiyanju lati wa ẹniti o jẹbi - monomono ko ni akoko tabi iṣoro naa ko si ninu rẹ, fun eyi a bẹrẹ ṣiṣẹda nọmba ti o wa titi ti awọn apo-iwe (700000 TS awọn apo-iwe = 100000 IP awọn apo-iwe):

# 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

Bii o ti le rii, awọn apo-iwe IP 100000 gangan ni ipilẹṣẹ (151925460-151825460). Nitorinaa jẹ ki a ro ohun ti n ṣẹlẹ pẹlu olutupalẹ, fun eyi a ṣayẹwo pẹlu counter RX lori veth1, o jẹ deede dogba si counter TX lori veth0, lẹhinna a wo ohun ti o ṣẹlẹ ni ipele iho:

# 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 

Nibi o le rii nọmba awọn silė = 24355. Ni awọn apo-iwe TS, eyi jẹ 170485 tabi 24.36% ti 700000, nitorinaa a rii pe 25% kanna ti bitrate ti sọnu jẹ silẹ ni iho udp. Ju silẹ ni iho UDP nigbagbogbo waye nitori aini ifipamọ, wo iwọn ifipamọ iho aiyipada ati iwọn ifipamọ iho ti o pọju:

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

Nitorinaa, ti awọn ohun elo ko ba beere iwọn ifipamọ ni gbangba, awọn iho ni a ṣẹda pẹlu ifipamọ ti 208 KB, ṣugbọn ti wọn ba beere diẹ sii, wọn kii yoo gba ohun ti o beere. Niwọn igba ti o le ṣeto iwọn ifipamọ ni tsp fun titẹ sii IP (-ibuffer-iwọn), a kii yoo fi ọwọ kan iwọn iho aiyipada, ṣugbọn ṣeto nikan iwọn ifipamọ iho ti o pọju ati pato iwọn ifipamọ ni gbangba nipasẹ awọn ariyanjiyan 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

Pẹlu yiyi ti ifipamọ iho, ni bayi oṣuwọn bit ti a royin jẹ nipa 100Mbps, ko si awọn aṣiṣe CC.

Gẹgẹbi agbara Sipiyu ti ohun elo tsp funrararẹ. Ni ibatan si ọkan mojuto i5-4260U CPU @ 1.40GHz, itupalẹ sisan 10Mbps yoo nilo 3-4% Sipiyu, 100Mbps - 25%, 200Mbps - 46%. Nigbati o ba ṣeto% Isonu Packet, fifuye lori Sipiyu ko ni pọ si (ṣugbọn o le dinku).

Lori ohun elo iṣelọpọ diẹ sii, o ṣee ṣe lati ṣe ipilẹṣẹ ati itupalẹ awọn ṣiṣan ti o ju 1Gb / s laisi awọn iṣoro eyikeyi.

Idanwo lori awọn kaadi nẹtiwọki gidi

Lẹhin idanwo lori bata veth, o nilo lati mu awọn ogun meji tabi awọn ebute oko oju omi meji ti ogun kan, so awọn ebute oko oju omi pọ si ara wọn, bẹrẹ olupilẹṣẹ lori ọkan, ati atunnkanka lori keji. Ko si awọn iyanilẹnu nibi, ṣugbọn ni otitọ gbogbo rẹ da lori irin, alailagbara, diẹ sii yoo nifẹ si nibi.

Lilo data ti o gba nipasẹ eto ibojuwo (Zabbix)

tsp ko ni eyikeyi ẹrọ-ṣeékà API bi SNMP tabi iru. Awọn ifiranṣẹ CC gbọdọ wa ni akojọpọ fun o kere ju 1 iṣẹju-aaya (pẹlu ipin giga ti ipadanu soso, awọn ọgọọgọrun/ẹgbẹrun/ẹgbẹrun ẹgbẹẹgbẹrun le jẹ fun iṣẹju kan, da lori iwọn bitrate).

Nitorinaa, lati le fipamọ alaye mejeeji ati fa awọn aworan fun awọn aṣiṣe CC ati bitrate ati ṣe iru awọn ijamba, awọn aṣayan wọnyi le wa:

  1. Pari ati akojọpọ (nipasẹ CC) abajade ti tsp, i.e. yi pada si fọọmu ti o fẹ.
  2. Pari tsp funrararẹ ati / tabi awọn afikun ero isise bitrate_monitor ati ilosiwaju ki abajade jẹ fun ni fọọmu kika ẹrọ ti o dara fun eto ibojuwo.
  3. Kọ ohun elo rẹ si oke ile-ikawe tsduck.

O han ni, aṣayan 1 ni o rọrun julọ ni awọn ofin igbiyanju, ni pataki ni imọran pe tsduck funrararẹ ni a kọ si ni ipele kekere (nipasẹ awọn iṣedede ode oni) ede (C ++)

Afọwọkọ bash parser + aggregator ti o rọrun fihan pe lori ṣiṣan 10Mbps ati pipadanu soso 50% (ọran ti o buru julọ), ilana bash jẹ awọn akoko 3-4 diẹ sii Sipiyu ju ilana tsp funrararẹ. Oju iṣẹlẹ yii ko ṣe itẹwọgba. Lootọ nkan kan ti apẹrẹ yii ni isalẹ

Nudulu lori oke

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

Ni afikun si jijẹ o lọra ti ko ṣe itẹwọgba, ko si awọn okun deede ni bash, awọn iṣẹ bash jẹ awọn ilana lọtọ, ati pe Mo ni lati kọ iye ti sonuPackets lẹẹkan ni iṣẹju kan lori ipa ẹgbẹ (nigbati gbigba awọn ifiranṣẹ bitrate ti o wa ni gbogbo iṣẹju-aaya). Bi abajade, bash ni a fi silẹ nikan ati pe o pinnu lati kọ iwe-ipamọ (parser + aggregator) ni golang. Lilo Sipiyu ti koodu golang ti o jọra jẹ awọn akoko 4-5 kere si ilana tsp funrararẹ. Iyara ti wrapper nitori rirọpo bash pẹlu golang ti jade lati jẹ awọn akoko 16 ati ni gbogbogbo abajade jẹ itẹwọgba (CPU lori oke nipasẹ 25% ninu ọran ti o buru julọ). Faili orisun golang wa nibi.

Run wrapper

Lati bẹrẹ ipari, awoṣe iṣẹ ti o rọrun julọ fun systemd ni a ṣe (nibi). Apoti funrararẹ yẹ ki o ṣe akojọpọ sinu faili alakomeji (go build tsduck-stat.go) ti o wa ni /opt/tsduck-stat/. O ti ro pe o nlo golang pẹlu atilẹyin fun aago monotonic (> = 1.9).

Lati ṣẹda apẹẹrẹ ti iṣẹ naa, o nilo lati ṣiṣẹ pipaṣẹ ṣiṣẹ systemctl [imeeli ni idaabobo]: 1234 lẹhinna ṣiṣe pẹlu systemctl ibere [imeeli ni idaabobo]: 1234.

Awari lati Zabbix

Ni ibere fun zabbix lati ni anfani lati ṣawari awọn iṣẹ ṣiṣe, o ti ṣe egbe akojọ monomono (discovery.sh), ni ọna kika ti a beere fun wiwa Zabbix, o ro pe o wa ni ibi kanna - ni /opt/tsduck-stat. Lati ṣiṣe wiwa nipasẹ aṣoju zabbix, o nilo lati ṣafikun .conf faili si ilana iṣeto ni aṣoju zabbix lati ṣafikun paramita olumulo.

Zabbix awoṣe

Awoṣe ti a ṣẹda (tsduck_stat_template.xml) ni ofin wiwa autodiscover, awọn apẹẹrẹ ohun kan, awọn aworan, ati awọn okunfa.

Akojọ ayẹwo kukuru (daradara, kini ti ẹnikan ba pinnu lati lo)

  1. Rii daju pe tsp ko ju awọn apo-iwe silẹ labẹ awọn ipo “bojumu” (ipilẹṣẹ ati olutupalẹ ti sopọ taara), ti o ba wa silẹ, wo paragira 2 tabi ọrọ ti nkan naa lori ọran yii.
  2. Ṣe yiyi ifipamọ iho ti o pọju (net.core.rmem_max=8388608).
  3. Ṣe akopọ tsduck-stat.go (lọ kọ tsduck-stat.go).
  4. Fi awoṣe iṣẹ sinu /lib/systemd/system.
  5. Bẹrẹ awọn iṣẹ pẹlu systemctl, ṣayẹwo pe awọn iṣiro ti bẹrẹ lati han (grep "" /dev/shm/tsduck-stat/*). Nọmba awọn iṣẹ nipasẹ nọmba awọn ṣiṣan multicast. Nibi o le nilo lati ṣẹda ipa-ọna si ẹgbẹ multicast, boya mu rp_filter kuro tabi ṣẹda ipa-ọna si ip orisun.
  6. Ṣiṣe discovery.sh, rii daju pe o ṣe ipilẹṣẹ json.
  7. Ṣafikun atunto aṣoju zabbix, tun bẹrẹ aṣoju zabbix.
  8. Po si awọn awoṣe to zabbix, waye o si awọn ogun ti o ti wa ni abojuto ati awọn ti o ti fi sori ẹrọ zabbix-oluranlowo, duro nipa 5 iṣẹju, ri ti o ba nibẹ ni o wa titun awọn ohun kan, awọn aworan ati awọn okunfa.

Esi

Lilo TSDuck lati Atẹle IP (TS) ṣiṣan

Fun iṣẹ ṣiṣe wiwa pipadanu soso, o fẹrẹ to, o kere ju o dara ju ko si ibojuwo.

Nitootọ, CC "awọn adanu" le waye nigbati o ba dapọ awọn ajẹkù fidio (bi o ti jẹ pe mo mọ, eyi ni bi a ṣe ṣe awọn ifibọ ni awọn ile-iṣẹ TV ti agbegbe ni Russian Federation, ie lai ṣe atunṣe counter CC), eyi gbọdọ wa ni iranti. Awọn ojutu ohun-ini ni apakan kan yika iṣoro yii nipa wiwa awọn aami SCTE-35 (ti o ba ṣafikun nipasẹ olupilẹṣẹ ṣiṣan).

Ni awọn ofin ti ibojuwo didara gbigbe, aini ibojuwo jitter (IAT) wa. Ohun elo TV (jẹ awọn oluyipada tabi awọn ẹrọ ipari) ni awọn ibeere fun paramita yii ati pe kii ṣe nigbagbogbo ṣee ṣe lati fa jitbuffer si ailopin. Ati jitter le leefofo nigba ti ohun elo pẹlu awọn buffers nla ti lo ni gbigbe ati pe QoS ko ni tunto tabi ko tunto daradara to lati tan iru ijabọ akoko gidi.

orisun: www.habr.com

Fi ọrọìwòye kun