
SRS 的 WebRTC UDP 缓冲区怎么调优并用 netstat 检查丢包【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srsSRS 的 WebRTCRTC走 UDP 传输一旦出现卡顿、丢包官方文档指出首先要做的不是调 SRS 本身而是调整操作系统的内核网络缓冲区。本文按 SRS 官方 Performance 文档给出的步骤说明如何把 UDP 收发缓冲区调到 16MB并教你用netstat检查 UDP 丢包和队列长度判断调优是否生效。适用对象是运行 SRS WebRTC 服务RTMP 推流转 WebRTC 播放、或 WebRTC 发布的 Linux 机器包括裸机/虚拟机和 Docker 部署。先查询当前的内核缓冲区配置调优前先确认当前值用sysctl查询四个内核参数# Query the kernel configuration sysctl net.core.rmem_max sysctl net.core.rmem_default sysctl net.core.wmem_max sysctl net.core.wmem_default其中rmem_*是接收缓冲区wmem_*是发送缓冲区的最大值与默认值。把 UDP 缓冲区设置为 16MB查询之后直接把四项都设为 16777216即 16MB# Set the UDP buffer to 16MB sysctl net.core.rmem_max16777216 sysctl net.core.rmem_default16777216 sysctl net.core.wmem_max16777216 sysctl net.core.wmem_default16777216这条命令只修改当前运行中的内核参数重启后会失效。如果要让配置在重启后依然生效需要修改/etc/sysctl.conf需要 root 权限编辑系统文件前建议先确认机器用途# vi /etc/sysctl.conf # For RTC net.core.rmem_max16777216 net.core.rmem_default16777216 net.core.wmem_max16777216 net.core.wmem_default16777216Docker 部署有两个前提要注意官方文档明确说明Docker 容器读取的是宿主机的内核参数所以只需要配置宿主机即可如果你确实需要在容器内设置这些参数必须用--networkhost方式运行容器。用 netstat 检查 UDP 丢包缓冲区设置好后用网络统计确认 UDP 是否还在丢包。查询命令是netstat -suna netstat -suna sleep 30 netstat -suna第二条命令是间隔 30 秒执行两次方便对比两次输出中各项计数的增长。下面这段是官方文档给出的示例输出文档示例用来解释各字段含义不代表你机器上必须得到这些数值224911319 packets received累计收到的 UDP 数据包总数65731106 receive buffer errors接收前被丢弃的 UDP 数据包总数123534411 packets sent累计发送的 UDP 数据包总数0 send buffer errors发送前被丢弃的 UDP 数据包总数。如果receive buffer errors或send buffer errors在两次输出之间持续增长说明缓冲区仍然不够或有其他网络问题SRS 自身也会在应用层打印丢包信息例如日志里的loss(r:49,s:0)表示接收前丢弃了 49 个包。注意如果 SRS 跑在 Docker 容器里这条netstat命令必须在容器内执行而不是在宿主机上执行否则统计不到容器网络栈里的数据。查看 UDP 队列长度想看某个 socket 上积压了多少数据用netstat -lpun输出中与当前任务相关的两个字段含义引自文档示例Recv-Q该 socket 上用户程序尚未取走的字节数示例值 427008Established 状态Send-Q远端尚未确认的字节数示例值 0Established 状态。Recv-Q长期保持较大的值说明应用消费不过来可以回到上一步检查缓冲区配置是否真正生效。netstat用到的选项含义官方文档一并列出--udp或-u按 UDP 协议过滤--numeric或-n显示数值地址不做主机名/端口名/用户名解析--statistics或-s显示统计信息--all或-a同时显示监听和非监听 socket--listening或-l只显示监听 socket--program或-p显示每个 socket 对应的 PID 和程序名。相关文档中的补充信息SRS 的full.conf中rtc段还有一个相关配置reuseport默认值为 1即在同一端口上多次 listen 以增大 UDP 队列文档注释说明你也可以把它设为 1 并通过net.core.rmem_max、net.core.rmem_default增大系统 UDP 缓冲区或者直接增大reuseport的取值来获得更大的 UDP 收发缓冲区见 full.conf。更多性能工具perf、gperf、softirq 绑定等以及本文引用的完整步骤可以参考仓库内的 Performance 文档。【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考