主流流媒體的綜合效能大 PK ( smart_rtmpd, srs, zlm, nginx rtmp )

superconvert發表於2024-09-19

簡述

隨著網際網路的發展,音影片行業越來越火,自然而然的流媒體伺服器也是百花齊放。市面上也有很多種類的流媒體伺服器,讓人眼花繚亂。特別是對技術瞭解不深的朋友,更不知道怎麼選擇。
其實作為伺服器,主要考察的無外乎幾個核心指標,只要符合,基本上都是屬於比較優秀的流媒體伺服器。我簡略說一說這些核心特性:

穩定性,效能,資源佔用,併發能力,成本,可維護性

其實這些特性又不是獨立存在的,相互影響彼此。比如:可維護性。可維護性分為兩類,一個開發的可維護性,一個是運營的可維護性。開發的可維護性包括,軟體整體架構清晰,模組耦合性低,層次清晰,
這樣對於新業務的擴充套件比較容易,有問題也非常容易排查;這樣的架構也為高效,穩定提供了基石;運營的可維護性,對於新業務的展開邏輯比較清晰,錯誤排查比較方便容易定位,運維人員維護性差的可能需要 3 個人,而維護性好的可以 1 個人搞定,大大節省了人員成本。同時,對硬體資源可以減少使用的臺數,大大的節省運維費用。其實每一點都可以長篇累牘的去講述它的優缺點,但偏離了本文的用意,這裡就不一一列舉了。

這裡主要介紹幾款個人感覺不錯的流媒體伺服器。 smart_rtmpd, nginx rtmp, srs, zlm 。明白人一眼就看出來,這些主要是 C, C++ 語言實現的伺服器,沒錯。就像有的藉助小汽車的底盤,有的藉助摩托車地盤,
從起點很多別的語言的流媒體伺服器就輸了。 C, C++ 基本上屬於效能最好的語言,效能上 C > C++, 不要和我抬槓說彙編。:)

名字 開發語言
nginx rtmp C
smart_rtmpd C++
srs C++
zlm C++

基本情況介紹

smart_rtmpd 伺服器

github 地址: https://github.com/superconvert/smart_rtmpd
gitee 地址: https://gitee.com/superconvert/smart_rtmpd

免費軟體,支援 rtmp, rtsp, srt 推流,rtmp, rtsp, srt, hls, dash, http-flv, ws-flv, webrtc 拉流;支援 webrtc sfu 功能, 支援 VOD 功能,支援直播和錄影; 特點,穩定,高效,簡潔,跨平臺,解壓及執行,支援的作業系統 Windows, Ubuntun, CentOS, Debian, FreeBSD, ARM 64,無第三方依賴,基本上核心 + glibc 就能執行,軟體體積非常小,配置相對簡單,由於出道比下面三個晚,名氣相對沒有下面三個大。

nginx rtmp 伺服器

github 地址:https://github.com/arut/nginx-rtmp-module
開源軟體,由於 nginx rtmp 依託 nginx 底層,所以效能也是相對比較好的,但功能相對於其餘三個,相對比較少一點,也是支援跨平臺,需要準備第三方庫及編譯環境,針對不同的作業系統需要不同的環境配置進行編譯適配,過多的功能和說明,請參考它們的 README.md

srs 伺服器

github 地址:https://github.com/ossrs/srs
開源軟體:srs 基於協程技術,對於單程序的能力挖掘相當強悍,單對於多核應用同時對於 webrtc 的功能支援也是比較全面。也是支援跨平臺,需要配置對應的編譯環境,過多的功能和說明,請參考它們的 README.md

zlm 伺服器

github 地址:https://github.com/ZLMediaKit/ZLMediaKit
開源軟體:目前是一個龐大的開發框架,不僅提供伺服器的一些功能,還提供一些基礎元件,對於國產化的相關規範支援的比較全。過多的功能和說明,請參考它們的 README.md

測試環境

測試一般分為三端,推流端,伺服器,拉流端,為了保證公平公正合理的情況下,測試過程中,推流端不做任何更改,推流位元速率固定;拉流端不做任何更改;伺服器端依次執行各個流媒體伺服器軟體,其它軟硬體環境均保持不變。同樣的硬體,既同樣的 CPU, 記憶體,硬碟,網路。

軟體條件說明:

伺服器作業系統 Ubuntu 24.04.1 LTS ( 虛擬機器 ) , CPU: 2 , Memory: 8G

軟體 編譯器 版本或原始碼分支 說明
smart_rtmpd gcc 5.4.0 2024.09.16 烏班圖多執行緒版本 老的編譯器進行編譯,新編譯器應該效能會更好
nginx rtmp gcc 13.2.0 原始碼分支:2fb11dffaedc5af66b1442b0315c54a4b9da585d 大家如果想驗證測試結果可以自行選擇最優分支進行驗證
srs gcc 13.2.0 原始碼分支:747831154742e6e4dee9b16f3a29fc6e01904e8c 大家如果想驗證測試結果可以自行選擇最優分支進行驗證
zlm gcc 13.2.0 原始碼分支:da704ab2f1184c3c87be64fe18c9f413de101d0f 大家如果想驗證測試結果可以自行選擇最優分支進行驗證

推流軟體

軟體 版本
OBS 29.0.2
ffmpeg.exe version 4.3.2-2021-02-02-full_build-www.gyan.dev Copyright (c) 2000-2021 the FFmpeg developers

拉流軟體

軟體 版本
rtmpstress.exe
ffplay.exe version 4.3.2-2021-02-02-full_build-www.gyan.dev Copyright (c) 2003-2021 the FFmpeg developers

測試場景及資料

測試分為三個場景,時延測試,拉流測試,推流測試

時延測試

推流 OBS + 瀏覽器網頁截圖 ( 1920x1080, 8192 kb/s )
瀏覽器:線上秒錶網頁
測試協議:rtmp 推拉流

拉流 ffplay -fflags nobuffer rtmp://192.168.23.141:1935/live/stream
測試場景: 一路推流一路拉流,主要測試延時

說明 smart rtmpd srs zlm nginx rtmp
1.117 1.506 1.635 1.334
1.337 1.635 2.451 1.333
1.247 1.507 2.194 1.334
1.246 1.504 1.721 1.291
1.335 1.644 3.441 1.773
1.287 1.505 1.677 1.290
1.258 1.460 1.635 1.291
1.247 1.590 1.634 1.290
1.374 1.548 1.677 1.204
單位秒 1.376 1.635 1.592 1.376

拉流測試

推流 OBS ( 4096 kb/s )
測試協議:rtmp 推拉流
測試時長:10 分鐘
拉流 rtmpstress.exe 一路推 800 路拉,主要系統指標

說明 smart rtmpd srs zlm nginx rtmp
86% 88% 189% 95.40%
123% 98% 200% 97.40%
82% 99% 143% 84.30%
23% 53% OBS 斷開,拉流 187 94.80%
98% 42% 35.00%
89% 6% 95.50%
97% 4% 40.00%
102% OBS 斷開,拉流全部斷開 94.80%
81% 26.20%
38% 95.00%
CPU 隨機抽取 10 次
記憶體 0.50% 3.30% 0.90% 0.30%

結論 平均 CPU 佔用率 smart_rtmpd 與 nginx rtmp 旗鼓相當,CPU 佔用率相對較低,對於記憶體的佔用也是相對較低,推拉流過程相對平穩,無異常,但 nginx rtmp 業務相對於其它三個伺服器業務是最簡單的,快取或 IO 都是簡化處理的,其次它是純 C 實現的,語言上對效能的最佳化佔有天然的優勢。
壓測過程中 srs 和 zlm 推流一段時間,推流端會產生斷開現象,拉流端會出現全部斷開的現象。
smart_rtmpd 的拉流連結由 800 路降低到 724 路, 而 nginx rtmp 的拉流連結數由 800 路降低到 664 路。
srs 協程模型只能用一個 CPU ,所以理論上 CPU 不會超過 100%

推流測試

說明 smart rtmpd srs zlm nginx rtmp
CPU 13.7% ~ 200% 23.9% ~100% 97.4% ~ 200% 52.5% ~93.8%
記憶體 13.60% 6.00% 11.90% 0.40%
說明 top 檢視網路卡中斷和伺服器程序交替霸榜,CPU 大部分時間佔用和 nginx 相差不多,但 CPU 最大值大於 nginx 。推流長時間有部分連結斷開 "協程(單程序,CPU 最大 100%, 推流長時間推流連結大量斷開 )" 推流長時間有部分連結斷開 top 檢視網路卡和伺服器程序交替霸榜,表現相當不錯,推流長時間連結沒有斷開

結論: CPU 表現相對優秀的是 nginx rtmp, smart_rtmpd
記憶體佔用 smart_rtmpd 最多,不過緩衝佇列是可配置的,沒有降低配置降低記憶體佔用,nginx rtmp 的記憶體佔用比較優秀不過 smart_rtmpd, srs, zlm 的業務功能都比 nginx 複雜很多,記憶體佔用過多是理所當然的,nginx 幾乎就是做了一個簡單解流封流轉流的功能,所以系統的佔用需求是最小的"

收尾

各位老鐵想不想也想測試一下對比一下各個流媒體的效能呢?包括軟體的便利性,相容性,部署成本,維護成本,可維護性做一個全面的對比。歡迎各位老鐵拿出您的資料與結論,選出您最喜歡的流媒體伺服器。

相關文章