Sèvi ak TSDuck pou kontwole flux IP(TS).

Jodi a, gen pare-fè (pwopriyetè) solisyon pou kontwole IP(TS) koule, pou egzanp VB и iQ, yo gen yon seri fonksyon san patipri rich epi anjeneral gwo operatè ki fè fas ak sèvis televizyon gen solisyon menm jan an. Atik sa a dekri yon solisyon ki baze sou yon pwojè sous louvri TSduck, ki fèt pou kontwòl minim nan IP (TS) koule lè l sèvi avèk CC (kontan kont kontinyèl) kontwa ak bitrate. Yon aplikasyon posib se kontwole pèt pake oswa koule nan tout atravè yon kanal L2 lwe pou lontan (ki pa ka kontwole nòmalman, pou egzanp, pa lekti kontè pèt nan keu).

Trè yon ti tan sou TSduck

TSDuck se lojisyèl sous louvri (lisans BSD 2-klaz) (yon seri sèvis piblik konsole ak yon bibliyotèk pou devlope pwòp sèvis piblik ou oswa grefon) pou manipile kouran TS. Kòm yon opinyon, li ka travay ak IP (multicast/unicast), http, hls, dvb tuners, dektec dvb-asi demodulator, gen yon entèn dèlko kouran TS ak lekti nan dosye. Pwodiksyon an ka anrejistreman nan yon fichye, IP (multicast/unicast), hls, dektec dvb-asi ak HiDes modulateur, jwè (mplayer, vlc, xine) ak gout. Ant antre ak pwodiksyon, ou ka pèmèt processeurs trafik divès kalite, pou egzanp, remap PIDs, fè brouyaj / dekouraje, analize kontè CC, kalkile bitrate a ak lòt operasyon tipik pou kouran TS.

Nan atik sa a, IP streams (multicast) yo pral itilize kòm opinyon, bitrate_monitor processeurs (nan non an li klè ki sa sa a) ak kontinwite (CC kont analiz) processeurs yo pral itilize. San yo pa nenpòt pwoblèm, ou ka ranplase IP multicast ak yon lòt kalite opinyon sipòte pa TSduck.

Disponib bati/pake ofisyèl yo TSduck pou pi aktyèl OS. Pa gen okenn pou Debian, men nou jere yo konpile yo pou Debian 8 ak Debian 10 san okenn pwoblèm.

Apre sa, TSDuck vèsyon 3.19-1520 yo itilize, Linux yo itilize kòm eksplwatasyon an (debian 10 te itilize pou prepare solisyon an, CentOS 7 te itilize pou itilizasyon aktyèl la)

Prepare TSduck ak OS

Anvan kontwole koule reyèl, ou bezwen asire w ke TSDuck travay kòrèkteman epi ke gout pa rive nan kat rezo a oswa OS (priz) nivo. Sa a obligatwa pou ou pa bezwen devine pita kote gout yo te fèt - sou rezo a oswa "andedan sèvè a." Ou ka tcheke gout nan nivo kat rezo a ak kòmandman ethtool -S ethX, réglage se fè pa menm ethtool (anjeneral ou bezwen ogmante tanpon RX a (-G) epi pafwa enfim kèk dechaj (-K)). Kòm yon rekòmandasyon jeneral, li rekòmande pou itilize yon pò separe pou resevwa trafik analize a, si sa posib, sa pral minimize fo pozitif akòz lefèt ke gout la te fèt ansanm sou pò analizè a akòz prezans lòt trafik. Si sa a se pa posib (w ap itilize yon mini-òdinatè/NUC ak yon sèl pò), Lè sa a, li trè rekòmande pou konfigirasyon priyorite nan trafik la analize an relasyon ak rès la sou aparèy la nan ki analize a konekte. Konsènan anviwònman vityèl, isit la ou bezwen fè atansyon epi yo dwe kapab jwenn gout pake kòmanse nan pò fizik la epi fini ak aplikasyon an andedan machin nan vityèl.

Jenere ak resevwa yon kouran nan lame a

Kòm yon premye etap nan prepare TSDuck, nou pral jenere epi resevwa trafik nan yon sèl lame lè l sèvi avèk netns.

Prepare anviwònman an:

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

Anviwònman an pare. Lanse analizè trafik la:

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

kote "-p 1 -t 1" vle di ke ou bezwen kalkile bitrate a chak segonn epi montre enfòmasyon sou bitrate a chak segonn
Nou lanse yon dèlko trafik ak yon vitès 10 Mbit/s:

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

kote "-p 7 -e" vle di ke ou bezwen pake 7 pake TS nan 1 pake IP epi fè li difisil (-e), i.e. toujou rete tann pou 7 TS pake ki soti nan dènye processeur la anvan ou voye fòmasyon nan yon pake IP.

Analizè a kòmanse montre mesaj yo espere:

* 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

Koulye a, ann ajoute kèk gout:

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

ak mesaj tankou sa a parèt:

* 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 

ki espere. Nou enfim pèt pake (ip netns exec P iptables -F) epi eseye ogmante bitrate dèlko a a 100 Mbit/s. Analizè a rapòte yon pakèt erè CC ak anviwon 75 Mbit/s olye de 100. Nou ap eseye chèche konnen ki moun ki blame - jeneratè a pa kenbe oswa pwoblèm nan pa nan li, pou fè sa nou kòmanse jenere yon kantite pake fiks (700000 pake TS = 100000 pake IP):

# 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

Kòm ou ka wè, egzakteman 100000 pake IP yo te pwodwi (151925460-151825460). Se konsa, nou konnen sa k ap pase ak analizè a, pou fè sa nou tcheke avèk kontwa RX sou veth1, li se entèdi egal ak kontwa TX sou veth0, Lè sa a, nou gade sa k ap pase nan nivo priz la:

# 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 

Isit la ou ka wè kantite gout = 24355. Nan pake TS sa a se 170485 oswa 24.36% nan 700000, kidonk nou wè ke menm 25% nan pousantaj la pèdi se gout nan priz la UDP. Gout sou yon priz UDP anjeneral rive akòz yon mank de tanpon, ann wè ki gwosè tanpon priz default la ak gwosè maksimòm priz tanpon an:

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

Kidonk, si aplikasyon yo pa mande klèman gwosè tanpon an, yo kreye sockets ak yon tanpon 208 KB, men si yo mande plis, yo p ap toujou resevwa sa yo te mande a. Piske nan tsp ou ka mete gwosè tanpon pou D 'IP (--tapon-gwosè), nou pa pral manyen gwosè a priz default, men yo pral sèlman mete gwosè a tanpon maksimòm priz epi presize gwosè a tanpon klèman atravè agiman yo 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

Avèk akor sa a nan tanpon priz la, to a rapòte se kounye a apeprè 100Mbps, pa gen okenn erè CC.

Ki baze sou konsomasyon CPU pa aplikasyon an tsp tèt li. Konsènan yon nwayo i5-4260U CPU @ 1.40GHz, pou analize yon koule 10Mbit/s, 3-4% CPU a ap mande, 100Mbit/s - 25%, 200Mbit/s - 46%. Lè w ap fikse % pèt pake, chaj CPU a pratikman pa ogmante (men li ka diminye).

Sou pyès ki nan konpitè ki pi pwodiktif, li te posib jenere ak analize kouran ki gen plis pase 1 Gb / s san okenn pwoblèm.

Tès sou kat rezo reyèl

Apre tès sou yon pè veth, ou bezwen pran de lame oswa de pò nan yon sèl lame, konekte pò yo youn ak lòt, kouri dèlko a sou yon sèl, ak analizeur a sou dezyèm lan. Pa te gen okenn sipriz isit la, men an reyalite li tout depann sou pyès ki nan konpitè, pi fèb la li se, pi enteresan an li pral isit la.

Sèvi ak done yo resevwa pa sistèm siveyans lan (Zabbix)

tsp pa gen okenn API lizib nan machin tankou SNMP oswa menm jan an. Mesaj CC yo bezwen rasanble omwen 1 segonn alafwa (ak yon gwo pousantaj pèt pake, kapab genyen dè santèn / dè milye / dè dizèn de milye pou chak segonn, tou depann de bitrate a).

Kidonk, nan lòd pou konsève pou enfòmasyon ak trase graf pou erè CC ak bitrate epi fè kèk kalite aksidan pi lwen, ka gen opsyon sa yo:

  1. Analize ak total (pa CC) pwodiksyon ti kiyè a, i.e. transfòme li nan fòm ou vle a.
  2. Ajoute ti kiyè a li menm ak/oswa bitrate_monitor ak grefon kontinwite processeur pou rezilta a se pwodiksyon nan yon fòm machin-lizib apwopriye pou sistèm siveyans la.
  3. Ekri aplikasyon w lan anlè bibliyotèk tsduck la.

Li evidan, an tèm de depans travay, opsyon 1 se pi senp lan, sitou lè nou konsidere ke tsduck li menm ekri nan yon lang ki ba nivo (pa estanda modèn) (C++)

Yon pwototip senp nan yon analizeur + agrégateur nan bach te montre ke nan yon koule nan 10 Mbit / s ak 50% pèt pake (pi move ka), pwosesis la bash boule 3-4 fwa plis CPU pase pwosesis la tsp tèt li. Senaryo sa a pa akseptab. Aktyèlman yon moso nan pwototip sa a se anba a

Nouy sou 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

Anplis de sa nan lefèt ke sa a travay inakseptab dousman, pa gen okenn fil nòmal nan bash, travay bash yo se pwosesis endepandan epi mwen te oblije ekri valè missingPackets yon fwa yon dezyèm sou efè segondè (lè w ap resevwa mesaj bitrate ki vini chak segonn). Kòm yon rezilta, bash te rete pou kont li epi li te deside ekri yon wrapper (parser + aggregator) nan golang. Konsomasyon CPU nan kòd menm jan an nan golang se 4-5 fwa mwens pase pwosesis la tsp tèt li. Akselerasyon wrapper a pa ranplase bash ak golang te apeprè 16 fwa ak an jeneral rezilta a akseptab (CPU anlè pa 25% nan ka ki pi mal la). Fichye sous golang la sitiye isit la.

Lanse wrapper la

Pou lanse wrapper a, yo te fè yon modèl sèvis senp pou systemd (isit la). Li sipoze ke wrapper nan tèt li konpile nan yon dosye binè (ale bati tsduck-stat.go), ki chita nan /opt/tsduck-stat/. Yo sipoze golang yo itilize ak sipò revèy monotone (>=1.9).

Pou kreye yon egzanp sèvis ou bezwen kouri kòmandman systemctl enable [imèl pwoteje]:1234, Lè sa a, kouri ak systemctl kòmanse [imèl pwoteje]: 1234.

Dekouvèt soti nan Zabbix

Se konsa, ke zabbix ka fè yon dekouvèt nan kouri sèvis yo, dèlko lis gwoup (discovery.sh), nan fòma ki nesesè pou dekouvèt Zabbix, li sipoze ke li sitiye nan menm kote a - nan /opt/tsduck-stat. Pou kouri dekouvèt atravè zabbix-agent, ou bezwen ajoute .conf dosye nan anyè a ak konfigirasyon zabbix-agent pou ajoute yon paramèt itilizatè.

Zabbix modèl

Kreye modèl (tsduck_stat_template.xml) gen règ dekouvèt oto, eleman, graf, ak pwototip deklanche.

Yon lis verifikasyon kout (e si yon moun deside sèvi ak li)

  1. Asire w ke tsp pa lage pake nan kondisyon "ideyal" (dèlko a ak analizeur yo konekte dirèkteman), si gen gout, gade pwen 2 oswa tèks la nan atik la sou sijè sa a.
  2. Fè akor nan tanpon priz maksimòm lan (net.core.rmem_max=8388608).
  3. Konpile tsduck-stat.go (ale bati tsduck-stat.go).
  4. Mete modèl sèvis la nan /lib/systemd/system.
  5. Kòmanse sèvis yo itilize systemctl, tcheke si kontè yo te kòmanse parèt (grep "" /dev/shm/tsduck-stat/*). Kantite sèvis pa kantite kouran multicast. Isit la ou ka bezwen kreye yon wout nan gwoup la multidiffusion, petèt enfim rp_filter oswa kreye yon wout nan ip sous la.
  6. Kouri discovery.sh, asire w ke li jenere json.
  7. Mete konfigirasyon ajan zabbix la, rekòmanse ajan zabbix la.
  8. Voye modèl la nan zabbix, aplike li nan lame a ki te fè siveyans ak zabbix-agent enstale, rete tann apeprè 5 minit, wè ke nouvo eleman done, graf ak deklanche parèt.

Rezilta

Sèvi ak TSDuck pou kontwole flux IP(TS).

Pou travay la nan idantifye pèt pake, li se prèske ase, omwen li se pi bon pase pa gen okenn siveyans.

An reyalite, CC "pèt" ka rive lè splicing fragman videyo (jan mwen konnen, sa a se ki jan foure yo te fè nan sant televizyon lokal nan Federasyon Larisi la, sa vle di san yo pa rekalkile kontwa CC la), sa a dwe sonje. Nan solisyon propriétaires, pwoblèm sa a se pasyèlman kontourne pa detekte SCTE-35 Tags (si yo ajoute pa dèlko kouran an).

Soti nan pwen de vi siveyans bon jan kalite transpò, siveyans jitter (IAT) se pa ase, paske Ekipman televizyon (si wi ou non modulateur oswa aparèy fen) gen kondisyon pou paramèt sa a epi li pa toujou posib pou gonfle jitbuffer la endefiniman. Ak jitter ka flote lè transpò piblik itilize ekipman ak tanpon gwo ak QoS pa konfigirasyon oswa li pa konfigirasyon byen ase yo transmèt sa yo trafik an tan reyèl.

Sous: www.habr.com

Add nouvo kòmantè