ИспользованиС TSDuck для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° IP(TS)-ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

На сСгодняшний дСнь ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ (ΠΏΡ€ΠΎΠΏΡ€ΠΈΠ΅Ρ‚Π°Ρ€Π½Ρ‹Π΅) Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° IP(TS)-ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ VB ΠΈ iQ, ΠΎΠ½ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ достаточно Π±ΠΎΠ³Π°Ρ‚Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Ρƒ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… Π΄Π΅Π»ΠΎ с Π’Π’-сСрвисами. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ описываСтся Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° Π±Π°Π·Π΅ open source ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° TSDuck, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ для минимального контроля IP(TS)-ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠΎ счётчику CC(continuity counter) ΠΈ Π±ΠΈΡ‚Ρ€Π΅ΠΉΡ‚Ρƒ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ примСнСния β€” ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Ρ‡Π΅Ρ€Π΅Π· Π°Ρ€Π΅Π½Π΄ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ L2-ΠΊΠ°Π½Π°Π» (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅Ρ‚ возмоТности Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡƒΡ‚Ρ‘ΠΌ считывания счётчиков ΠΏΠΎΡ‚Π΅Ρ€ΡŒ Π² очСрСдях).

ΠžΡ‡Π΅Π½ΡŒ ΠΊΡ€Π°Ρ‚ΠΊΠΎ ΠΎ TSDuck

TSDuck это open source (лицСнзия 2-Clause BSD) ПО (Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ своих ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ ΠΈΠ»ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²) для манипуляций с TS-ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Π’ качСствС Π²Ρ…ΠΎΠ΄Π° ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с IP (multicast/unicast), http, hls, dvb-Ρ‚ΡŽΠ½Π΅Ρ€Π°ΠΌΠΈ, dektec dvb-asi дСмодулятором, имССтся Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ TS-ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ². Π’ качСствС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ запись Π² Ρ„Π°ΠΉΠ», IP (multicast/unicast), hls, dektec dvb-asi ΠΈ HiDes модуляторы, ΠΏΠ»Π΅Π΅Ρ€Ρ‹ (mplayer, vlc, xine) ΠΈ drop. ΠœΠ΅ΠΆΠ΄Ρƒ Π²Ρ…ΠΎΠ΄ΠΎΠΌ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ процСссоры Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅ΠΌΠ°ΠΏΠΏΠΈΠ½Π³ PID-ΠΎΠ², Π΄Π΅Π»Π°Ρ‚ΡŒ скрСмблированиС/дСскрСмблированиС, Π°Π½Π°Π»ΠΈΠ· CC-счётчиков, подсчёт Π±ΠΈΡ‚Ρ€Π΅ΠΉΡ‚Π° ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Π΅ для TS-ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π² качСствС Π²Ρ…ΠΎΠ΄Π° Π±ΡƒΠ΄ΡƒΡ‚ IP-ΠΏΠΎΡ‚ΠΎΠΊΠΈ (multicast), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ процСссоры bitrate_monitor (ΠΈΠ· названия понятно Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅) ΠΈ continuity (Π°Π½Π°Π»ΠΈΠ· CC-счётчиков). Π‘Π΅Π· особых ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ IP multicast Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ Π²Ρ…ΠΎΠ΄Π°, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ TSDuck.

Π˜ΠΌΠ΅ΡŽΡ‚ΡΡ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ сборки/ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ TSDuck для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ОБ. Для Debian ΠΈΡ… Π½Π΅Ρ‚, Π½ΠΎ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ debian 8 ΠΈ debian 10.

Π”Π°Π»Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ вСрсия TSDuck 3.19-1520, Π² качСствС ОБ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Linux (для ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ использовался debian 10, для Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ использования β€” CentOS 7)

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° TSDuck ΠΈ ОБ

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Ρ‡Ρ‚ΠΎ TSDuck ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ Π½Π΅ происходят Π΄Ρ€ΠΎΠΏΡ‹ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ сСтСвой ΠΊΠ°Ρ€Ρ‚Ρ‹ ΠΈΠ»ΠΈ ОБ(сокСта). Π­Ρ‚ΠΎ трСбуСтся для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌ Π½Π΅ Π³Π°Π΄Π°Ρ‚ΡŒ Π³Π΄Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΈ Π΄Ρ€ΠΎΠΏΡ‹ β€” Π½Π° сСти ΠΈΠ»ΠΈ «Π²Π½ΡƒΡ‚Ρ€ΠΈ сСрвСра». ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π΄Ρ€ΠΎΠΏΡ‹ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ сСтСвой ΠΊΠ°Ρ€Ρ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ethtool -S ethX, Ρ‚ΡŽΠ½ΠΈΠ½Π³ дСлаСтся Ρ‚ΠΎΠΉ ΠΆΠ΅ ethtool (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ RX-Π±ΡƒΡ„Π΅Ρ€ (-G) ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ offloads (-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ΠœΠ±ΠΈΡ‚/с:

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-ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π² 1 IP-ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ это Тёстко (-e), Ρ‚.Π΅. всСгда Π΄ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒΡΡ 7 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ΠœΠ±ΠΈΡ‚/с. Анализатор Ρ€Π°ΠΏΠΎΡ€Ρ‚ΡƒΠ΅Ρ‚ ΠΊΡƒΡ‡Ρƒ CC-ошибок ΠΈ ΠΎΠΊΠΎΠ»ΠΎ 75 ΠœΠ±ΠΈΡ‚/с вмСсто 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 Кб, Π½ΠΎ Ссли запросят большС, Ρ‚ΠΎ всё Ρ€Π°Π²Π½ΠΎ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΠΎΠ΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² 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

Π‘ Ρ‚Π°ΠΊΠΈΠΌ Ρ‚ΡŽΠ½ΠΈΠ½Π³ΠΎΠΌ Π±ΡƒΡ„Π΅Ρ€Π° сокСта Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°ΠΏΠΎΡ€Ρ‚ΡƒΠ΅ΠΌΡ‹ΠΉ Π±ΠΈΡ‚Ρ€Π΅ΠΉΡ‚ составляСт ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 100ΠœΠ±ΠΈΡ‚/с, CC-ошибок Π½Π΅Ρ‚.

По ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΡŽ CPU самим ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ tsp. ΠžΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ядра i5-4260U CPU @ 1.40GHz для Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° 10ΠœΠ±ΠΈΡ‚/с потрСбуСтся 3-4% CPU, 100 ΠœΠ±ΠΈΡ‚/с β€” 25%, 200ΠœΠ±ΠΈΡ‚/с β€” 46%. ΠŸΡ€ΠΈ Π·Π°Π΄Π°Π½ΠΈΠΈ % ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π½Π° CPU практичСски Π½Π΅ увСличиваСтся (Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒΡΡ).

На Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΆΠ΅Π»Π΅Π·Π΅ ΡƒΠ΄Π°Π²Π°Π»ΠΎΡΡŒ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±ΠΎΠ»Π΅Π΅ 1Π“Π±/с.

ВСстированиС Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… сСтСвых ΠΊΠ°Ρ€Ρ‚Π°Ρ…

ПослС тСстирования Π½Π° veth-ΠΏΠ°Ρ€Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ Π΄Π²Π° хоста ΠΈΠ»ΠΈ Π΄Π²Π° ΠΏΠΎΡ€Ρ‚Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ хоста, ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΏΠΎΡ€Ρ‚Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ собой, Π½Π° ΠΎΠ΄Π½ΠΎΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€, Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€. Π’ΡƒΡ‚ нСоТиданностСй Π½Π΅ ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ всё зависит ΠΎΡ‚ ΠΆΠ΅Π»Π΅Π·Π°, Ρ‡Π΅ΠΌ слабСС, Ρ‚Π΅ΠΌ интСрСснСС здСсь Π±ΡƒΠ΄Π΅Ρ‚.

ИспользованиС ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… систСмой ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° (Zabbix)

Π£ tsp Π½Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ machine-readable API Ρ‚ΠΈΠΏΠ° SNMP ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ. БообщСния CC Π½ΡƒΠΆΠ½ΠΎ Π°Π³Ρ€Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ хотя Π±Ρ‹ ΠΏΠΎ 1 сСкундС (ΠΏΡ€ΠΈ высоком ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π΅ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сотни/тысяч/дСсятки тысяч Π² сСкунду, зависит ΠΎΡ‚ Π±ΠΈΡ‚Ρ€Π΅ΠΉΡ‚Π°).

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ ΠΏΠΎ CC-ошибкам ΠΈ Π±ΠΈΡ‚Ρ€Π΅ΠΉΡ‚Ρƒ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Π°Π²Π°Ρ€ΠΈΠΈ дальшС ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹:

  1. Π Π°ΡΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ ΠΈ ΡΠ°Π³Ρ€Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (ΠΏΠΎ CC) Π²Ρ‹Π²ΠΎΠ΄ tsp, Ρ‚.Π΅. ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Π½ΡƒΠΆΠ½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ.
  2. Π”ΠΎΠΏΠΈΠ»ΠΈΡ‚ΡŒ сам tsp ΠΈ/ΠΈΠ»ΠΈ процСссорныС ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ bitrate_monitor ΠΈ continuity, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выдавался Π² machine-readable Ρ„ΠΎΡ€ΠΌΠ΅, ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΠΉ для систСмы ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°.
  3. ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ своё ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ²Π΅Ρ€Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ tsduck.

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ Ρ‚Ρ€ΡƒΠ΄ΠΎΠ·Π°Ρ‚Ρ€Π°Ρ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ 1 самый простой, особСнно учитывая Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ сам tsduck написан Π½Π° Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΌ (ΠΏΠΎ соврСмСнным ΠΌΠ΅Ρ€ΠΊΠ°ΠΌ) языкС (C++)

ΠŸΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΠΈΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ парсСра+Π°Π³Ρ€Π΅Π³Π°Ρ‚ΠΎΡ€Π° Π½Π° bash ΠΏΠΎΠΊΠ°Π·Π°Π», Ρ‡Ρ‚ΠΎ Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠ΅ 10ΠœΠ±ΠΈΡ‚/с ΠΈ 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 jobs ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ процСссами ΠΈ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ запись Ρ€Π°Π· Π² сСкунду значСния missingPackets Π½Π° сайд-эффСктС (ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сообщСния ΠΎ Π±ΠΈΡ‚Ρ€Π΅ΠΉΡ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ приходят ΠΊΠ°ΠΆΠ΄ΡƒΡŽ сСкунду). Π’ ΠΈΡ‚ΠΎΠ³Π΅, bash Π±Ρ‹Π» оставлСн Π² ΠΏΠΎΠΊΠΎΠ΅ ΠΈ Π±Ρ‹Π»ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΡƒ (парсСр+Π°Π³Ρ€Π΅Π³Π°Ρ‚ΠΎΡ€) Π½Π° golang. ΠŸΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ CPU Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π° golang Π² 4-5 Ρ€Π°Π· мСньшС, Ρ‡Π΅ΠΌ самого процСсса tsp. УскорСниС ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ Π·Π° счёт Π·Π°ΠΌΠ΅Π½Ρ‹ bash Π½Π° golang ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² 16 Ρ€Π°Π· ΠΈ Π² Ρ†Π΅Π»ΠΎΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠΌΡ‹ΠΉ (ΠΎΠ²Π΅Ρ€Ρ…Π΅Π΄ ΠΏΠΎ CPU Π½Π° 25% Π² Π½Π°ΠΈΡ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС). Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π½Π° golang находится здСсь.

Запуск ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ

Для запуска ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ сдСлан ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ шаблон сСрвиса для systemd (здСсь). ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ сама ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ° скомпилирована Π² Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» (go build tsduck-stat.go), Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½Ρ‹ΠΉ Π² /opt/tsduck-stat/. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ golang с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ monotonic clock (>=1.9).

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр сСрвиса Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ systemctl enable [email protected]:1234, Π·Π°Ρ‚Π΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ systemctl start [email protected]:1234.

Discovery ΠΈΠ· Zabbix

Π§Ρ‚ΠΎΠ±Ρ‹ zabbix ΠΌΠΎΠ³ Π΄Π΅Π»Π°Ρ‚ΡŒ дискавСри Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… сСрвисов, сдСлан Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ списка Π³Ρ€ΡƒΠΏΠΏ (discovery.sh), Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΌ для Zabbix discovery, прСдполагаСтся Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ€Π°Π·ΠΌΡ‘Ρ‰Π΅Π½ Ρ‚Π°ΠΌ ΠΆΠ΅ β€” Π² /opt/tsduck-stat. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ discovery Ρ‡Π΅Ρ€Π΅Π· zabbix-agent, Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ .conf-Ρ„Π°ΠΉΠ» Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ с конфигурациями zabbix-agent’Π° для добавлСния user-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.

Π¨Π°Π±Π»ΠΎΠ½ Zabbix

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ шаблон (tsduck_stat_template.xml) содСрТит ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ автообнаруТСния, ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ элСмСнтов Π΄Π°Π½Π½Ρ‹Ρ…, Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² ΠΈ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠ².

ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ чСклист (Π½Ρƒ Π° Π²Π΄Ρ€ΡƒΠ³ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ)

  1. Π£Π±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Ρ‡Ρ‚ΠΎ tsp Π½Π΅ Π΄Ρ€ΠΎΠΏΠ°Π΅Ρ‚ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π² «ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹Ρ…» условиях (Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ), Ссли Π΅ΡΡ‚ΡŒ Π΄Ρ€ΠΎΠΏΡ‹ см. ΠΏ.2 ΠΈΠ»ΠΈ тСкст ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎ этому ΠΏΠΎΠ²ΠΎΠ΄Ρƒ.
  2. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΡŽΠ½ΠΈΠ½Π³ максимального Π±ΡƒΡ„Π΅Ρ€Π° сокСта (net.core.rmem_max=8388608).
  3. Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ tsduck-stat.go (go build tsduck-stat.go).
  4. ΠŸΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ шаблон сСрвиса Π² /lib/systemd/system.
  5. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сСрвисы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ systemctl, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Π½Π°Ρ‡Π°Π»ΠΈ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ счётчиками (grep «» /dev/shm/tsduck-stat/*). ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ сСрвисов ΠΏΠΎ количСству ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΊΠ°ΡΡ‚-ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π’ΡƒΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ Π΄ΠΎ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΊΠ°ΡΡ‚-Π³Ρ€ΡƒΠΏΠΏΡ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ rp_filter ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ Π΄ΠΎ source ip.
  6. Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ discovery.sh, ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ json.
  7. ΠŸΠΎΠ΄Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ zabbix-Π°Π³Π΅Π½Ρ‚Π°, ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ zabbix-Π°Π³Π΅Π½Ρ‚.
  8. Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ шаблон Π² zabbix, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊ хосту, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ осущСствляСтся ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΈ установлСн zabbix-agent, ΠΏΠΎΠ΄ΠΎΠΆΠ°Ρ‚ΡŒ ΠΎΠΊΠΎΠ»ΠΎ 5 ΠΌΠΈΠ½ΡƒΡ‚, ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ появились Π½ΠΎΠ²Ρ‹Π΅ элСмСнты Π΄Π°Π½Π½Ρ‹Ρ…, Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ ΠΈ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

ИспользованиС TSDuck для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° IP(TS)-ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

Для Π·Π°Π΄Π°Ρ‡ΠΈ выявлСния ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΏΠΎΡ‡Ρ‚ΠΈ достаточно, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ это Π»ΡƒΡ‡ΡˆΠ΅ Ρ‡Π΅ΠΌ отсутствиС ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°.

Π’ самом Π΄Π΅Π»Π΅, CC-«ΠΏΠΎΡ‚Π΅Ρ€ΠΈ» ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈ склСйкС Π²ΠΈΠ΄Π΅ΠΎΡ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² (насколько ΠΌΠ½Π΅ извСстно, Ρ‚Π°ΠΊ Π΄Π΅Π»Π°ΡŽΡ‚ΡΡ вставки Π½Π° мСстных Ρ‚Π΅Π»Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Ρ… Π² Π Π€, Ρ‚.Π΅. Π±Π΅Π· пСрСсчёта CC-счётчика), это Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ. Π’ ΠΏΡ€ΠΎΠΏΡ€ΠΈΠ΅Ρ‚Π°Ρ€Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΡ… эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° частично обходится Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠΊ SCTE-35 ΠΌΠ΅Ρ‚ΠΎΠΊ (Ссли ΠΎΠ½ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°).

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° качСства транспорта, Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° jitter (IAT), Ρ‚.ΠΊ. Π’Π’-ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ (Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ модуляторы ΠΈΠ»ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ устройства) ΠΈΠΌΠ΅Π΅Ρ‚ трСбования ΠΊ этому ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ ΠΈ Π½Π΅ всСгда ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π΄ΡƒΠ²Π°Ρ‚ΡŒ jitbuffer Π΄ΠΎ бСсконСчности. А jitter ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΏΠ»Ρ‹Ρ‚ΡŒ ΠΊΠΎΠ³Π΄Π° Π½Π° Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ с большими Π±ΡƒΡ„Π΅Ρ€Π°ΠΌΠΈ ΠΈ Π½Π΅ настроСн ΠΈΠ»ΠΈ нСдосточно Ρ…ΠΎΡ€ΠΎΡˆΠΎ настроСн QoS для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ realtime-Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com