ํ์ฌ IP(TS) ์คํธ๋ฆผ ๋ชจ๋ํฐ๋ง์ ์ํ ๊ธฐ์ฑํ(๋
์ ) ์๋ฃจ์
์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด
TSDuck์ ๋ํด ์์ฃผ ๊ฐ๋จํ
TSDuck์ TS ์คํธ๋ฆผ ์กฐ์์ ์ํ ์คํ ์์ค(2-Clause BSD ๋ผ์ด์ ์ค) ์ํํธ์จ์ด(์ฝ์ ์ ํธ๋ฆฌํฐ ์ธํธ ๋ฐ ๋ง์ถคํ ์ ํธ๋ฆฌํฐ ๋๋ ํ๋ฌ๊ทธ์ธ ๊ฐ๋ฐ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)์ ๋๋ค. ์ ๋ ฅ์ผ๋ก IP(๋ฉํฐ์บ์คํธ/์ ๋์บ์คํธ), http, hls, dvb ํ๋, dektec dvb-asi ๋ณต์กฐ๊ธฐ์ ํจ๊ป ์๋ํ ์ ์์ผ๋ฉฐ ๋ด๋ถ TS ์คํธ๋ฆผ ์์ฑ๊ธฐ๊ฐ ์๊ณ ํ์ผ์์ ์ฝ์ต๋๋ค. ์ถ๋ ฅ์ ํ์ผ, IP(๋ฉํฐ์บ์คํธ/์ ๋์บ์คํธ), hls, dektec dvb-asi ๋ฐ HiDes ๋ณ์กฐ๊ธฐ, ํ๋ ์ด์ด(mplayer, vlc, xine) ๋ฐ ๋๋กญ์ ์ธ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, PID ๋ฆฌ๋งคํ, ์คํฌ๋จ๋ธ๋ง/๋์คํฌ๋จ๋ธ๋ง, CC ์นด์ดํฐ ๋ถ์, ๋นํธ๋ ์ดํธ ๊ณ์ฐ ๋ฐ TS ์คํธ๋ฆผ์ ๋ํ ๊ธฐํ ์ผ๋ฐ์ ์ธ ์์ ๊ณผ ๊ฐ์ ๋ค์ํ ํธ๋ํฝ ํ๋ก์ธ์๊ฐ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ ์ฌ์ด์ ํฌํจ๋ ์ ์์ต๋๋ค.
์ด ๊ธฐ์ฌ์์๋ IP ์คํธ๋ฆผ(๋ฉํฐ์บ์คํธ)์ด ์ ๋ ฅ์ผ๋ก ์ฌ์ฉ๋๊ณ bitrate_monitor ํ๋ก์ธ์(์ด๋ฆ์์ ๋ช ํํจ) ๋ฐ ์ฐ์์ฑ(CC ์นด์ดํฐ ๋ถ์)์ด ์ฌ์ฉ๋ฉ๋๋ค. IP ๋ฉํฐ์บ์คํธ๋ฅผ TSDuck์์ ์ง์ํ๋ ๋ค๋ฅธ ์ ๋ ฅ ์ ํ์ผ๋ก ์ฝ๊ฒ ๋์ฒดํ ์ ์์ต๋๋ค.
์๋ค
๋ค์์ผ๋ก TSDuck 3.19-1520 ๋ฒ์ ์ฌ์ฉ, OS๋ Linux ์ฌ์ฉ (์๋ฃจ์ ์ค๋น๋ debian 10 ์ฌ์ฉ, ์ค์ฌ์ฉ์ CentOS 7 ์ฌ์ฉ)
TSDuck ๋ฐ OS ์ค๋น
์ค์ ํ๋ฆ์ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ ์ TSDuck์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๊ณ ๋คํธ์ํฌ ์นด๋ ๋๋ OS(์์ผ) ์์ค์์ ๋๋กญ์ด ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ๋คํธ์ํฌ ๋๋ "์๋ฒ ๋ด๋ถ"์์ ๋๋กญ์ด ๋ฐ์ํ ์์น๋ฅผ ๋์ค์ ์ถ์ธกํ์ง ์์ผ๋ ค๋ฉด ํ์ํฉ๋๋ค. ethtool -S ethX ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ ์นด๋ ์์ค์์ ๋๋กญ์ ํ์ธํ ์ ์์ต๋๋ค. ํ๋์ ๋์ผํ ethtool์์ ์ํ๋ฉ๋๋ค(์ผ๋ฐ์ ์ผ๋ก RX ๋ฒํผ(-G)๋ฅผ ๋๋ฆฌ๊ณ ๋๋ก๋ ์ผ๋ถ ์คํ๋ก๋(-K)๋ฅผ ๋นํ์ฑํํด์ผ ํจ). ์ผ๋ฐ์ ์ผ๋ก ๋ถ์๋ ํธ๋ํฝ์ ์์ ํ๊ธฐ ์ํด ๋ณ๋์ ํฌํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ฐ๋ฅํ๋ฉด ๋ค๋ฅธ ํธ๋ํฝ์ ์กด์ฌ๋ก ์ธํด ๋ถ์๊ธฐ ํฌํธ์์ ๋๋กญ์ด ์ ํํ ๋ฐ์ํ๋ค๋ ์ฌ์ค๊ณผ ๊ด๋ จ๋ ์ค ํ์ง๋ฅผ ์ต์ํํฉ๋๋ค. ์ด๊ฒ์ด ๊ฐ๋ฅํ์ง ์์ ๊ฒฝ์ฐ(XNUMX๊ฐ์ ํฌํธ๊ฐ ์๋ ๋ฏธ๋ ์ปดํจํฐ/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"์ ๋งค์ด ๋นํธ ์ ์ก๋ฅ ์ ๊ณ์ฐํ๊ณ ๋งค์ด ๋นํธ ์ ์ก๋ฅ ์ ๋ํ ์ ๋ณด๋ฅผ ํ์ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
10Mbps ์๋๋ก ํธ๋ํฝ ์์ฑ๊ธฐ๋ฅผ ์์ํฉ๋๋ค.
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) ์ํํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. IP ํจํท์ ๋ณด๋ด๊ธฐ ์ ์ ํญ์ ๋ง์ง๋ง ํ๋ก์ธ์์์ 7 TS ํจํท์ ๊ธฐ๋ค๋ฆฝ๋๋ค.
๋ถ์๊ธฐ๋ ์์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ธฐ ์์ํฉ๋๋ค.
* 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) ์์ฑ๊ธฐ ๋นํธ ์ ์ก๋ฅ ์ 100Mbps๋ก ๋์ด์ญ์์ค. ๋ถ์๊ธฐ๋ ๋ง์ CC ์ค๋ฅ์ 75 ๋์ ์ฝ 100Mbps๋ฅผ ๋ณด๊ณ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋๊ฐ ์ฑ ์์ ์ ธ์ผ ํ๋์ง ํ์ ํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ์์ฑ๊ธฐ์ ์๊ฐ์ด ์๊ฑฐ๋ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ณ ์ ๋ ์์ ์์ฑ์ ์์ํฉ๋๋ค. ํจํท(TS ํจํท 700000๊ฐ = IP ํจํท 100000๊ฐ):
# 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). ๋ถ์๊ธฐ์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์์๋ด ์๋ค. ์ด๋ฅผ ์ํด veth1์ RX ์นด์ดํฐ๋ก ํ์ธํฉ๋๋ค. veth0์ TX ์นด์ดํฐ์ ์๊ฒฉํ ๋์ผํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์ผ ์์ค์์ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์ดํด๋ด ๋๋ค.
# 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
๋ฐ๋ผ์ ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ช ์์ ์ผ๋ก ๋ฒํผ ํฌ๊ธฐ๋ฅผ ์์ฒญํ์ง ์์ผ๋ฉด 208KB์ ๋ฒํผ๋ก ์์ผ์ด ์์ฑ๋์ง๋ง ๋ ๋ง์ด ์์ฒญํด๋ ์ฌ์ ํ ์์ฒญ๋ ๊ฒ์ ๋ฐ์ง ๋ชปํฉ๋๋ค. IP ์ ๋ ฅ(-buffer-size)์ ๋ํด tsp์์ ๋ฒํผ ํฌ๊ธฐ๋ฅผ ์ค์ ํ ์ ์์ผ๋ฏ๋ก ๊ธฐ๋ณธ ์์ผ ํฌ๊ธฐ๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ์ต๋ ์์ผ ๋ฒํผ ํฌ๊ธฐ๋ง ์ค์ ํ๊ณ 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 ์ค๋ฅ๋ ์์ต๋๋ค.
tsp ์ ํ๋ฆฌ์ผ์ด์ ์์ฒด์ CPU ์ฌ์ฉ๋์ ๋ฐ๋ผ. ํ๋์ ์ฝ์ด i5-4260U CPU @ 1.40GHz์ ๋นํด 10Mbps ํ๋ฆ ๋ถ์์๋ 3-4% CPU, 100Mbps - 25%, 200Mbps - 46%๊ฐ ํ์ํฉ๋๋ค. % Packet Loss๋ฅผ ์ค์ ํ๋ฉด CPU์ ๋ถํ๊ฐ ์ค์ง์ ์ผ๋ก ์ฆ๊ฐํ์ง ์์ต๋๋ค(๊ฐ์ํ ์ ์์).
๋ณด๋ค ์์ฐ์ ์ธ ํ๋์จ์ด์์๋ ๋ฌธ์ ์์ด 1Gb/s ์ด์์ ์คํธ๋ฆผ์ ์์ฑํ๊ณ ๋ถ์ํ ์ ์์์ต๋๋ค.
์ค์ ๋คํธ์ํฌ ์นด๋์์ ํ ์คํธ
veth ์์์ ํ ์คํธํ ํ ๋ ๊ฐ์ ํธ์คํธ ๋๋ ํ ํธ์คํธ์ ๋ ํฌํธ๋ฅผ ๊ฐ์ ธ์ ํฌํธ๋ฅผ ์๋ก ์ฐ๊ฒฐํ๊ณ ํ๋์์ ์์ฑ๊ธฐ๋ฅผ ์์ํ๊ณ ๋ ๋ฒ์งธ์์ ๋ถ์๊ธฐ๋ฅผ ์์ํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋๋ผ์์ด ์์์ง๋ง ์ค์ ๋ก ๋ชจ๋ ๊ฒ์ ์ฒ ์ ๋ฌ๋ ค ์์ผ๋ฉฐ ์ฝํ ์๋ก ์ฌ๊ธฐ์ ๋ ํฅ๋ฏธ๋ก์ธ ๊ฒ์ ๋๋ค.
๋ชจ๋ํฐ๋ง ์์คํ (Zabbix)์์ ์์ ํ ๋ฐ์ดํฐ ์ฌ์ฉ
tsp์๋ SNMP ๋๋ ์ด์ ์ ์ฌํ ๊ธฐ๊ณ ํ๋ ๊ฐ๋ฅ API๊ฐ ์์ต๋๋ค. CC ๋ฉ์์ง๋ ์ต์ 1์ด ๋์ ์ง๊ณ๋์ด์ผ ํฉ๋๋ค(ํจํท ์์ค ๋น์จ์ด ๋์ผ๋ฉด ๋นํธ ์ ์ก๋ฅ ์ ๋ฐ๋ผ ์ด๋น ์๋ฐฑ/์์ฒ/์๋ง ๊ฐ๊ฐ ๋ฐ์ํ ์ ์์).
๋ฐ๋ผ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ CC ์ค๋ฅ ๋ฐ ๋นํธ ์ ์ก๋ฅ ์ ๋ํ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๊ณ ์ด๋ค ์ข ๋ฅ์ ์ฌ๊ณ ๋ฅผ ์ผ์ผํค๊ธฐ ์ํด ๋ค์ ์ต์ ์ด ์์ ์ ์์ต๋๋ค.
- tsp์ ์ถ๋ ฅ์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ง๊ณํฉ๋๋ค(CC์ ์ํด). ์ํ๋ ํํ๋ก ๋ณํํฉ๋๋ค.
- ๊ฒฐ๊ณผ๊ฐ ๋ชจ๋ํฐ๋ง ์์คํ ์ ์ ํฉํ ๊ธฐ๊ณ ํ๋ ๊ฐ๋ฅ ํ์์ผ๋ก ์ ๊ณต๋๋๋ก tsp ์์ฒด ๋ฐ/๋๋ ํ๋ก์ธ์ ํ๋ฌ๊ทธ์ธ bitrate_monitor ๋ฐ ์ฐ์์ฑ์ ์๋ฃํฉ๋๋ค.
- tsduck ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํฉ๋๋ค.
๋ถ๋ช ํ ์ต์ 1์ ํนํ tsduck ์์ฒด๊ฐ ์ ์์ค(ํ๋ ํ์ค์ ๋ฐ๋ผ) ์ธ์ด(C ++)๋ก ์์ฑ๋์๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด ๋ ธ๋ ฅ ์ธก๋ฉด์์ ๊ฐ์ฅ ์ฝ์ต๋๋ค.
๊ฐ๋จํ bash ํ์+์ง๊ณ๊ธฐ ํ๋กํ ํ์ ์ 10Mbps ์คํธ๋ฆผ ๋ฐ 50% ํจํท ์์ค(์ต์ ์ ๊ฒฝ์ฐ)์์ bash ํ๋ก์ธ์ค๊ฐ tsp ํ๋ก์ธ์ค ์์ฒด๋ณด๋ค 3-4๋ฐฐ ๋ ๋ง์ CPU๋ฅผ ์๋นํจ์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ์ด ์๋๋ฆฌ์ค๋ ๋ฐ์๋ค์ผ ์ ์์ต๋๋ค. ์ค์ ๋ก ์๋์ ์ด ํ๋กํ ํ์ ์ ์ผ๋ถ
์์ ๊ตญ์
#!/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์ ๊ฐ์ 4์ด์ ํ ๋ฒ ์์ฑํด์ผ ํ์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก bash๋ ๊ทธ๋๋ก ๋๊ณ golang์ wrapper(parser + aggregator)๋ฅผ ์์ฑํ๊ธฐ๋ก ํ์ต๋๋ค. ์ ์ฌํ golang ์ฝ๋์ CPU ์๋น๋ tsp ํ๋ก์ธ์ค ์์ฒด๋ณด๋ค 5-16๋ฐฐ ์ ์ต๋๋ค. bash๋ฅผ golang์ผ๋ก ๊ต์ฒดํ ๊ฒฐ๊ณผ wrapper์ ์๋ ํฅ์์ ์ฝ 25๋ฐฐ๋ก ๋ฐํ์ก์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๊ฒฐ๊ณผ๋ ์์ฉ ๊ฐ๋ฅํฉ๋๋ค(์ต์
์ ๊ฒฝ์ฐ CPU ์ค๋ฒํค๋ XNUMX% ์ฆ๊ฐ). golang ์์ค ํ์ผ์ด ์์ต๋๋ค.
๋ํผ ์คํ
๋ํผ๋ฅผ ์์ํ๊ธฐ ์ํด systemd์ ๋ํ ๊ฐ์ฅ ๊ฐ๋จํ ์๋น์ค ํ
ํ๋ฆฟ์ ๋ง๋ค์์ต๋๋ค(
์๋น์ค ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ค๋ฉด systemctl enable ๋ช ๋ น์ ์คํํด์ผ ํฉ๋๋ค. [์ด๋ฉ์ผ ๋ณดํธ]:1234 ๊ทธ๋ฐ ๋ค์ systemctl start๋ก ์คํ [์ด๋ฉ์ผ ๋ณดํธ]: 1234.
Zabbix์์ ๋ฐ๊ฒฌ
zabbix๊ฐ ์คํ ์ค์ธ ์๋น์ค๋ฅผ ๊ฒ์ํ ์ ์๋๋ก ํ๊ธฐ ์ํด
Zabbix ํ ํ๋ฆฟ
๊ฐ๋ตํ ์ฒดํฌ๋ฆฌ์คํธ(๋๊ตฐ๊ฐ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?)
- tsp๊ฐ "์ด์์ ์ธ" ์กฐ๊ฑด(์ ๋๋ ์ดํฐ์ ๋ถ์๊ธฐ๊ฐ ์ง์ ์ฐ๊ฒฐ๋จ)์์ ํจํท์ ๋๋กญํ์ง ์๋์ง ํ์ธํ์ญ์์ค. ๋๋กญ์ด ์๋ ๊ฒฝ์ฐ ๋จ๋ฝ 2 ๋๋ ์ด ๋ฌธ์ ์ ๋ํ ๊ธฐ์ฌ ํ ์คํธ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
- ์ต๋ ์์ผ ๋ฒํผ๋ฅผ ์กฐ์ ํฉ๋๋ค(net.core.rmem_max=8388608).
- tsduck-stat.go๋ฅผ ์ปดํ์ผํฉ๋๋ค(tsduck-stat.go ๋น๋).
- ์๋น์ค ํ ํ๋ฆฟ์ /lib/systemd/system์ ๋ฃ์ต๋๋ค.
- systemctl๋ก ์๋น์ค๋ฅผ ์์ํ๊ณ ์นด์ดํฐ๊ฐ ๋ํ๋๊ธฐ ์์ํ๋์ง ํ์ธํฉ๋๋ค(grep "" /dev/shm/tsduck-stat/*). ๋ฉํฐ์บ์คํธ ์คํธ๋ฆผ ์์ ๋ฐ๋ฅธ ์๋น์ค ์์ ๋๋ค. ์ฌ๊ธฐ์์ ๋ฉํฐ์บ์คํธ ๊ทธ๋ฃน์ ๋ํ ๊ฒฝ๋ก๋ฅผ ์์ฑํด์ผ ํ ์ ์์ต๋๋ค. ์๋ง๋ rp_filter๋ฅผ ๋นํ์ฑํํ๊ฑฐ๋ ์์ค IP์ ๋ํ ๊ฒฝ๋ก๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- discovery.sh๋ฅผ ์คํํ๊ณ json์ ์์ฑํ๋์ง ํ์ธํ์ญ์์ค.
- zabbix ์์ด์ ํธ ๊ตฌ์ฑ์ ์ถ๊ฐํ๊ณ zabbix ์์ด์ ํธ๋ฅผ ๋ค์ ์์ํ์ญ์์ค.
- ํ ํ๋ฆฟ์ zabbix์ ์ ๋ก๋ํ๊ณ ๋ชจ๋ํฐ๋ง ์ค์ธ ํธ์คํธ์ zabbix-agent๊ฐ ์ค์น๋ ํธ์คํธ์ ์ ์ฉํ๊ณ ์ฝ 5๋ถ ์ ๋ ๊ธฐ๋ค๋ฆฐ ํ ์ ํญ๋ชฉ, ๊ทธ๋ํ ๋ฐ ํธ๋ฆฌ๊ฑฐ๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.
๊ฒฐ๊ณผ
ํจํท ์์ค์ ๊ฐ์งํ๋ ์์ ์๋ ๊ฑฐ์ ์ถฉ๋ถํ๋ฉฐ ์ ์ด๋ ๋ชจ๋ํฐ๋งํ์ง ์๋ ๊ฒ๋ณด๋ค ๋ซ์ต๋๋ค.
์ค์ ๋ก ๋น๋์ค ์กฐ๊ฐ์ ๋ณํฉํ ๋ CC "์์ค"์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ ์ ์๋ฃจ์ ์ SCTE-35 ๋ ์ด๋ธ(์คํธ๋ฆผ ์์ฑ๊ธฐ์ ์ํด ์ถ๊ฐ๋ ๊ฒฝ์ฐ)์ ๊ฐ์งํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ๋ถ๋ถ์ ์ผ๋ก ์ฐํํฉ๋๋ค.
์ ์ก ํ์ง ๋ชจ๋ํฐ๋ง ์ธก๋ฉด์์ ์งํฐ ๋ชจ๋ํฐ๋ง(IAT)์ด ๋ถ์กฑํฉ๋๋ค. TV ์ฅ๋น(๋ณ์กฐ๊ธฐ ๋๋ ์ต์ข ์ฅ์น)์๋ ์ด ๋งค๊ฐ๋ณ์์ ๋ํ ์๊ตฌ ์ฌํญ์ด ์์ผ๋ฉฐ jitbuffer๋ฅผ ๋ฌดํ๋๋ก ํ์ฅํ๋ ๊ฒ์ด ํญ์ ๊ฐ๋ฅํ ๊ฒ์ ์๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ํฐ ๋ฒํผ๊ฐ ์๋ ์ฅ๋น๊ฐ ์ ์ก ์ค์ ์ฌ์ฉ๋๊ณ QoS๊ฐ ๊ตฌ์ฑ๋์ง ์์๊ฑฐ๋ ์ด๋ฌํ ์ค์๊ฐ ํธ๋ํฝ์ ์ ์กํ ์ ์์ ๋งํผ ์ถฉ๋ถํ ๊ตฌ์ฑ๋์ง ์์ ๊ฒฝ์ฐ ์งํฐ๊ฐ ๋ ์ค๋ฅผ ์ ์์ต๋๋ค.
์ถ์ฒ : habr.com