欢迎各位兄弟 发布技术文章
这里的技术是共享的
我经历大的CPU性能问题与版本1.0.3。
我开发的视频聊天应用。在这个应用我全部流到磁盘。当应用程序开始运行时,CPU使用率很低,但当我添加客户端,视频传输,CPU使用量的增加,直到几乎100%,客户只有12-15。在这一点上,Red5的控制台开始显示一些数据包不能被处理(“rtmpminaconnection -传入消息处理失败”),我想这是因为队列已满。一旦你达到这一点,服务器无法恢复,这种错误越来越多了。
我试图解决这个通过增加“RTMP的价值。遗嘱执行人。queue_capacity”配置和“fileconsumer价值。队列大小。“我总是得到同样的问题。也许之前的几分钟或几分钟后,但我得到的总是同样的问题。这是我的red5.properties文件:pastebin.com yp8uafhg http:/ /
我测试了它只出版音频流。我试图拯救流盘出版“记录”的旗帜或使用SaveAs方法服务器端。我也试过没有储蓄流到磁盘。我总是同样的问题,加上12-15客户端CPU达到100%的使用和服务器失败。
这是我的应用程序代码:应用pastebin.com m4xhl6i9 http:/ /web.xml的:pastebin.com 6k58bpj4 http:/ /red5-web.xml:pastebin.com mtzpwpng http:/ /
我运行在Windows 8中,服务器8GB内存,英特尔酷睿i5 1.70ghz。
你是我们的一个回调”streambroadcaststart”做了大量的处理,我建议提取上市和迭代代码转换为可执行的任务,让服务器继续快乐的方式。最快的方式,来实现我所说的意思是,这:
final IServiceCapableConnection conn = (IServiceCapableConnection) Red5.getConnectionLocal(); final String incomingStreamName = stream.getPublishedName(); new Thread(new Runnable() { public void run() { for (String streamName : streamsInRoom) { conn.invoke("newStreamInRoom", new Object[] {streamName}); } streamsInRoom.add(incomingStreamName); } }).start();
最后,你的列表应该并行:
CopyOnWriteArrayList<String> streamsInRoom = new CopyOnWriteArrayList<String>();
修改就像我相信你的CPU的问题就会消失。
我不认为里面streambroadcaststart代码要花太多的时间延迟来流的过程。
非常感谢你,我会试试这个建议。
发生这些回调线最终会慢下来或使CPU秒杀任何处理;这是多线程编程的乐趣。:)