اڄ، IP (TS) اسٽريمز جي نگراني لاءِ تيار ڪيل (مالڪدار) حل آهن، مثال طور
TSDuck بابت تمام مختصر
TSDuck هڪ اوپن سورس (2-Clause BSD لائسنس) سافٽ ويئر آهي (ڪنسول يوٽيلٽيز جو هڪ سيٽ ۽ ڪسٽم يوٽيلٽيز يا پلگ ان کي ترقي ڪرڻ لاءِ لائبريري) TS اسٽريمز کي هٿي ڏيڻ لاءِ. ان پٽ جي طور تي، اهو IP (multicast/unicast)، http، hls، dvb tuners، dektec dvb-asi demodulator سان ڪم ڪري سگھي ٿو، اتي ھڪڙو اندروني TS-stream جنريٽر آھي ۽ فائلن مان پڙھڻ. ٻاھر ھڪڙي فائل، IP (multicast/unicast)، hls، dektec dvb-asi ۽ HiDes modulators، پليئرز (mplayer، vlc، xine) ۽ ڊراپ تي لکي سگھجي ٿو. ان پٽ ۽ آئوٽ پٽ جي وچ ۾ مختلف ٽريفڪ پروسيسرز شامل ڪري سگھجن ٿا، مثال طور، پي آءِ ڊي ريمپنگ، اسڪرامبلنگ/ڊيسڪرامبنگ، سي سي ڪائونٽر اينالائسز، بٽريٽ حساب ڪتاب، ۽ TS اسٽريمز لاءِ ٻيا عام عمل.
هن آرٽيڪل ۾، IP اسٽريمز (ملٽي ڪاسٽ) هڪ ان پٽ طور استعمال ڪيا ويندا، پروسيسرز bitrate_monitor (نالو مان اهو واضح آهي ته اهو ڇا آهي) ۽ تسلسل (سي سي ڳڻپيندڙن جو تجزيو) استعمال ڪيو ويندو. توھان آساني سان IP ملٽي ڪاسٽ کي تبديل ڪري سگھو ٿا ٻئي ان پٽ قسم سان جيڪو TSDuck جي مدد سان.
دستياب
اڳيون، نسخو TSDuck 3.19-1520 استعمال ڪيو ويندو آهي، لينڪس استعمال ڪيو ويندو آهي OS طور (debian 10 استعمال ڪيو ويو حل تيار ڪرڻ لاء، CentOS 7 حقيقي استعمال لاء استعمال ڪيو ويو)
TSDuck ۽ OS تيار ڪرڻ
حقيقي وهڪري جي نگراني ڪرڻ کان پهريان، توهان کي پڪ ڪرڻ جي ضرورت آهي ته TSDuck صحيح طريقي سان ڪم ڪري ٿو ۽ نيٽ ورڪ ڪارڊ يا او ايس (ساکٹ) سطح تي ڪو به ڦوٽو نه آهي. اهو ضروري آهي ته پوءِ اندازو نه لڳايو وڃي ته قطرا ڪٿي آيا آهن - نيٽ ورڪ تي يا ”سرور جي اندر“. توهان ethtool -S ethX ڪمانڊ سان نيٽ ورڪ ڪارڊ جي سطح تي بوند چيڪ ڪري سگهو ٿا، ٽيوننگ ساڳئي ايٿول ذريعي ڪيو ويندو آهي (عام طور تي، توهان کي 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" جو مطلب آهي ته توهان کي هر سيڪنڊ ۾ بٽريٽ جي حساب ڪرڻ جي ضرورت آهي ۽ هر سيڪنڊ بٽريٽ بابت معلومات ڏيکاري ٿي.
اسان 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)، يعني. هميشه انتظار ڪريو 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) ۽ ڪوشش ڪريو جنريٽر بٽريٽ کي 100Mbps تائين وڌائڻ جي. تجزيه نگار CC غلطين جو هڪ گروپ ۽ 75 جي بدران 100 Mbps جي رپورٽ ڪري ٿو. اسان اهو سمجهڻ جي ڪوشش ڪري رهيا آهيون ته ذميوار ڪير آهي - جنريٽر وٽ وقت ناهي يا مسئلو ان ۾ ناهي، ان لاءِ اسان هڪ مقرر ٿيل نمبر پيدا ڪرڻ شروع ڪريون ٿا. پيڪٽس (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 تي، اهو سختي سان ويٿ0 تي 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
اهڙيء طرح، جيڪڏهن ايپليڪيشنون واضح طور تي بفر سائيز جي درخواست نه ڪن، ساکٽ 208 KB جي بفر سان ٺاهيا ويا آهن، پر جيڪڏهن اهي وڌيڪ درخواست ڪن ٿا، اهي اڃا تائين حاصل نه ڪندا جيڪي درخواست ڪئي وئي هئي. جيئن ته توهان 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 ايپليڪيشن پاڻ کي. هڪ ڪور i5-4260U CPU @ 1.40GHz سان لاڳاپيل، 10Mbps وهڪري جي تجزيي جي ضرورت پوندي 3-4٪ CPU، 100Mbps - 25٪، 200Mbps - 46٪. جڏهن سيٽنگ % Packet Loss، سي پي يو تي لوڊ عملي طور تي نه وڌندو آهي (پر گهٽجي سگهي ٿو).
وڌيڪ پيداواري هارڊويئر تي، بنا ڪنهن پريشاني جي 1Gb/s کان وڌيڪ اسٽريمز ٺاهڻ ۽ تجزيو ڪرڻ ممڪن هو.
حقيقي نيٽ ورڪ ڪارڊ تي جاچ
ويٿ پيئر تي جاچ ڪرڻ کان پوءِ، توهان کي هڪ ميزبان جا ٻه ميزبان يا ٻه بندرگاهون کڻڻ گهرجن، بندرگاهن کي هڪ ٻئي سان ڳنڍڻ، هڪ تي جنريٽر شروع ڪرڻ، ۽ ٻئي تي تجزيهڪار. هتي ڪا به تعجب نه هئي، پر حقيقت ۾ اهو سڀ ڪجهه لوهه تي منحصر آهي، ڪمزور، وڌيڪ دلچسپ هتي ٿيندو.
مانيٽرنگ سسٽم پاران وصول ڪيل ڊيٽا استعمال ڪندي (Zabbix)
tsp وٽ ڪو به مشين پڙهڻ لائق API نه آهي جهڙوڪ SNMP يا ساڳيو. CC پيغامن کي گهٽ ۾ گهٽ 1 سيڪنڊن لاءِ گڏ ڪيو وڃي (پيڪٽ جي نقصان جي وڏي فيصد سان، اتي ٿي سگهي ٿو سئو/هزارين/ ڏهه هزار في سيڪنڊ، بٽريٽ جي لحاظ کان).
اهڙيءَ طرح، ٻنهي معلومات کي محفوظ ڪرڻ ۽ CC جي غلطين ۽ بٽريٽ لاءِ گراف ٺاهڻ ۽ ڪجهه قسم جا حادثا ڪرڻ لاءِ، هيٺيان آپشن ٿي سگهن ٿا:
- پارس ۽ مجموعي (CC پاران) ٽي ايس پي جي پيداوار، يعني. ان کي مطلوب شڪل ۾ تبديل ڪريو.
- tsp پاڻ کي ختم ڪريو ۽/يا پروسيسر پلگ ان bitrate_monitor ۽ continuity ته جيئن نتيجو مشين پڙهڻ جي قابل فارم ۾ ڏنو وڃي جيڪو مانيٽرنگ سسٽم لاءِ موزون هجي.
- tsduck لائبريري جي چوٽي تي پنھنجي درخواست لکو.
ظاهر آهي، اختيار 1 ڪوشش جي لحاظ کان تمام آسان آهي، خاص طور تي غور ڪيو ته tsduck پاڻ کي گهٽ سطح (جديد معيار جي مطابق) ٻولي (C ++) ۾ لکيو ويو آهي.
هڪ سادي بيش پارسر + ايگريگيٽر پروٽوٽائپ ڏيکاري ٿو ته 10 ايم بي پي ايس اسٽريم ۽ 50٪ پيڪٽ نقصان تي (بدترين صورت ۾) ، بش پروسيس پاڻ کي ٽي ايس پي پروسيس کان 3-4 ڀيرا وڌيڪ سي پي يو استعمال ڪيو. هي منظرنامو ناقابل قبول آهي. واقعي هيٺ ڏنل هن پروٽوٽائپ جو هڪ ٽڪرو
مٿي تي نوڊلز
#!/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
ناقابل قبول سست ٿيڻ کان علاوه، بش ۾ ڪي به نارمل ٿريڊ نه آهن، بش جاب الڳ الڳ عمل آهن، ۽ مون کي مسنگ پيڪٽس جي قيمت لکڻي هئي هڪ سيڪنڊ ۾ هڪ ڀيرو پاسي واري اثر تي (جڏهن بٽريٽ پيغام وصول ڪري رهيا آهن جيڪي هر سيڪنڊ ۾ اچن ٿا). نتيجي طور، بش اڪيلو رهجي ويو ۽ اهو فيصلو ڪيو ويو ته گولنگ ۾ هڪ لفافي (parser + aggregator) لکڻ. ساڳي گولنگ ڪوڊ جي سي پي يو جو استعمال 4-5 ڀيرا گھٽ آهي tsp پروسيس کان. گولنگ سان بش جي بدلي جي ڪري ريپر جي رفتار تقريبن 16 ڀيرا ٿي وئي ۽ عام طور تي نتيجو قابل قبول آهي (سي پي يو اوور هيڊ 25 سيڪڙو کان وڌيڪ بدترين حالت ۾). گولنگ ماخذ فائل واقع آهي
چادر چاڙهڻ
ريپر کي شروع ڪرڻ لاءِ، سسٽم ڊي لاءِ آسان ترين سروس ٽيمپليٽ ٺاهيو ويو (
خدمت جو هڪ مثال ٺاهڻ لاء، توهان کي هلائڻ جي ضرورت آهي systemctl فعال حڪم [ايميل محفوظ ٿيل]: 1234 پوء systemctl شروع سان هلائي [ايميل محفوظ ٿيل]: 1234.
Zabbix کان دريافت
زبڪس لاءِ ڊوڙندڙ خدمتون دريافت ڪرڻ جي قابل ٿي، اهو ڪيو ويو آهي
Zabbix ٽيمپليٽ
مختصر چيڪ لسٽ (چڱو، ڇا جيڪڏهن ڪو ماڻهو ان کي استعمال ڪرڻ جو فيصلو ڪري ٿو)
- پڪ ڪريو ته ٽي ايس پي "مثالي" حالتن جي تحت پيڪيٽ نه ڇڏي (جنريٽر ۽ تجزيه ڪندڙ سڌو سنئون ڳنڍيل آهن)، جيڪڏهن قطرا آهن، پيراگراف 2 يا هن معاملي تي آرٽيڪل جو متن ڏسو.
- وڌ ۾ وڌ ساکٽ بفر کي ٽيوننگ ڪريو (net.core.rmem_max=8388608).
- tsduck-stat.go مرتب ڪريو (tsduck-stat.go تعمير ڪريو).
- سروس ٽيمپليٽ کي /lib/systemd/system ۾ رکو.
- سسٽم سي ٽي ايل سان خدمتون شروع ڪريو، چيڪ ڪريو ته ڪائونٽر ظاهر ٿيڻ شروع ٿي ويا آهن (grep "" /dev/shm/tsduck-stat/*). ملٽي ڪاسٽ اسٽريمز جي تعداد جي حساب سان خدمتن جو تعداد. هتي توهان کي ملٽي ڪاسٽ گروپ ڏانهن رستو ٺاهڻ جي ضرورت پوندي، شايد rp_filter کي غير فعال ڪريو يا ذريعو ip ڏانهن رستو ٺاهيو.
- Discovery.sh هلايو، پڪ ڪريو ته اهو json ٺاهي ٿو.
- زبڪس ايجنٽ ترتيب شامل ڪريو، زبڪس ايجنٽ کي ٻيهر شروع ڪريو.
- ٽيمپليٽ کي زبڪس تي اپلوڊ ڪريو، ان کي ميزبان تي لاڳو ڪريو جيڪو مانيٽر ڪيو پيو وڃي ۽ زبڪس-ايجنٽ نصب ٿيل آهي، اٽڪل 5 منٽ انتظار ڪريو، ڏسو ته ڇا نوان شيون، گرافس ۽ محرڪ آهن.
نتيجي ۾
پيٽ جي نقصان کي ڳولڻ جي ڪم لاء، اهو تقريبا ڪافي آهي، گهٽ ۾ گهٽ اهو بهتر آهي ته مانيٽرنگ کان سواء.
درحقيقت، CC "نقصان" ٿي سگهي ٿو جڏهن وڊيو ٽڪرا کي ضم ڪرڻ (جيتري قدر مون کي خبر آهي، روسي فيڊريشن ۾ مقامي ٽي وي سينٽرن تي داخل ٿيڻ جو طريقو آهي، يعني سي سي انسداد کي ٻيهر ڳڻڻ کان سواء)، اهو ياد رکڻ گهرجي. ملڪيت جا حل جزوي طور تي SCTE-35 ليبلز (جيڪڏهن وهڪرو جنريٽر پاران شامل ڪيا ويا) کي ڳولڻ سان هن مسئلي کي ختم ڪن ٿا.
ٽرانسپورٽ جي معيار جي نگراني جي لحاظ کان، جٽ مانيٽرنگ (IAT) جي کوٽ آهي. ٽي وي سامان (هيءُ ماڊيولٽر هجي يا آخر ڊوائيسز) هن پيراميٽر لاءِ گهرجون آهن ۽ اهو هميشه ممڪن ناهي ته جٽ بفر کي لامحدوديت ڏانهن وڌايو وڃي. ۽ جٽٽر فلوٽ ٿي سگهي ٿو جڏهن وڏي بفرن سان گڏ سامان ٽرانزٽ ۾ استعمال ڪيو ويندو آهي ۽ QoS ترتيب نه ڏنو ويو آهي يا اهڙي حقيقي وقت ٽرئفڪ کي منتقل ڪرڻ لاء ڪافي ترتيب نه آهي.
جو ذريعو: www.habr.com