Amin'izao fotoana izao, misy vahaolana efa vita (proprietary) ho an'ny fanaraha-maso ny renirano IP (TS), ohatra
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
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:
- Parse sy aggregate (amin'ny CC) ny vokatra tsp, i.e. avadika ho endrika irina.
- 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.
- 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
Run wrapper
Mba hanombohana ny fonosana dia natao ny modely serivisy tsotra indrindra ho an'ny systemd (
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
Zabbix template
Lisitra fohy (eny, ahoana raha misy olona manapa-kevitra ny hampiasa izany)
- 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.
- Ataovy ny fanamafisam-peo ambony indrindra (net.core.rmem_max=8388608).
- Manangona tsduck-stat.go (mandehana manangana tsduck-stat.go).
- Apetraho ao amin'ny /lib/systemd/system ny mΓ΄dely serivisy.
- 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.
- Ampandehano ny discovery.sh, ataovy azo antoka fa miteraka json izany.
- Ampio zabbix agent config, restart zabbix agent.
- 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
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