เปƒเบŠเป‰ TSDuck เป€เบžเบทเปˆเบญเบ•เบดเบ”เบ•เบฒเบก IP(TS) Stream

เบกเบทเป‰เบ™เบตเป‰, เบกเบตเบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบก (เป€เบ›เบฑเบ™เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡) เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก IP (TS) streams, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡. VB ะธ iQ, เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบกเบตเบซเบ™เป‰เบฒเบ—เบตเปˆเบญเบธเบ”เบปเบกเบชเบปเบกเบšเบนเบ™เบžเปเบชเบปเบกเบ„เบงเบ™เปเบฅเบฐเบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เป‚เบ—เบฅเบฐเบžเบฒเบšเบกเบตเบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™. เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เปเบเป‰เป„เบ‚เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเป‚เบ„เบ‡เบเบฒเบ™เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ” TSDuck, เบญเบญเบเปเบšเบšเบกเบฒเป€เบžเบทเปˆเบญเบ„เบงเบšเบ„เบธเบก IP(TS) streams เปœเป‰เบญเบเบ—เบตเปˆเบชเบธเบ”เป‚เบ”เบ CC(continuity counter) counter เปเบฅเบฐ bitrate. เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เปเบกเปˆเบ™เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เบชเบนเบ™เป€เบชเบเปเบžเบฑเบเป€เบเบฑเบ”เบซเบผเบทเบเบฒเบ™เป„เบซเบผเป€เบ‚เบปเป‰เบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เป‚เบ”เบเบœเปˆเบฒเบ™เบŠเปˆเบญเบ‡เบ—เบฒเบ‡ L2 เบ—เบตเปˆเป€เบŠเบปเปˆเบฒ (เป€เบŠเบดเปˆเบ‡เบšเปเปˆเบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฒเบกเป„เบ”เป‰เบ•เบฒเบกเบ›เบปเบเบเบฐเบ•เบด, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เป‚เบ”เบเบเบฒเบ™เบญเปˆเบฒเบ™เบ•เบปเบงเบ™เบฑเบšเบเบฒเบ™เบชเบนเบ™เป€เบชเบเปƒเบ™เบ„เบดเบง).

เบชเบฑเป‰เบ™เป†เบเปˆเบฝเบงเบเบฑเบš TSDuck

TSDuck เป€เบ›เบฑเบ™เบŠเบญเบŸเปเบง open source (เปƒเบšเบญเบฐเบ™เบธเบเบฒเบ” 2-Clause BSD) (เบŠเบธเบ”เบ‚เบญเบ‡ console utilities เปเบฅเบฐเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ custom utilities เบซเบผเบท plugins) เบชเปเบฒเบฅเบฑเบš manipulating TS streams. เป€เบ›เบฑเบ™เบงเบฑเบ”เบชเบฐเบ”เบธเบ›เป‰เบญเบ™, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš 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) เปเบฅเบฐเบซเบผเบธเบ”เบฅเบปเบ‡. เป‚เบ›เป€เบŠเบ”เป€เบŠเบตเบเบฒเบ™เบˆเบฒเบฅเบฐเบˆเบญเบ™เบ•เปˆเบฒเบ‡เป†เบชเบฒเบกเบฒเบ”เบ–เบทเบเบฅเบงเบกเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเบœเบปเบ™เบœเบฐเบฅเบดเบ”, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, PID remapping, scrambling / descrambling, เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ•เป‰เบฒเบ™ CC, เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบญเบฑเบ”เบ•เบฒเบšเบดเบ”, เปเบฅเบฐเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ›เบปเบเบเบฐเบ•เบดเบญเบทเปˆเบ™เป†เบชเปเบฒเบฅเบฑเบšเบ™เป‰เปเบฒ TS.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, IP streams (multicast) เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบ›เบฑเบ™ input, bitrate_monitor processors (เบˆเบฒเบเบŠเบทเปˆเบกเบฑเบ™เบˆเบฐเปเบˆเป‰เบ‡เบงเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบซเบเบฑเบ‡) เปเบฅเบฐเบเบฒเบ™เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡ (CC counter analysis) processors เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰. เป‚เบ”เบเบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒเปƒเบ”เป†, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ—เบปเบ”เปเบ—เบ™ IP multicast เบ”เป‰เบงเบเบ›เบฐเป€เบžเบ”เบงเบฑเบ”เบชเบฐเบ”เบธเบ›เป‰เบญเบ™เบญเบทเปˆเบ™เบ—เบตเปˆเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป‚เบ”เบ TSDuck.

เบกเบตเปƒเบซเป‰ เบเบฒเบ™โ€‹เบเปเปˆโ€‹เบชเป‰เบฒเบ‡ / เบเบฒเบ™โ€‹เบซเบธเป‰เบกโ€‹เบซเปเปˆโ€‹เบขเปˆเบฒเบ‡โ€‹เป€เบ›เบฑเบ™โ€‹เบ—เบฒเบ‡โ€‹เบเบฒเบ™โ€‹ TSDuck เบชเปเบฒเบฅเบฑเบšเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เบชเปˆเบงเบ™เปƒเบซเบเปˆ. เบžเบงเบเบกเบฑเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เบชเปเบฒเบฅเบฑเบš Debian, เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบˆเบฑเบ”เบเบฒเบ™เบชเป‰เบฒเบ‡เบžเบงเบเบกเบฑเบ™เบžเบฒเบเปƒเบ•เป‰ debian 8 เปเบฅเบฐ debian 10 เป‚เบ”เบเบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒเปƒเบ”เป†.

เบ•เปเปˆเป„เบ›, เบฎเบธเปˆเบ™ TSDuck 3.19-1520 เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰, Linux เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบ›เบฑเบ™ OS (debian 10 เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบเบฐเบเบฝเบกเบเบฒเบ™เปเบเป‰เป„เบ‚, CentOS 7 เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ•เบปเบงเบˆเบดเบ‡)

เบเบฒเบ™เบเบฐเบเบฝเบก TSDuck เปเบฅเบฐ OS

เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบ•เบดเบ”เบ•เบฒเบกเบเบฒเบ™เป„เบซเบผเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒ TSDuck เป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡เปเบฅเบฐเบเบฒเบ™เบซเบผเบธเบ”เบฅเบปเบ‡เบ™เบฑเป‰เบ™เบšเปเปˆเป„เบ”เป‰เป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เบฅเบฐเบ”เบฑเบšเบšเบฑเบ”เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบซเบผเบท OS (socket). เบ™เบตเป‰เปเบกเปˆเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบงเปˆเบฒเบ—เปˆเบฒเบ™เบˆเบฐเบšเปเปˆเบ•เป‰เบญเบ‡เป€เบ”เบปเบฒเบžเบฒเบเบซเบผเบฑเบ‡เบ—เบตเปˆเบเบฒเบ™เบซเบผเบธเบ”เบฅเบปเบ‡เป€เบเบตเบ”เบ‚เบถเป‰เบ™ - เปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบซเบผเบท "เบžเบฒเบเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ." เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเบงเบ”เป€เบšเบดเปˆเบ‡เบเบฒเบ™เบซเบผเบธเบ”เบฅเบปเบ‡เปƒเบ™เบฅเบฐเบ”เบฑเบšเบšเบฑเบ”เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ”เป‰เบงเบเบ„เปเบฒเบชเบฑเปˆเบ‡ ethtool -S ethX, เบเบฒเบ™เบ›เบฑเบšเปเบกเปˆเบ™เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบ ethtool เบ”เบฝเบงเบเบฑเบ™ (เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบดเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบก RX buffer (-G) เปเบฅเบฐเบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบ›เบดเบ”เบเบฒเบ™เป‚เบซเบผเบ”เบšเบฒเบ‡เบขเปˆเบฒเบ‡ (-K)). เบ•เบฒเบกเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบปเปˆเบงเป„เบ›, เบ„เบงเบ™เปƒเบŠเป‰เบžเบญเบ”เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเป€เบžเบทเปˆเบญเบฎเบฑเบšเบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เบ—เบตเปˆเบงเบดเป€เบ„เบฒเบฐ, เบ–เป‰เบฒเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰, เบ™เบตเป‰เบˆเบฐเบซเบผเบธเบ”เบœเปˆเบญเบ™เบœเบปเบ™เบšเบงเบเบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบเบฒเบ™เบซเบผเบธเบ”เบฅเบปเบ‡เป„เบ”เป‰เป€เบเบตเบ”เบ‚เบทเป‰เบ™เบžเป‰เบญเบกเป†เบเบฑเบ™เบขเบนเปˆเปƒเบ™เบžเบญเบ”เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบกเบตเบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เบญเบทเปˆเบ™เป†. เบ–เป‰เบฒเบญเบฑเบ™เบ™เบตเป‰เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰ (เบ—เปˆเบฒเบ™เบเบณเบฅเบฑเบ‡เปƒเบŠเป‰เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเบ‚เบฐเปœเบฒเบ”เบ™เป‰เบญเบ/ NUC เบ—เบตเปˆเบกเบตเบžเบญเบ”เบญเบฑเบ™เบ”เบฝเบง), เบกเบฑเบ™เบชเบปเบกเบ„เบงเบ™เบ—เบตเปˆเบˆเบฐเบเบณเบ™เบปเบ”เบ„เปˆเบฒเบšเบนเบฅเบดเบกเบฐเบชเบดเบ”เบ‚เบญเบ‡เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เบ—เบตเปˆเบงเบดเป€เบ„เบฒเบฐเปเบฅเป‰เบงเบเปˆเบฝเบงเบเบฑเบšเบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเปƒเบ™เบญเบธเบ›เบฐเบเบญเบ™เบ—เบตเปˆเป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ. เบเปˆเบฝเบงเบเบฑเบšเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก virtual, เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฅเบฐเบกเบฑเบ”เบฅเบฐเบงเบฑเบ‡เปเบฅเบฐเบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบเบฒเบ™เบซเบผเบธเบ”เบฅเบปเบ‡เบ‚เบญเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบˆเบฒเบเบžเบญเบ”เบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบฎเปˆเบฒเบ‡เบเบฒเบเปเบฅเบฐเบชเบดเป‰เบ™เบชเบธเบ”เบ”เป‰เบงเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบžเบฒเบเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡ virtual.

เบเบฒเบ™เบœเบฐเบฅเบดเบ”เปเบฅเบฐเบเบฒเบ™เบ•เป‰เบญเบ™เบฎเบฑเบšเบ‚เบญเบ‡เบ™เป‰เปเบฒเบžเบฒเบเปƒเบ™เป€เบˆเบปเป‰เบฒเบžเบฒเบš

เป€เบ›เบฑเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เปเบฒเบญเบดเบ”เปƒเบ™เบเบฒเบ™เบเบฐเบเบฝเบก 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 เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ 1 เบŠเบธเบ” IP เปเบฅเบฐเป€เบฎเบฑเบ”เบกเบฑเบ™เบเบฒเบ (-e), i.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 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% เบ”เบฝเบงเบเบฑเบ™เบ‚เบญเบ‡ bitrate เบ—เบตเปˆเบชเบนเบ™เป€เบชเบเปเบกเปˆเบ™เบเบฒเบ™เบซเบผเบธเบ”เบฅเบปเบ‡เปƒเบ™เป€เบ•เบปเป‰เบฒเบฎเบฑเบš UDP. เบเบฒเบ™เบซเบผเบธเบ”เบฅเบปเบ‡เปƒเบ™เบŠเบฑเบญเบเป€เบเบฑเบ” UDP เบกเบฑเบเบˆเบฐเป€เบเบตเบ”เบ‚เบทเป‰เบ™เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบ‚เบฒเบ”เบšเบฑเบšเป€เบŸเบต, เป€เบšเบดเปˆเบ‡เบ‚เบฐเบซเบ™เบฒเบ” socket buffer เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ” socket buffer เบชเบนเบ‡เบชเบธเบ”:

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

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ–เป‰เบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบšเปเปˆเบฎเป‰เบญเบ‡เบ‚เปเบ‚เบฐเบซเบ™เบฒเบ” buffer เบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™, เป€เบ•เบปเป‰เบฒเบชเบฝเบšเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบ”เป‰เบงเบ buffer 208 KB, เปเบ•เปˆเบ–เป‰เบฒเบžเบงเบเป€เบ‚เบปเบฒเบฎเป‰เบญเบ‡เบ‚เปเป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เบžเบงเบเป€เบ‚เบปเบฒเบเบฑเบ‡เบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเบฎเป‰เบญเบ‡เบ‚เป. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบ‚เบฐเบซเบ™เบฒเบ” buffer เปƒเบ™ tsp เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™ IP (-buffer-size), เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเปเบ•เบฐเบ‚เบฐเบซเบ™เบฒเบ” socket เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เปเบ•เปˆเบžเบฝเบ‡เปเบ•เปˆเบเปเบฒเบ™เบปเบ”เบ‚เบฐเบซเบ™เบฒเบ” buffer เป€เบ•เบปเป‰เบฒเบฎเบฑเบšเบชเบนเบ‡เบชเบธเบ”เปเบฅเบฐเบฅเบฐเบšเบธเบ‚เบฐเบซเบ™เบฒเบ” buffer เบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™ arguments 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

เบ”เป‰เบงเบเบเบฒเบ™เบ›เบฑเบš socket buffer เบ™เบตเป‰, เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบญเบฑเบ”เบ•เบฒเบšเบดเบ”เบ—เบตเปˆเบฅเบฒเบเบ‡เบฒเบ™เปเบกเปˆเบ™เบ›เบฐเบกเบฒเบ™ 100Mbps, เบšเปเปˆเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ” CC.

เบญเบตเบ‡เบ•เบฒเบกเบเบฒเบ™เบšเปเบฅเบดเป‚เบžเบ CPU เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ tsp เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡. เบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบซเบ™เบถเปˆเบ‡ core i5-4260U CPU @ 1.40GHz, เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบเบฒเบ™เป„เบซเบผ 10Mbps เบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™ CPU 3-4%, 100Mbps - 25%, 200Mbps - 46%. เป€เบกเบทเปˆเบญเบ•เบฑเป‰เบ‡ % Packet Loss, เบเบฒเบ™เป‚เบซเบผเบ”เปƒเบ™ CPU เบšเปเปˆเป„เบ”เป‰เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™ (เปเบ•เปˆเบญเบฒเบ”เบˆเบฐเบซเบผเบธเบ”เบฅเบปเบ‡).

เปƒเบ™เบฎเบฒเบ”เปเบงเบ—เบตเปˆเบกเบตเบœเบปเบ™เบœเบฐเบฅเบดเบ”เบซเบผเบฒเบ, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เปเบฅเบฐเบงเบดเป€เบ„เบฒเบฐเบชเบฒเบเบ™เป‰เปเบฒเบซเบผเบฒเบเบเปˆเบงเบฒ 1Gb / s เป‚เบ”เบเบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒเปƒเบ”เป†.

เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปƒเบ™เบšเบฑเบ”เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡

เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ„เบนเปˆ veth, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบญเบปเบฒเบชเบญเบ‡เป‚เบฎเบ”เบซเบผเบทเบชเบญเบ‡เบžเบญเบ”เบ‚เบญเบ‡เบซเบ™เบถเปˆเบ‡เป‚เบฎเบ”, เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบžเบญเบ”เบเบฑเบšเบเบฑเบ™เปเบฅเบฐเบเบฑเบ™, เปเบฅเปˆเบ™เป€เบ„เบทเปˆเบญเบ‡เบเปเบฒเป€เบ™เบตเบ”เป„เบŸเบŸเป‰เบฒเปƒเบ™เบซเบ™เบถเปˆเบ‡, เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐเบ—เบตเบชเบญเบ‡. เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเปเบ›เบเปƒเบˆเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰, เปเบ•เปˆเบ„เบงเบฒเบกเบˆเบดเบ‡เปเบฅเป‰เบงเบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบฎเบฒเบ”เปเบง, เบกเบฑเบ™เบญเปˆเบญเบ™เบเบงเปˆเบฒ, เบกเบฑเบ™เบˆเบฐเบกเบตเบ„เบงเบฒเบกเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบซเบผเบฒเบเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเป‚เบ”เบเบฅเบฐเบšเบปเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก (Zabbix)

tsp เบšเปเปˆเบกเบต API เบ—เบตเปˆเป€เบ„เบทเปˆเบญเบ‡เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป„เบ”เป‰เป€เบŠเบฑเปˆเบ™ SNMP เบซเบผเบทเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™. เบ‚เปเป‰เบ„เบงเบฒเบก CC เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ 1 เบงเบดเบ™เบฒเบ—เบตเบ•เปเปˆเบ„เบฑเป‰เบ‡ (เป‚เบ”เบเบกเบตเบญเบฑเบ”เบ•เบฒเบชเปˆเบงเบ™เบชเบนเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบชเบนเบ™เป€เบชเบเปเบžเบฑเบเป€เบเบฑเบ”, เบชเบฒเบกเบฒเบ”เบกเบตเบซเบผเบฒเบเบฎเป‰เบญเบ / เบžเบฑเบ™ / เบชเบดเบšเบžเบฑเบ™เบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต, เบ‚เบถเป‰เบ™เบเบฑเบšเบญเบฑเบ”เบ•เบฒเบšเบดเบ”).

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบžเบทเปˆเบญเบšเบฑเบ™เบ—เบถเบเบ—เบฑเบ‡เบชเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเปเบ•เป‰เบกเบเบฒเบŸเบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” CC เปเบฅเบฐเบญเบฑเบ”เบ•เบฒเบšเบดเบ”เปเบฅเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบšเบฒเบ‡เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบญเบธเบ›เบฐเบ•เบดเป€เบซเบ”, เบญเบฒเบ”เบˆเบฐเบกเบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  1. parse เปเบฅเบฐเบฅเบงเบšเบฅเบงเบก (เป‚เบ”เบ CC) เบœเบปเบ™เบœเบฐเบฅเบดเบ” tsp, i.e. เบ›เปˆเบฝเบ™เบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™.
  2. เป€เบžเบตเปˆเบก tsp เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เปเบฅเบฐ / เบซเบผเบท plugins เป‚เบ›เป€เบŠเบ”เป€เบŠเบต bitrate_monitor เปเบฅเบฐเบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡เป€เบžเบทเปˆเบญเปƒเบซเป‰เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปเบกเปˆเบ™เบœเบปเบ™เบœเบฐเบฅเบดเบ”เปƒเบ™เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเป€เบ„เบทเปˆเบญเบ‡เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป„เบ”เป‰เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบฅเบฐเบšเบปเบšเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก.
  3. เบ‚เบฝเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบขเบนเปˆเป€เบ—เบดเบ‡เบชเบธเบ”เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” tsduck.

เปเบ™เปˆเบ™เบญเบ™, เบ—เบฒเบ‡เป€เบฅเบทเบญเบ 1 เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ—เบตเปˆเบชเบธเบ”เบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบก, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเปเบกเปˆเบ™เบเบฒเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบงเปˆเบฒ tsduck เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบ–เบทเบเบ‚เบฝเบ™เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ•เปˆเปเบฒ (เป‚เบ”เบเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบก) เบžเบฒเบชเบฒ (C ++)

A เบ‡เปˆเบฒเบเบ”เบฒเบ bash parser + aggregator prototype เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเปƒเบ™ 10Mbps stream เปเบฅเบฐ 50% packet เบชเบนเบ™เป€เบชเบ (เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบฎเป‰เบฒเบเปเบฎเบ‡เบ—เบตเปˆเบชเบธเบ”), เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ bash เปƒเบŠเป‰ CPU 3-4 เป€เบ—เบปเปˆเบฒเบซเบผเบฒเบเบเปˆเบงเบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™ tsp เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡. เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ™เบตเป‰เบšเปเปˆเบชเบฒเบกเบฒเบ”เบเบญเบกเบฎเบฑเบšเป„เบ”เป‰. เปเบ—เป‰เบˆเบดเบ‡เปเบฅเป‰เบง, เบŠเบดเป‰เบ™เบชเปˆเบงเบ™เบ‚เบญเบ‡เบ•เบปเป‰เบ™เปเบšเบšเบ™เบตเป‰เปเบกเปˆเบ™เบขเบนเปˆเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰

Noodles เบชเบธเบ” basha

#!/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 เปเบกเปˆเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบญเบเบฐเบฅเบฒเบ”เปเบฅเบฐเบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบ‚เบฝเบ™เบกเบนเบ™เบ„เปˆเบฒเบ‚เบญเบ‡ Packets เบ—เบตเปˆเบ‚เบฒเบ”เบซเบฒเบเป„เบ›เบซเบ™เบถเปˆเบ‡เบ„เบฑเป‰เบ‡เบ•เปเปˆเบงเบดเบ™เบฒเบ—เบตเบเปˆเบฝเบงเบเบฑเบšเบœเบปเบ™เบเบฐเบ—เบปเบšเบ‚เป‰เบฒเบ‡เบ„เบฝเบ‡ (เป€เบกเบทเปˆเบญเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบญเบฑเบ”เบ•เบฒเบšเบดเบ”เบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบกเบฒเบ—เบธเบเป†เบงเบดเบ™เบฒเบ—เบต). เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, bash เป„เบ”เป‰เบ–เบทเบเบ›เบฐเป„เบงเป‰เบขเปˆเบฒเบ‡เบ”เบฝเบงเปเบฅเบฐเบกเบฑเบ™เบ–เบทเบเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ‚เบฝเบ™ wrapper (parser + aggregator) เปƒเบ™ golang. เบเบฒเบ™เบšเปเบฅเบดเป‚เบžเบ CPU เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เปƒเบ™ golang เปเบกเปˆเบ™ 4-5 เป€เบ—เบทเปˆเบญเบซเบ™เป‰เบญเบเบเปˆเบงเบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™ tsp เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡. เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ‚เบญเบ‡ wrapper เป‚เบ”เบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ—เบ™ bash เบเบฑเบš golang เปเบกเปˆเบ™เบ›เบฐเบกเบฒเบ™ 16 เป€เบ—เบทเปˆเบญเปเบฅเบฐเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเป‚เบ”เบเบฅเบงเบกเปเบกเปˆเบ™เบเบญเบกเบฎเบฑเบš (CPU overhead 25% เปƒเบ™เบเปเบฅเบฐเบ™เบตเบฎเป‰เบฒเบเปเบฎเบ‡เบ—เบตเปˆเบชเบธเบ”). เป„เบŸเบฅเปŒเปเบซเบผเปˆเบ‡ golang เบ•เบฑเป‰เบ‡เบขเบนเปˆ เบ—เบตเปˆเบ™เบตเป‰.

เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบซเปเปˆ

เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบซเปเปˆ, เปเบกเปˆเปเบšเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบ—เบตเปˆเบชเบธเบ”เบชเปเบฒเบฅเบฑเบš systemd เป„เบ”เป‰เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™ (เบ—เบตเปˆเบ™เบตเป‰). wrapper เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบ„เบงเบ™เบˆเบฐเบ–เบทเบเบฅเบงเบšเบฅเบงเบกเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป„เบŸเบฅเปŒเบ„เบนเปˆ (เป„เบ›เบชเป‰เบฒเบ‡ tsduck-stat.go) เบ—เบตเปˆเบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™ /opt/tsduck-stat/. เบกเบฑเบ™เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เปƒเบŠเป‰ golang เป‚เบ”เบเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป‚เบกเบ‡ monotonic (>= 1.9).

เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เป€เบ›เบตเบ”เปƒเบŠเป‰ systemctl [email protected]: 1234 เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ”เป‰เบงเบเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ systemctl [email protected]: 1234

เบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบšเบˆเบฒเบ Zabbix

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ zabbix เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบฅเปˆเบ™, เบœเบนเป‰เบœเบฐเบฅเบดเบ”เบฅเบฒเบเบŠเบทเปˆเบเบธเปˆเบก (discovery.sh), เปƒเบ™เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบš Zabbix, เบกเบฑเบ™เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ”เบฝเบงเบเบฑเบ™ - in /opt/tsduck-stat . เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบšเบœเปˆเบฒเบ™ zabbix-agent, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบก เป„เบŸเบฅเปŒ .conf เป„เบ›เบซเบฒเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ zabbix-agent เป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบœเบนเป‰เปƒเบŠเป‰.

เปเบกเปˆเปเบšเบš Zabbix

เบชเป‰เบฒเบ‡เปเบกเปˆเปเบšเบš (tsduck_stat_template.xml) เบ›เบฐเบเบญเบšเบกเบตเบเบปเบ”เบฅเบฐเบšเบฝเบš autodiscover, prototypes เบฅเบฒเบเบเบฒเบ™, เบเบฃเบฒเบš เปเบฅเบฐ triggers.

เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบเบฒเบ™เบเบงเบ”เบเบฒเบชเบฑเป‰เบ™เป† (เบ”เบต, เบˆเบฐเป€เบ›เบฑเบ™เปเบ™เบงเปƒเบ”เบ–เป‰เบฒเบœเบนเป‰เปƒเบ”เบœเบนเป‰เบ™เบถเปˆเบ‡เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเปƒเบŠเป‰เบกเบฑเบ™)

  1. เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒ tsp เบšเปเปˆเป„เบ”เป‰เบซเบผเบธเบ”เบฅเบปเบ‡เบŠเบญเบ‡เบžเบฒเบเปƒเบ•เป‰เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚ "เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก" (เป€เบ„เบทเปˆเบญเบ‡เบเปเบฒเป€เบ™เบตเบ”เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐเปเบกเปˆเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเบเบปเบ‡), เบ–เป‰เบฒเบกเบตเบเบฒเบ™เบซเบผเบธเบ”เบฅเบปเบ‡, เป€เบšเบดเปˆเบ‡เบˆเบธเบ” 2 เบซเบผเบทเบ‚เปเป‰เบ„เบงเบฒเบกเบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰.
  2. เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบ›เบฑเบšเปเบ•เปˆเบ‡เบ‚เบญเบ‡ socket buffer เบชเบนเบ‡เบชเบธเบ” (net.core.rmem_max=8388608).
  3. เบฅเบงเบšเบฅเบงเบก tsduck-stat.go (เป„เบ›เบชเป‰เบฒเบ‡ tsduck-stat.go).
  4. เปƒเบชเปˆเปเบกเปˆเปเบšเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปƒเบ™ /lib/systemd/system.
  5. เป€เบฅเบตเปˆเบกเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ”เป‰เบงเบ systemctl, เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบ•เบปเบงเบ™เบฑเบšเป€เบฅเบตเปˆเบกเบ›เบฒเบเบปเบ” (grep "" /dev/shm/tsduck-stat/*). เบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เป‚เบ”เบเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ” multicast. เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบซเบฒเบเบธเปˆเบก multicast, เบšเบฒเบ‡เบ—เบตเบญเบฒเบ”เบ›เบดเบ”เบเบฒเบ™เปƒเบŠเป‰เบ‡เบฒเบ™ rp_filter เบซเบผเบทเบชเป‰เบฒเบ‡เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบซเบฒ ip เปเบซเบผเปˆเบ‡.
  6. เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ discovery.sh, เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบกเบฑเบ™เบชเป‰เบฒเบ‡ json.
  7. เป€เบžเบตเปˆเบกเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ•เบปเบงเปเบ—เบ™ zabbix, เบฃเบตเบชเบฐเบ•เบฒเบ”เบ•เบปเบงเปเบ—เบ™ zabbix.
  8. เบญเบฑเบšเป‚เบซเบฅเบ”เปเบกเปˆเปเบšเบšเปƒเบชเปˆ zabbix, เบ™เปเบฒเปƒเบŠเป‰เบกเบฑเบ™เบเบฑเบšเป€เบˆเบปเป‰เบฒเบžเบฒเบšเบ—เบตเปˆเบเปเบฒเบฅเบฑเบ‡เบ•เบดเบ”เบ•เบฒเบกเปเบฅเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡ zabbix-agent, เบฅเปเบ–เป‰เบฒเบ›เบฐเบกเบฒเบ™ 5 เบ™เบฒเบ—เบต, เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบกเบตเบฅเบฒเบเบเบฒเบ™เปƒเบซเบกเปˆ, เป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡เปเบฅเบฐ triggers.

เบœเบปเบ™

เปƒเบŠเป‰ TSDuck เป€เบžเบทเปˆเบญเบ•เบดเบ”เบ•เบฒเบก IP(TS) Stream

เบชเปเบฒเบฅเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบชเบนเบ™เป€เบชเบเปเบžเบฑเบเป€เบเบฑเบ”, เบกเบฑเบ™เป€เบเบทเบญเบšเบžเบฝเบ‡เบžเป, เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบกเบฑเบ™เบเปเปˆเบ”เบตเบเบงเปˆเบฒเบšเปเปˆเบกเบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก.

เปเบ—เป‰เบˆเบดเบ‡เปเบฅเป‰เบง, CC "เบเบฒเบ™เบชเบนเบ™เป€เบชเบ" เบชเบฒเบกเบฒเบ”เป€เบเบตเบ”เบ‚เบทเป‰เบ™เป„เบ”เป‰เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เบฅเบงเบกเป€เบญเบปเบฒเบŠเบดเป‰เบ™เบงเบดเบ”เบตเป‚เบญ (เป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบ‚เป‰เบญเบเบฎเบนเป‰, เบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบเบฒเบ™เปƒเบชเปˆเปƒเบ™เบชเบนเบ™เป‚เบ—เบฅเบฐเบžเบฒเบšเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เปƒเบ™เบชเบฐเบซเบฐเบžเบฑเบ™เบฅเบฑเบ”เป€เบŠเบ, เป€เบŠเบฑเปˆเบ™: เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ„เบทเบ™ CC), เบ™เบตเป‰เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบˆเบปเบ”เบˆเปเบฒ. เบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบšเบฒเบ‡เบชเปˆเบงเบ™เบซเบฅเบตเบเบฅเป‰เบฝเบ‡เบšเบฑเบ™เบซเบฒเบ™เบตเป‰เป‚เบ”เบเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ›เป‰เบฒเบ SCTE-35 (เบ–เป‰เบฒเป€เบžเบตเปˆเบกเป‚เบ”เบเป€เบ„เบทเปˆเบญเบ‡เบเปเบฒเป€เบ™เบตเบ”เบ™เป‰เปเบฒ).

เบˆเบฒเบเบˆเบธเบ”เบ‚เบญเบ‡เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ„เบธเบ™เบ™เบฐเบžเบฒเบšเบเบฒเบ™เบ‚เบปเบ™เบชเบปเปˆเบ‡, เบเบฒเบ™เบเบงเบ”เบชเบญเบš jitter (IAT) เปเบกเปˆเบ™เบšเปเปˆเบžเบฝเบ‡เบžเป, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ เบญเบธเบ›เบฐเบเบญเบ™เป‚เบ—เบฅเบฐเบ—เบฑเบ” (เบšเปเปˆเบงเปˆเบฒเบˆเบฐเป€เบ›เบฑเบ™ modulators เบซเบผเบทเบญเบธเบ›เบฐเบเบญเบ™เบชเบดเป‰เบ™เบชเบธเบ”) เบกเบตเบ‚เปเป‰เบเปเบฒเบ™เบปเบ”เบชเปเบฒเบฅเบฑเบšเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ™เบตเป‰เปเบฅเบฐเบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐ inflate jitbuffer เบ•เบฐเบซเบผเบญเบ”เป„เบ›. เปเบฅเบฐเบเบฒเบ™เบชเบฑเปˆเบ™เบชเบฐเป€เบ—เบทเบญเบ™เบชเบฒเบกเบฒเบ”เบฅเบญเบเป„เบ”เป‰เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เบ‚เบปเบ™เบชเบปเปˆเบ‡เบ™เปเบฒเปƒเบŠเป‰เบญเบธเบ›เบฐเบเบญเบ™เบ—เบตเปˆเบกเบต buffers เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเปเบฅเบฐ QoS เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบซเบผเบทเบšเปเปˆเป„เบ”เป‰เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ”เบตเบžเปเบ—เบตเปˆเบˆเบฐเบชเบปเปˆเบ‡เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™