perf+flamegraph 分析 nginx-rtmp 性能
问题
最近在对 Nginx-rtmp 进行性能测试时发现,当一路推流的观看者数量达到一定上限后,会出现推流断流现象。推流配置了:
drop_idle_publisher 3s;
最后分析得到的结果,在 ngx_rtmp_recv 中,一路流并发路数过多时,会导致 ngx_rtmp_receive_message 执行时间过长(当并发数超过 1000 时,该函数执行时间会经常超过 20 ms)。当推流端接收数据速度大于该函数处理时长时,进程处理流程无法退出 ngx_rtmp_recv,下次退出 ngx_rtmp_recv 超过 3s 时,推流被断掉。
下图是不同码率不同并发下,20000 个采样点的数据
该问题不仅会导致正在处理的流被断掉,还会导致该进程上其它流无法处理被饿死,因此有必要分析 ngx_rtmp_receive_message 消耗点在哪儿。
环境安装
安装 perf
yum install -y perf
安装 flamegraph
git clone https://github.com/brendangregg/FlameGraph.git mv FlameGraph/ /usr/local/flamegraph
在 /usr/local/bin