ΠΠ° ΡΠ΅Π³ΠΎΠ΄Π½ΡΡΠ½ΠΈΠΉ Π΄Π΅Π½Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Π³ΠΎΡΠΎΠ²ΡΠ΅ (ΠΏΡΠΎΠΏΡΠΈΠ΅ΡΠ°ΡΠ½ΡΠ΅) ΡΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° IP(TS)-ΠΏΠΎΡΠΎΠΊΠΎΠ², Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ
ΠΡΠ΅Π½Ρ ΠΊΡΠ°ΡΠΊΠΎ ΠΎ 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 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-ΠΎΡΠΈΠ±ΠΊΠ°ΠΌ ΠΈ Π±ΠΈΡΡΠ΅ΠΉΡΡ ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π°Π²Π°ΡΠΈΠΈ Π΄Π°Π»ΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ:
- Π Π°ΡΠΏΠ°ΡΡΠΈΡΡ ΠΈ ΡΠ°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°ΡΡ (ΠΏΠΎ CC) Π²ΡΠ²ΠΎΠ΄ tsp, Ρ.Π΅. ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π² Π½ΡΠΆΠ½ΡΡ ΡΠΎΡΠΌΡ.
- ΠΠΎΠΏΠΈΠ»ΠΈΡΡ ΡΠ°ΠΌ tsp ΠΈ/ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΡΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ bitrate_monitor ΠΈ continuity, ΡΡΠΎΠ±Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠ΄Π°Π²Π°Π»ΡΡ Π² machine-readable ΡΠΎΡΠΌΠ΅, ΠΏΡΠΈΠ³ΠΎΠ΄Π½ΠΎΠΉ Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π°.
- ΠΠ°ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ²Π΅ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ 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 (
Π§ΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΠ΅ΡΠ²ΠΈΡΠ° Π½ΡΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ systemctl enable [email protected]:1234, Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΡΡΡΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ systemctl start [email protected]:1234.
Discovery ΠΈΠ· Zabbix
Π§ΡΠΎΠ±Ρ zabbix ΠΌΠΎΠ³ Π΄Π΅Π»Π°ΡΡ Π΄ΠΈΡΠΊΠ°Π²Π΅ΡΠΈ Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΡ
ΡΠ΅ΡΠ²ΠΈΡΠΎΠ², ΡΠ΄Π΅Π»Π°Π½
Π¨Π°Π±Π»ΠΎΠ½ Zabbix
ΠΡΠ°ΡΠΊΠΈΠΉ ΡΠ΅ΠΊΠ»ΠΈΡΡ (Π½Ρ Π° Π²Π΄ΡΡΠ³ ΠΊΡΠΎ-ΡΠΎ ΡΠ΅ΡΠΈΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ)
- Π£Π±Π΅Π΄ΠΈΡΡΡΡ ΡΡΠΎ tsp Π½Π΅ Π΄ΡΠΎΠΏΠ°Π΅Ρ ΠΏΠ°ΠΊΠ΅ΡΡ Π² «ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΡ » ΡΡΠ»ΠΎΠ²ΠΈΡΡ (Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½Ρ Π½Π°ΠΏΡΡΠΌΡΡ), Π΅ΡΠ»ΠΈ Π΅ΡΡΡ Π΄ΡΠΎΠΏΡ ΡΠΌ. ΠΏ.2 ΠΈΠ»ΠΈ ΡΠ΅ΠΊΡΡ ΡΡΠ°ΡΡΠΈ ΠΏΠΎ ΡΡΠΎΠΌΡ ΠΏΠΎΠ²ΠΎΠ΄Ρ.
- Π‘Π΄Π΅Π»Π°ΡΡ ΡΡΠ½ΠΈΠ½Π³ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ° ΡΠΎΠΊΠ΅ΡΠ° (net.core.rmem_max=8388608).
- Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ tsduck-stat.go (go build tsduck-stat.go).
- ΠΠΎΠ»ΠΎΠΆΠΈΡΡ ΡΠ°Π±Π»ΠΎΠ½ ΡΠ΅ΡΠ²ΠΈΡΠ° Π² /lib/systemd/system.
- ΠΠ°ΠΏΡΡΡΠΈΡΡ ΡΠ΅ΡΠ²ΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ systemctl, ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΠΎ Π½Π°ΡΠ°Π»ΠΈ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ ΡΡΡΡΡΠΈΠΊΠ°ΠΌΠΈ (grep «» /dev/shm/tsduck-stat/*). ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² ΠΏΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Ρ ΠΌΡΠ»ΡΡΠΈΠΊΠ°ΡΡ-ΠΏΠΎΡΠΎΠΊΠΎΠ². Π’ΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΠΌΠ°ΡΡΡΡΡ Π΄ΠΎ ΠΌΡΠ»ΡΡΠΈΠΊΠ°ΡΡ-Π³ΡΡΠΏΠΏΡ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΡΠΊΠ»ΡΡΠΈΡΡ rp_filter ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΠΌΠ°ΡΡΡΡΡ Π΄ΠΎ source ip.
- ΠΠ°ΠΏΡΡΡΠΈΡΡ discovery.sh, ΡΠ±Π΅Π΄ΠΈΡΡΡΡ ΡΡΠΎ ΠΎΠ½ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ json.
- ΠΠΎΠ΄Π»ΠΎΠΆΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ zabbix-Π°Π³Π΅Π½ΡΠ°, ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΡΡ zabbix-Π°Π³Π΅Π½Ρ.
- ΠΠ°Π³ΡΡΠ·ΠΈΡΡ ΡΠ°Π±Π»ΠΎΠ½ Π² zabbix, ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π΅Π³ΠΎ ΠΊ Ρ ΠΎΡΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ zabbix-agent, ΠΏΠΎΠ΄ΠΎΠΆΠ°ΡΡ ΠΎΠΊΠΎΠ»ΠΎ 5 ΠΌΠΈΠ½ΡΡ, ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΠΎ ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π΄Π°Π½Π½ΡΡ , Π³ΡΠ°ΡΠΈΠΊΠΈ ΠΈ ΡΡΠΈΠ³Π³Π΅ΡΡ.
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ
ΠΠ»Ρ Π·Π°Π΄Π°ΡΠΈ Π²ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΏΠΎΡΠ΅ΡΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² ΠΏΠΎΡΡΠΈ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΡΡΠΎ Π»ΡΡΡΠ΅ ΡΠ΅ΠΌ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π°.
Π ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, CC-«ΠΏΠΎΡΠ΅ΡΠΈ» ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ ΠΏΡΠΈ ΡΠΊΠ»Π΅ΠΉΠΊΠ΅ Π²ΠΈΠ΄Π΅ΠΎΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΎΠ² (Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ½Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΠ°ΠΊ Π΄Π΅Π»Π°ΡΡΡΡ Π²ΡΡΠ°Π²ΠΊΠΈ Π½Π° ΠΌΠ΅ΡΡΠ½ΡΡ ΡΠ΅Π»Π΅ΡΠ΅Π½ΡΡΠ°Ρ Π² Π Π€, Ρ.Π΅. Π±Π΅Π· ΠΏΠ΅ΡΠ΅ΡΡΡΡΠ° CC-ΡΡΡΡΡΠΈΠΊΠ°), ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡΡ. Π ΠΏΡΠΎΠΏΡΠΈΠ΅ΡΠ°ΡΠ½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡΡ ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΎΠ±Ρ ΠΎΠ΄ΠΈΡΡΡ Π΄Π΅ΡΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠΊ SCTE-35 ΠΌΠ΅ΡΠΎΠΊ (Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ°).
Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ°, Π½Π΅ Ρ Π²Π°ΡΠ°Π΅Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° jitter (IAT), Ρ.ΠΊ. Π’Π-ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ (Π±ΡΠ΄Ρ ΡΠΎ ΠΌΠΎΠ΄ΡΠ»ΡΡΠΎΡΡ ΠΈΠ»ΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π°) ΠΈΠΌΠ΅Π΅Ρ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ ΡΡΠΎΠΌΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΈ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π·Π΄ΡΠ²Π°ΡΡ jitbuffer Π΄ΠΎ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎΡΡΠΈ. Π jitter ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΏΠ»ΡΡΡ ΠΊΠΎΠ³Π΄Π° Π½Π° ΡΡΠ°Π½Π·ΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ Π±ΡΡΠ΅ΡΠ°ΠΌΠΈ ΠΈ Π½Π΅ Π½Π°ΡΡΡΠΎΠ΅Π½ ΠΈΠ»ΠΈ Π½Π΅Π΄ΠΎΡΡΠΎΡΠ½ΠΎ Ρ ΠΎΡΠΎΡΠΎ Π½Π°ΡΡΡΠΎΠ΅Π½ QoS Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ realtime-ΡΡΠ°ΡΠΈΠΊΠ°.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com