ืฉื™ืžื•ืฉ ื‘-TSDuck ืœื ื™ื˜ื•ืจ ื–ืจื™ืžื•ืช IP(TS).

ื›ื™ื•ื ื™ืฉื ื ืคืชืจื•ื ื•ืช ืžื•ื›ื ื™ื (ืงื ื™ื™ื ื™ื™ื) ืœื ื™ื˜ื•ืจ ื–ืจื™ืžื•ืช IP(TS), ืœืžืฉืœ VB ะธ iQ, ื™ืฉ ืœื”ื ืžืขืจืš ื“ื™ ืขืฉื™ืจ ืฉืœ ืคื•ื ืงืฆื™ื•ืช ื•ื‘ื“ืจืš ื›ืœืœ ืœืžืคืขื™ืœื™ื ื’ื“ื•ืœื™ื ื”ืขื•ืกืงื™ื ื‘ืฉื™ืจื•ืชื™ ื˜ืœื•ื•ื™ื–ื™ื” ื™ืฉ ืคืชืจื•ื ื•ืช ื“ื•ืžื™ื. ืžืืžืจ ื–ื” ืžืชืืจ ืคืชืจื•ืŸ ื”ืžื‘ื•ืกืก ืขืœ ืคืจื•ื™ืงื˜ ืงื•ื“ ืคืชื•ื— TSDuck, ืžื™ื•ืขื“ ืœืฉืœื™ื˜ื” ืžื™ื ื™ืžืœื™ืช ืฉืœ ื–ืจื™ืžื•ืช IP(TS) ื‘ืืžืฆืขื•ืช ืžื•ื ื” CC (ืžื•ื ื” ื”ืžืฉื›ื™ื•ืช) ื•ืงืฆื‘ ืกื™ื‘ื™ื•ืช. ื™ื™ืฉื•ื ืืคืฉืจื™ ื”ื•ื ื ื™ื˜ื•ืจ ืื•ื‘ื“ืŸ ืžื ื•ืช ืื• ื›ืœ ื”ื–ืจื™ืžื” ื“ืจืš ืขืจื•ืฅ L2 ืžื•ืฉื›ืจ (ืฉืœื ื ื™ืชืŸ ืœื ื˜ืจ ืื•ืชื• ื‘ืื•ืคืŸ ืจื’ื™ืœ, ืœืžืฉืœ, ืขืœ ื™ื“ื™ ืงืจื™ืืช ืžื•ื ื™ ืื•ื‘ื“ืŸ ื‘ืชื•ืจื™ื).

ื‘ืงืฆืจื” ืžืื•ื“ ืขืœ TSDuck

TSDuck ื”ื™ื ืชื•ื›ื ืช ืงื•ื“ ืคืชื•ื— (ืจื™ืฉื™ื•ืŸ BSD 2-ืกืขื™ืคื™ื) (ืกื˜ ืฉืœ ื›ืœื™ ืขื–ืจ ืœืงื•ื ืกื•ืœื•ืช ื•ืกืคืจื™ื™ื” ืœืคื™ืชื•ื— ื›ืœื™ ืขื–ืจ ืื• ืชื•ืกืคื™ื ืžืฉืœืš) ืœืชืคืขื•ืœ ื–ืจืžื™ TS. ื›ืงืœื˜, ื–ื” ื™ื›ื•ืœ ืœืขื‘ื•ื“ ืขื IP (multicast/unicast), http, hls, dvb tuners, dektec dvb-asi demodulator, ื™ืฉ ืžื—ื•ืœืœ ื–ืจื TS ืคื ื™ืžื™ ื•ืงืจื™ืื” ืžืงื‘ืฆื™ื. ื”ืคืœื˜ ื™ื›ื•ืœ ืœื”ื™ื•ืช ื”ืงืœื˜ื” ืœืงื•ื‘ืฅ, IP (multicast/unicast), hls, dektec dvb-asi ื•- HiDes ืžืืคื ื ื™ื, ื ื’ื ื™ื (mplayer, vlc, xine) ื•-Drop. ื‘ื™ืŸ ื”ืงืœื˜ ืœืคืœื˜, ืืชื” ื™ื›ื•ืœ ืœืืคืฉืจ ืžืขื‘ื“ื™ ืชืขื‘ื•ืจื” ืฉื•ื ื™ื, ืœืžืฉืœ, ืžื™ืคื•ื™ ืžื—ื“ืฉ ืฉืœ PIDs, ื‘ื™ืฆื•ืข ืขืจื‘ื•ืœ/ืคื™ืจื•ืง, ื ื™ืชื•ื— ืžื•ื ื™ CC, ื—ื™ืฉื•ื‘ ืงืฆื‘ ื”ืกื™ื‘ื™ื•ืช ื•ืคืขื•ืœื•ืช ืื—ืจื•ืช ืื•ืคื™ื™ื ื™ื•ืช ืœื–ืจืžื™ TS.

ื‘ืžืืžืจ ื–ื” ื™ืฉืžืฉื• ื–ืจืžื™ IP (multicast) ื›ืงืœื˜, ืžืขื‘ื“ื™ bitrate_monitor (ืžื”ืฉื ื‘ืจื•ืจ ืžื” ื–ื”) ื•ืžืขื‘ื“ื™ ื”ืžืฉื›ื™ื•ืช (CC counter analysis). ืœืœื ื›ืœ ื‘ืขื™ื”, ืืชื” ื™ื›ื•ืœ ืœื”ื—ืœื™ืฃ ืจื™ื‘ื•ื™ ืฉื™ื“ื•ืจ IP ื‘ืกื•ื’ ืงืœื˜ ืื—ืจ ื”ื ืชืžืš ืขืœ ื™ื“ื™ TSDuck.

ื–ืžื™ื ื™ื ื‘ื•ื ื™ื/ื—ื‘ื™ืœื•ืช ืจืฉืžื™ื™ื TSDuck ืขื‘ื•ืจ ืจื•ื‘ ืžืขืจื›ืช ื”ื”ืคืขืœื” ื”ืขื“ื›ื ื™ืช. ืื™ืŸ ื›ืืœื” ืขื‘ื•ืจ ื“ื‘ื™ืืŸ, ืื‘ืœ ื”ืฆืœื—ื ื• ืœื”ืจื›ื™ื‘ ืื•ืชื ืขื‘ื•ืจ ื“ื‘ื™ืืŸ 8 ื•ื“ื‘ื™ืืŸ 10 ืœืœื ื‘ืขื™ื•ืช.

ืœืื—ืจ ืžื›ืŸ, ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘-TSDuck ื’ืจืกื” 3.19-1520, ืœื™ื ื•ืงืก ืžืฉืžืฉืช ื›ืžืขืจื›ืช ื”ื”ืคืขืœื” (ื“ื‘ื™ืืŸ 10 ืฉื™ืžืฉื” ืœื”ื›ื ืช ื”ืคืชืจื•ืŸ, CentOS 7 ืฉื™ืžืฉ ืœืฉื™ืžื•ืฉ ื‘ืคื•ืขืœ)

ื”ื›ื ืช TSDuck ื•ืžืขืจื›ืช ื”ืคืขืœื”

ืœืคื ื™ ื ื™ื˜ื•ืจ ื–ืจื™ืžื•ืช ืืžื™ืชื™ื•ืช, ืขืœื™ืš ืœื•ื•ื“ื ืฉ-TSDuck ืคื•ืขืœ ื›ื”ืœื›ื” ื•ืฉืœื ื™ืชืจื—ืฉื• ื ืคื™ืœื•ืช ื‘ืจืžืช ื›ืจื˜ื™ืก ื”ืจืฉืช ืื• ืžืขืจื›ืช ื”ื”ืคืขืœื” (ืฉืงืข). ื–ื” ื ื“ืจืฉ ื›ื“ื™ ืฉืœื ืชืฆื˜ืจืš ืœื ื—ืฉ ืžืื•ื—ืจ ื™ื•ืชืจ ื”ื™ื›ืŸ ื”ืชืจื—ืฉื• ื”ื ืคื™ืœื•ืช - ื‘ืจืฉืช ืื• "ื‘ืชื•ืš ื”ืฉืจืช". ื ื™ืชืŸ ืœื‘ื“ื•ืง ื ืคื™ืœื•ืช ื‘ืจืžืช ื›ืจื˜ื™ืก ื”ืจืฉืช ืขื ื”ืคืงื•ื“ื” ethtool -S ethX, ื”ื›ื•ื•ื ื•ืŸ ื ืขืฉื” ืขืœ ื™ื“ื™ ืื•ืชื• ethtool (ื‘ื“ืจืš ื›ืœืœ ืฆืจื™ืš ืœื”ื’ื“ื™ืœ ืืช ืžืื’ืจ ื”-RX (-G) ื•ืœืขื™ืชื™ื ืœื ื˜ืจืœ ื›ืžื” ื ื™ืชื•ืงื™ื (-K)). ื›ื”ืžืœืฆื” ื›ืœืœื™ืช, ืจืฆื•ื™ ืœื”ืฉืชืžืฉ ื‘ืคื•ืจื˜ ื ืคืจื“ ืœืงืœื™ื˜ืช ื”ืชืขื‘ื•ืจื” ื”ืžื ื•ืชื—ืช, ื‘ืžื™ื“ืช ื”ืืคืฉืจ, ื”ื“ื‘ืจ ื™ืžื–ืขืจ ืชื•ืฆืื•ืช ื—ื™ื•ื‘ื™ื•ืช ืฉื’ื•ื™ื•ืช ื‘ืฉืœ ื”ืขื•ื‘ื“ื” ืฉื”ื™ืจื™ื“ื” ื”ืชืจื—ืฉื” ื‘ื• ื–ืžื ื™ืช ื‘ื™ืฆื™ืืช ื”ื ืชื— ืขืงื‘ ื ื•ื›ื—ื•ืช ืชืขื‘ื•ืจื” ืื—ืจืช. ืื ื–ื” ืœื ืืคืฉืจื™ (ืืชื ืžืฉืชืžืฉื™ื ื‘ืžื™ื ื™ ืžื—ืฉื‘/NUC ืขื ื™ืฆื™ืื” ืื—ืช), ืื– ื›ื“ืื™ ืžืื•ื“ ืœื”ื’ื“ื™ืจ ืืช ื”ืขื“ื™ืคื•ืช ืฉืœ ื”ืชืขื‘ื•ืจื” ื”ืžื ื•ืชื—ืช ื‘ื™ื—ืก ืœืฉืืจ ื‘ืžื›ืฉื™ืจ ืฉืืœื™ื• ืžื—ื•ื‘ืจ ื”ืžื ืชื—. ืœื’ื‘ื™ ืกื‘ื™ื‘ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช, ื›ืืŸ ืืชื” ืฆืจื™ืš ืœื”ื™ื•ืช ื–ื”ื™ืจ ื•ืœื”ื™ื•ืช ืžืกื•ื’ืœ ืœืžืฆื•ื ื˜ื™ืคื•ืช ืžื ื•ืช ื”ื—ืœ ืžื”ื™ืฆื™ืื” ื”ืคื™ื–ื™ืช ื•ื›ืœื” ื‘ืืคืœื™ืงืฆื™ื” ื‘ืชื•ืš ื”ืžื›ื•ื ื” ื”ื•ื™ืจื˜ื•ืืœื™ืช.

ื™ืฆื™ืจื” ื•ืงื‘ืœื” ืฉืœ ื–ืจื ื‘ืชื•ืš ื”ืžืืจื—

ื›ืฉืœื‘ ืจืืฉื•ืŸ ื‘ื”ื›ื ืช TSDuck, ื ื™ืฆื•ืจ ื•ื ืงื‘ืœ ืชืขื‘ื•ืจื” ื‘ืชื•ืš ืžืืจื— ืื—ื“ ื‘ืืžืฆืขื•ืช netns.

ื”ื›ื ืช ื”ืกื‘ื™ื‘ื”:

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

ื”ืกื‘ื™ื‘ื” ืžื•ื›ื ื”. ื”ืคืขืœ ืืช ืžื ืชื— ื”ืชื ื•ืขื”:

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

ื›ืืฉืจ "-p 1 -t 1" ืื•ืžืจ ืฉืืชื” ืฆืจื™ืš ืœื—ืฉื‘ ืืช ืงืฆื‘ ื”ืกื™ื‘ื™ื•ืช ื‘ื›ืœ ืฉื ื™ื™ื” ื•ืœื”ืฆื™ื’ ืžื™ื“ืข ืขืœ ืงืฆื‘ ื”ืกื™ื‘ื™ื•ืช ื‘ื›ืœ ืฉื ื™ื™ื”
ืื ื• ืžืฉื™ืงื™ื ืžื—ื•ืœืœ ืชื ื•ืขื” ื‘ืžื”ื™ืจื•ืช ืฉืœ 10 Mbit/s:

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

ื›ืืฉืจ "-p 7 -e" ืื•ืžืจ ืฉืืชื” ืฆืจื™ืš ืœืืจื•ื– 7 ืžื ื•ืช TS ืœืชื•ืš ื—ื‘ื™ืœืช IP ืื—ืช ื•ืœืขืฉื•ืช ืืช ื–ื” ืงืฉื” (-e), ื›ืœื•ืžืจ. ืชืžื™ื“ ื”ืžืชืŸ ืœ-1 ืžื ื•ืช TS ืžื”ืžืขื‘ื“ ื”ืื—ืจื•ืŸ ืœืคื ื™ ืฉืœื™ื—ืช ื”ื™ื•ื•ืฆืจื•ืช ืฉืœ ื—ื‘ื™ืœืช IP.

ื”ืžื ืชื— ืžืชื—ื™ืœ ืœื”ืฆื™ื’ ืืช ื”ื”ื•ื“ืขื•ืช ื”ืฆืคื•ื™ื•ืช:

* 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

ืขื›ืฉื™ื• ื‘ื•ืื• ื ื•ืกื™ืฃ ื›ืžื” ื˜ื™ืคื•ืช:

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

ื•ื”ื•ื“ืขื•ืช ื›ืžื• ื–ื” ืžื•ืคื™ืขื•ืช:

* 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 

ืžื” ืฉืฆืคื•ื™. ืื ื• ืžืฉื‘ื™ืชื™ื ืื•ื‘ื“ืŸ ืžื ื•ืช (ip netns exec P iptables -F) ื•ืžื ืกื™ื ืœื”ื’ื“ื™ืœ ืืช ืงืฆื‘ ื”ืกื™ื‘ื™ื•ืช ืฉืœ ื”ืžื—ื•ืœืœ ืœ-100 Mbit/s. ื”ืžื ืชื— ืžื“ื•ื•ื— ืขืœ ืฆืจื•ืจ ืฉื’ื™ืื•ืช CC ื•ืขืœ 75 Mbit/s ื‘ืžืงื•ื 100. ืื ื—ื ื• ืžื ืกื™ื ืœื”ื‘ื™ืŸ ืžื™ ืืฉื - ื”ืžื—ื•ืœืœ ืœื ืขื•ืžื“ ื‘ืงืฆื‘ ืื• ืฉื”ื‘ืขื™ื” ืœื ื‘ื•, ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช ืื ื—ื ื• ืžืชื—ื™ืœื™ื ืœื™ื™ืฆืจ ืžืกืคืจ ืงื‘ื•ืข ืฉืœ ืžื ื•ืช (700000 ืžื ื•ืช TS = 100000 ืžื ื•ืช 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

ื›ืคื™ ืฉืืชื” ื™ื›ื•ืœ ืœืจืื•ืช, ื ื•ืฆืจื• ื‘ื“ื™ื•ืง 100000 ืžื ื•ืช IP (151925460-151825460). ืื– ืื ื—ื ื• ืžื‘ื™ื ื™ื ืžื” ืงื•ืจื” ืขื ื”ื ืชื—, ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช ืื ื—ื ื• ื‘ื•ื“ืงื™ื ืขื ืžื•ื ื” ื”-RX ื‘-veth1, ื”ื•ื ืฉื•ื•ื” ื‘ื”ื—ืœื˜ ืœืžื•ื ื” ื”-TX ื‘-veth0, ื•ืื– ืื ื—ื ื• ืžืกืชื›ืœื™ื ืขืœ ืžื” ืฉืงื•ืจื” ื‘ืจืžืช ื”ืฉืงืข:

# 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 

ื›ืืŸ ืืชื” ื™ื›ื•ืœ ืœืจืื•ืช ืืช ืžืกืคืจ ื”ื˜ื™ืคื•ืช = 24355. ื‘ื—ื‘ื™ืœื•ืช TS ื–ื” 170485 ืื• 24.36% ืž-700000, ืื– ืื ื—ื ื• ืจื•ืื™ื ืฉืื•ืชื 25% ืžืงืฆื‘ ื”ืกื™ื‘ื™ื•ืช ื”ืื‘ื•ื“ ื”ืŸ ื ืคื™ืœื•ืช ื‘ืฉืงืข UDP. ื ืคื™ืœื•ืช ืขืœ ืฉืงืข UDP ืžืชืจื—ืฉื•ืช ื‘ื“ืจืš ื›ืœืœ ืขืงื‘ ืžื—ืกื•ืจ ื‘ืžืื’ืจ, ืจืื” ืžื” ื’ื•ื“ืœ ืžืื’ืจ ื”ืฉืงืข ื”ืžื•ื’ื“ืจ ื›ื‘ืจื™ืจืช ืžื—ื“ืœ ื•ื’ื•ื“ืœ ืžืื’ืจ ื”ืฉืงืข ื”ืžืจื‘ื™:

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

ืœืคื™ื›ืš, ืื ื™ื™ืฉื•ืžื™ื ืœื ืžื‘ืงืฉื™ื ื‘ืžืคื•ืจืฉ ืืช ื’ื•ื“ืœ ื”ืžืื’ืจ, ื ื•ืฆืจื™ื ืฉืงืขื™ื ืขื ืžืื’ืจ ืฉืœ 208 KB, ืืš ืื ื”ื ืžื‘ืงืฉื™ื ื™ื•ืชืจ, ื”ื ืขื“ื™ื™ืŸ ืœื ื™ืงื‘ืœื• ืืช ืžื” ืฉื‘ื™ืงืฉื•. ืžื›ื™ื•ื•ืŸ ืฉื‘-tsp ืืชื” ื™ื›ื•ืœ ืœื”ื’ื“ื™ืจ ืืช ื’ื•ื“ืœ ื”ืžืื’ืจ ืขื‘ื•ืจ ืงืœื˜ IP (--buffer-size), ืœื ื ื™ื’ืข ื‘ื’ื•ื“ืœ ื”ืฉืงืข ื‘ืจื™ืจืช ื”ืžื—ื“ืœ, ืืœื ืจืง ื ื’ื“ื™ืจ ืืช ื’ื•ื“ืœ ื”ืžืื’ืจ ื”ืžืงืกื™ืžืœื™ ืฉืœ ื”ืฉืงืข ื•ื ืฆื™ื™ืŸ ืืช ื’ื•ื“ืœ ื”ืžืื’ืจ ื‘ืžืคื•ืจืฉ ื“ืจืš ื”ืืจื’ื•ืžื ื˜ื™ื 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

ืขื ื›ื•ื•ื ื•ืŸ ื–ื” ืฉืœ ืžืื’ืจ ื”ืฉืงืข, ืงืฆื‘ ื”ืกื™ื‘ื™ื•ืช ื”ืžื“ื•ื•ื— ื”ื•ื ื›ืขืช ื›-100Mbps, ืื™ืŸ ืฉื’ื™ืื•ืช CC.

ืžื‘ื•ืกืก ืขืœ ืฆืจื™ื›ืช CPU ืขืœ ื™ื“ื™ ื™ื™ืฉื•ื tsp ืขืฆืžื•. ืœื’ื‘ื™ ืžืขื‘ื“ ืœื™ื‘ื” ืื—ื“ ืฉืœ i5-4260U @ 1.40GHz, ื›ื“ื™ ืœื ืชื— ื–ืจื™ืžื” ืฉืœ 10Mbit/s, ื™ื™ื“ืจืฉ 3-4% ืžื”ืžืขื‘ื“, 100Mbit/s - 25%, 200Mbit/s - 46%. ื›ืืฉืจ ืžื’ื“ื™ืจื™ื % ืื•ื‘ื“ืŸ ืžื ื•ืช, ืขื•ืžืก ื”ืžืขื‘ื“ ื›ืžืขื˜ ืื™ื ื• ืขื•ืœื” (ืืš ืขืฉื•ื™ ืœืจื“ืช).

ื‘ื—ื•ืžืจื” ืคืจื•ื“ื•ืงื˜ื™ื‘ื™ืช ื™ื•ืชืจ, ื ื™ืชืŸ ื”ื™ื” ืœื™ืฆื•ืจ ื•ืœื ืชื— ื–ืจืžื™ื ืฉืœ ื™ื•ืชืจ ืž-1Gb/s ืœืœื ื‘ืขื™ื•ืช.

ื‘ื“ื™ืงื” ืขืœ ื›ืจื˜ื™ืกื™ ืจืฉืช ืืžื™ืชื™ื™ื

ืœืื—ืจ ื‘ื“ื™ืงื” ืขืœ ื–ื•ื’ ื•ื•ืช', ืืชื” ืฆืจื™ืš ืœืงื—ืช ืฉื ื™ ืžืืจื—ื™ื ืื• ืฉืชื™ ื™ืฆื™ืื•ืช ืฉืœ ืžืืจื— ืื—ื“, ืœื—ื‘ืจ ืืช ื”ื™ืฆื™ืื•ืช ื–ื• ืœื–ื•, ืœื”ืคืขื™ืœ ืืช ื”ืžื—ื•ืœืœ ืขืœ ืื—ื“, ื•ืืช ื”ื ืชื— ืขืœ ื”ืฉื ื™. ืœื ื”ื™ื• ื›ืืŸ ื”ืคืชืขื•ืช, ืื‘ืœ ืœืžืขืฉื” ื”ื›ืœ ืชืœื•ื™ ื‘ื—ื•ืžืจื”, ื›ื›ืœ ืฉื”ื™ื ื—ืœืฉื” ื™ื•ืชืจ, ื›ืš ื–ื” ื™ื”ื™ื” ื›ืืŸ ื™ื•ืชืจ ืžืขื ื™ื™ืŸ.

ืฉื™ืžื•ืฉ ื‘ื ืชื•ื ื™ื ืฉื”ืชืงื‘ืœื• ืขืœ ื™ื“ื™ ืžืขืจื›ืช ื”ื ื™ื˜ื•ืจ (Zabbix)

ืœ-tsp ืื™ืŸ ืฉื•ื API ืงืจื™ื ื‘ืžื›ื•ื ื” ื›ืžื• SNMP ืื• ื“ื•ืžื”. ื”ื•ื“ืขื•ืช CC ืฆืจื™ื›ื•ืช ืœื”ืฆื˜ื‘ืจ ืœืคื—ื•ืช ืฉื ื™ื™ื” ืื—ืช ื‘ื›ืœ ืคืขื (ืขื ืื—ื•ื– ื’ื‘ื•ื” ืฉืœ ืื•ื‘ื“ืŸ ืžื ื•ืช, ื™ื›ื•ืœื•ืช ืœื”ื™ื•ืช ืžืื•ืช/ืืœืคื™ื/ืขืฉืจื•ืช ืืœืคื™ื ื‘ืฉื ื™ื™ื”, ืชืœื•ื™ ื‘ืงืฆื‘ ื”ืกื™ื‘ื™ื•ืช).

ืœืคื™ื›ืš, ืขืœ ืžื ืช ืœืฉืžื•ืจ ืžื™ื“ืข ื•ืœืฉืจื˜ื˜ ื’ืจืคื™ื ืขื‘ื•ืจ ืฉื’ื™ืื•ืช CC ื•ืงืฆื‘ ืกื™ื‘ื™ื•ืช ื•ืœื‘ืฆืข ืชืื•ื ื•ืช ื ื•ืกืคื•ืช, ืขืฉื•ื™ื•ืช ืœื”ื™ื•ืช ื”ืืคืฉืจื•ื™ื•ืช ื”ื‘ืื•ืช:

  1. ื ืชื— ื•ืื’ื“ (ื‘ืืžืฆืขื•ืช CC) ืืช ื”ืคืœื˜ tsp, ื›ืœื•ืžืจ. ืœื”ืคื•ืš ืื•ืชื• ืœืฆื•ืจื” ื”ืจืฆื•ื™ื”.
  2. ื”ื•ืกืฃ ืืช ื”-tsp ืขืฆืžื• ื•/ืื• ืืช ื”ืชื•ืกืคื™ื bitrate_monitor ื•ืžืขื‘ื“ ื”ืžืฉื›ื™ื•ืช ื›ืš ืฉื”ืชื•ืฆืื” ืชื•ืฆื ื‘ืฆื•ืจื” ืงืจื™ื ืžื›ื•ื ื” ื”ืžืชืื™ืžื” ืœืžืขืจื›ืช ื”ื ื™ื˜ื•ืจ.
  3. ื›ืชื•ื‘ ืืช ื”ื‘ืงืฉื” ืฉืœืš ืขืœ ื’ื‘ื™ ืกืคืจื™ื™ืช tsduck.

ื‘ืจื•ืจ ืฉืžื‘ื—ื™ื ืช ืขืœื•ื™ื•ืช ื”ืขื‘ื•ื“ื”, ืืคืฉืจื•ืช 1 ื”ื™ื ื”ืคืฉื•ื˜ื” ื‘ื™ื•ืชืจ, ื‘ืžื™ื•ื—ื“ ื‘ื”ืชื—ืฉื‘ ื‘ื›ืš ืฉ-tsduck ืขืฆืžื• ื›ืชื•ื‘ ื‘ืฉืคื” ื ืžื•ื›ื” (ื‘ืกื˜ื ื“ืจื˜ื™ื ืžื•ื“ืจื ื™ื™ื) (C++)

ืื‘ ื˜ื™ืคื•ืก ืคืฉื•ื˜ ืฉืœ ืžื ืชื— + ืื’ืจื’ื˜ื•ืจ ื‘-bash ื”ืจืื” ืฉื‘ื–ืจื™ืžื” ืฉืœ 10 Mbit/s ื•-50% ืื•ื‘ื“ืŸ ืžื ื•ืช (ื”ืžืงืจื” ื”ื’ืจื•ืข), ืชื”ืœื™ืš ื”-bash ืฆืจืš ืคื™ 3-4 ื™ื•ืชืจ CPU ืžืืฉืจ ืชื”ืœื™ืš ื”-tsp ืขืฆืžื•. ืชืจื—ื™ืฉ ื–ื” ืื™ื ื• ืžืชืงื‘ืœ ืขืœ ื”ื“ืขืช. ืœืžืขืฉื” ื—ืœืง ืžืื‘ ื”ื˜ื™ืคื•ืก ื”ื–ื” ื ืžืฆื ืœืžื˜ื”

ืื˜ืจื™ื•ืช ืขืœ ื‘ืืฉื”

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

ื‘ื ื•ืกืฃ ืœืขื•ื‘ื“ื” ืฉื–ื” ืขื•ื‘ื“ ืœืื˜ ื‘ืฆื•ืจื” ื‘ืœืชื™ ืžืชืงื‘ืœืช ืขืœ ื”ื“ืขืช, ืื™ืŸ ืฉืจืฉื•ืจื™ื ืจื’ื™ืœื™ื ื‘-bash, ืžืฉื™ืžื•ืช bash ื”ืŸ ืชื”ืœื™ื›ื™ื ืขืฆืžืื™ื™ื ื•ื”ื™ื™ืชื™ ืฆืจื™ืš ืœื›ืชื•ื‘ ืืช ื”ืขืจืš missingPackets ืคืขื ื‘ืฉื ื™ื™ื” ืขืœ ืชื•ืคืขืช ื”ืœื•ื•ืื™ (ื›ืฉืžืงื‘ืœื™ื ื”ื•ื“ืขื•ืช bitrate ืฉืžื’ื™ืขื•ืช ื›ืœ ืฉื ื™ื™ื”). ื›ืชื•ืฆืื” ืžื›ืš, bash ื ื•ืชืจ ืœื‘ื“ื• ื•ื”ื•ื—ืœื˜ ืœื›ืชื•ื‘ ืขื˜ื™ืคื” (ืžื ืชื— + ืื’ืจื’ื˜ื•ืจ) ื‘ื’ื•ืœื ื’. ืฆืจื™ื›ืช ื”ืžืขื‘ื“ ืฉืœ ืงื•ื“ ื“ื•ืžื” ื‘ื’ื•ืœื ื’ ื”ื™ื ืคื™ 4-5 ืคื—ื•ืช ืžืชื”ืœื™ืš ื”-tsp ืขืฆืžื•. ื”ืืฆืช ื”ืขื˜ื™ืคื” ืขืœ ื™ื“ื™ ื”ื—ืœืคืช bash ื‘ื’ื•ืœื ื’ ื”ื™ื™ืชื” ื‘ืขืจืš ืคื™ 16 ื•ื‘ืกืš ื”ื›ืœ ื”ืชื•ืฆืื” ืžืงื•ื‘ืœืช (ืชืงื•ืจื” ืฉืœ CPU ื‘-25% ื‘ืžืงืจื” ื”ื’ืจื•ืข). ืงื•ื‘ืฅ ื”ืžืงื•ืจ ืฉืœ Golang ื ืžืฆื ื›ืืŸ.

ืžืฉื’ืจ ืืช ื”ืขื˜ื™ืคื”

ื›ื“ื™ ืœื”ืคืขื™ืœ ืืช ื”ืžืขื˜ืคืช, ื ื•ืฆืจื” ืชื‘ื ื™ืช ืฉื™ืจื•ืช ืคืฉื•ื˜ื” ืขื‘ื•ืจ systemd (ื›ืืŸ). ื”ื”ื ื—ื” ื”ื™ื ืฉื”ืžืขื˜ืคืช ืขืฆืžื” ืžื•ืจื›ื‘ืช ืœืงื•ื‘ืฅ ื‘ื™ื ืืจื™ (ืขื‘ื•ืจ ืœื‘ื ื•ืช tsduck-stat.go), ื”ืžืžื•ืงื ื‘-/opt/tsduck-stat/. ื”ื”ื ื—ื” ื”ื™ื ืฉื’ื•ืœืื ื’ ืžืฉืžืฉ ืขื ืชืžื™ื›ื” ื‘ืฉืขื•ืŸ ืžื•ื ื•ื˜ื•ื ื™ (>=1.9).

ื›ื“ื™ ืœื™ืฆื•ืจ ืžื•ืคืข ืฉื™ืจื•ืช ืขืœื™ืš ืœื”ืคืขื™ืœ ืืช ื”ืคืงื•ื“ื” systemctl enable [ืžื•ื’ืŸ ื‘ื“ื•ื"ืœ]:1234, ื•ืื– ื”ืคืขืœ ืขื systemctl start [ืžื•ื’ืŸ ื‘ื“ื•ื"ืœ]: 1234.

ืชื’ืœื™ืช ืž-Zabix

ื›ื“ื™ ืฉ-zabbix ืชื•ื›ืœ ืœื’ืœื•ืช ื”ืคืขืœืช ืฉื™ืจื•ืชื™ื, ืžื—ื•ืœืœ ืจืฉื™ืžื•ืช ืงื‘ื•ืฆื•ืช (discovery.sh), ื‘ืคื•ืจืžื˜ ื”ื ื“ืจืฉ ืœื’ื™ืœื•ื™ Zabbix, ื”ื”ื ื—ื” ื”ื™ื ืฉื”ื•ื ืžืžื•ืงื ื‘ืื•ืชื• ืžืงื•ื - ื‘- /opt/tsduck-stat. ื›ื“ื™ ืœื”ืคืขื™ืœ ื’ื™ืœื•ื™ ื‘ืืžืฆืขื•ืช zabbix-agent, ืขืœื™ืš ืœื”ื•ืกื™ืฃ ืงื•ื‘ืฅ .conf ืœืกืคืจื™ื™ื” ืขื ืชืฆื•ืจื•ืช zabbix-agent ื›ื“ื™ ืœื”ื•ืกื™ืฃ ืคืจืžื˜ืจ ืžืฉืชืžืฉ.

ืชื‘ื ื™ืช Zabbix

ื ื•ืฆืจ ืชื‘ื ื™ืช (tsduck_stat_template.xml) ืžื›ื™ืœ ืืช ื›ืœืœ ื”ื’ื™ืœื•ื™ ื”ืื•ื˜ื•ืžื˜ื™, ืืœืžื ื˜, ื’ืจืฃ ื•ืื‘ื•ืช ื˜ื™ืคื•ืก ืฉืœ ื˜ืจื™ื’ืจ.

ืจืฉื™ืžืช ื‘ื“ื™ืงื” ืงืฆืจื” (ืžื” ื™ืงืจื” ืื ืžื™ืฉื”ื• ื™ื—ืœื™ื˜ ืœื”ืฉืชืžืฉ ื‘ื”)

  1. ื•ื“ื ืฉ-tsp ืœื ื™ืคื™ืœ ืžื ื•ืช ื‘ืชื ืื™ื "ืื™ื“ื™ืืœื™ื™ื" (ื”ื’ื ืจื˜ื•ืจ ื•ื”ืื ืœื™ื–ื˜ื•ืจ ืžื—ื•ื‘ืจื™ื ื™ืฉื™ืจื•ืช), ืื ื™ืฉ ื ืคื™ืœื•ืช, ืจืื” ืกืขื™ืฃ 2 ืื• ื˜ืงืกื˜ ื”ืžืืžืจ ื‘ื ื•ืฉื ื–ื”.
  2. ื‘ืฆืข ื›ื•ื•ื ื•ืŸ ืฉืœ ืžืื’ืจ ื”ืฉืงืข ื”ืžืจื‘ื™ (net.core.rmem_max=8388608).
  3. ืงื•ืžืคื™ืœ ืืช tsduck-stat.go (ืœื›ื• ืœื‘ื ื•ืช tsduck-stat.go).
  4. ืžืงื ืืช ืชื‘ื ื™ืช ื”ืฉื™ืจื•ืช ื‘-/lib/systemd/system.
  5. ื”ืชื—ืœ ืฉื™ืจื•ืชื™ื ื‘ืืžืฆืขื•ืช systemctl, ื‘ื“ื•ืง ืฉื”ืžื•ื ื™ื ื”ื—ืœื• ืœื”ื•ืคื™ืข (grep "" /dev/shm/tsduck-stat/*). ืžืกืคืจ ืฉื™ืจื•ืชื™ื ืœืคื™ ืžืกืคืจ ื–ืจืžื™ื ืžืจื•ื‘ื™ ืฉื™ื“ื•ืจ. ื›ืืŸ ื™ื™ืชื›ืŸ ืฉื™ื”ื™ื” ืขืœื™ืš ืœื™ืฆื•ืจ ืžืกืœื•ืœ ืœืงื‘ื•ืฆืช ื”-multicast, ืื•ืœื™ ืœื‘ื˜ืœ ืืช rp_filter ืื• ืœื™ืฆื•ืจ ืžืกืœื•ืœ ืœ-IP ื”ืžืงื•ืจ.
  6. ื”ืคืขืœ ืืช discovery.sh, ื•ื•ื“ื ืฉื”ื•ื ืžื™ื™ืฆืจ json.
  7. ื”ืฆื‘ ืืช ืชืฆื•ืจืช ื”-zabbix agent, ื”ืคืขืœ ืžื—ื“ืฉ ืืช ื”-zabbix agent.
  8. ื”ืขืœื” ืืช ื”ืชื‘ื ื™ืช ืœ-zabbix, ื”ื—ืœ ืื•ืชื” ืขืœ ื”ืžืืจื— ืฉืขืœื™ื• ืžืชื‘ืฆืข ื”ื ื™ื˜ื•ืจ ื•ืžื•ืชืงืŸ zabbix-agent, ื”ืžืชืŸ ื›-5 ื“ืงื•ืช, ืจืื” ืฉื”ื•ืคื™ืขื• ืจื›ื™ื‘ื™ ื ืชื•ื ื™ื, ื’ืจืคื™ื ื•ื˜ืจื™ื’ืจื™ื ื—ื“ืฉื™ื.

ืชื•ืฆืื”

ืฉื™ืžื•ืฉ ื‘-TSDuck ืœื ื™ื˜ื•ืจ ื–ืจื™ืžื•ืช IP(TS).

ืœืžืฉื™ืžื” ืฉืœ ื–ื™ื”ื•ื™ ืื•ื‘ื“ืŸ ืžื ื•ืช, ื–ื” ื›ืžืขื˜ ืžืกืคื™ืง, ืœืคื—ื•ืช ื–ื” ืขื“ื™ืฃ ืžืืฉืจ ืœืœื ื ื™ื˜ื•ืจ.

ืœืžืขืฉื”, "ื”ืคืกื“ื™ื" ืฉืœ CC ื™ื›ื•ืœื™ื ืœื”ืชืจื—ืฉ ื‘ืขืช ืฉื—ื‘ื•ืจ ืงื˜ืขื™ ื•ื™ื“ืื• (ืขื“ ื›ืžื” ืฉื™ื“ื•ืข ืœื™, ื›ืš ืžืชื‘ืฆืขื•ืช ื”ื•ืกืคื•ืช ื‘ืžืจื›ื–ื™ ื˜ืœื•ื•ื™ื–ื™ื” ืžืงื•ืžื™ื™ื ื‘ืคื“ืจืฆื™ื” ื”ืจื•ืกื™ืช, ื›ืœื•ืžืจ ืžื‘ืœื™ ืœื—ืฉื‘ ืžื—ื“ืฉ ืืช ืžื•ื ื” ื”-CC), ื™ืฉ ืœื–ื›ื•ืจ ื–ืืช. ื‘ืคืชืจื•ื ื•ืช ืงื ื™ื™ื ื™ื™ื, ื‘ืขื™ื” ื–ื• ืขื•ืงืคืช ื—ืœืงื™ืช ืขืœ ื™ื“ื™ ื–ื™ื”ื•ื™ ืชื’ื™ SCTE-35 (ืื ื”ื ืžืชื•ื•ืกืคื™ื ืขืœ ื™ื“ื™ ืžื—ื•ืœืœ ื”ื–ืจื).

ืžื ืงื•ื“ืช ืžื‘ื˜ ืฉืœ ื ื™ื˜ื•ืจ ืื™ื›ื•ืช ื”ืชื—ื‘ื•ืจื”, ื ื™ื˜ื•ืจ ืจื™ืฆื•ื“ (IAT) ืื™ื ื• ืžืกืคื™ืง, ื›ื™ ืœืฆื™ื•ื“ ื˜ืœื•ื•ื™ื–ื™ื” (ื‘ื™ืŸ ืื ืžืืคื ื ื™ื ืื• ืžื›ืฉื™ืจื™ ืงืฆื”) ื™ืฉ ื“ืจื™ืฉื•ืช ืœืคืจืžื˜ืจ ื–ื” ื•ืœื ืชืžื™ื“ ื ื™ืชืŸ ืœื ืคื— ืืช ื”ื’'ื™ื˜ื‘ืืคืจ ืœืœื ื”ื’ื‘ืœืช ื–ืžืŸ. ื•ืจื™ืฆื•ืฃ ื™ื›ื•ืœ ืœืฆื•ืฃ ื›ืืฉืจ ื”ืžืขื‘ืจ ืžืฉืชืžืฉ ื‘ืฆื™ื•ื“ ืขื ืžืื’ืจื™ื ื’ื“ื•ืœื™ื ื•-QoS ืื™ื ื• ืžื•ื’ื“ืจ ืื• ืื™ื ื• ืžื•ื’ื“ืจ ื”ื™ื˜ื‘ ื›ื“ื™ ืœื”ืขื‘ื™ืจ ืชืขื‘ื•ืจื” ื›ื–ื• ื‘ื–ืžืŸ ืืžืช.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”