glaciall / jtt1078-video-server

基于JT/T 1078标准实现的视频转播服务器
Other
297 stars 136 forks source link

多摄像头同时推流,cpu占用接近100,导致卡死 #8

Open zhongren opened 5 years ago

zhongren commented 5 years ago

目前单个摄像头单通道可以稳定直播,cpu占用也还行, 目前我的服务器是16核的,同时15个通道一起推流,用top看 cpu占用到了90%,然后各种卡顿了,请问有什么解决方案吗?是需要FFmpeg调用gpu去推流还是什么?

glaciall commented 5 years ago

你CPU占用很高的时候,你有没有看是谁占用的CPU高?ffmpeg还是java进程?应该不会是java进程,java这里的实现全是异步IO,这个问题你先确定一下。

另外,我刚刚试了一下,在我们的服务器上,阿里云8核16G的配置,同时16路的系统负载表现,FFMPEG进程CPU最高0.7%,内存占用最高0.1%,java进程CPU占用9%,内存占用1.4%,系统总负载:0.35、0.26、0.16,毫无压力(注意,我们服务器上的是非阻塞IO版本,不是异步IO版的)。

所以可能是你系统的什么配置导致了处理性能的低下。。。。

glaciall commented 5 years ago

对了,你说你的CPU达到了90%,而不是说1500%,我估计着,你现在应该是使用的WSL进行的推流,WSL在IO上性能较原生的差了上百倍,你还是换成物理机或是虚拟机来进行并发推流的性能测试,WSL只应用于测试调试阶段,不应该用于生产环境。。。。

zhongren commented 5 years ago

谢谢回复,cpu占用的问题顺利解决了 现在还有一个问题 就是purge这个方法里面 Process.destroy()之后 boolean exited = process.waitFor(30, TimeUnit.SECONDS); 好像process关闭不了,jdk用的是1.8的 .我kill-9 项目之后, image 推流的进程好像还在

glaciall commented 5 years ago

直接强杀主进程,子进程会成为僵尸进程的,top的时候看一眼,有几个zombie呢,VideoServerApp的第34行,注册了kill信号处理器,你杀进程的时候,别使用kill -9 {PID},应该直接kill {PID}或是kill -TERM {PID},这将让应用程序比较和谐的退出,但是我在VideoServerApp的shutdown方法里,没有加上PublisherManager的进程清理工作,你可以先看一眼。

另外,你是怎么解决CPU占用的问题的????

glaciall commented 5 years ago

@zhongren 我刚刚提交了一些代码,用于和谐退出时,清理ffmpeg子进程的,你可以瞅一下。

zhongren commented 5 years ago

cpu的占用是我这边整合进公司框架的时候出了问题, T-T,我们这边自己的问题

glaciall commented 5 years ago

呃。。。。