近期公司上需要一个rtsp-server来进行视频的代理,经过自己的寻找,发现了github上rtsp-simple-server 匹配需求,不重复造轮子的原则,使用此sever。但是发现当运行半天之后,就会报错 too many open files ,于是开始排查定位问题。
首先,当然是度娘,就是增加open files 的数量和我们运维发我的一个思路:
echo "root soft nofile 102400" >> /etc/security/limits.conf
echo "root hard nofile 102400" >> /etc/security/limits.conf
echo "root soft nproc 102400" >> /etc/security/limits.conf
echo "root hard nproc 102400" >> /etc/security/limits.conf
echo "* soft nofile 102400" >> /etc/security/limits.conf
echo "* hard nofile 102400" >> /etc/security/limits.conf
echo "* soft nproc 102400" >> /etc/security/limits.conf
echo "* hard nproc 102400" >> /etc/security/limits.conf
echo "net.ipv4.tcp_fin_timeout = 2" >> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_keepalive_time = 600" >> /etc/sysctl.conf
echo "net.ipv4.tcp_timestamps = 1" >> /etc/sysctl.conf
echo "fs.file-max=6815744" >> /etc/sysctl.conf
echo "kernel.shmall=2147483648" >> /etc/sysctl.conf
echo "kernel.shmmax=68719476736" >> /etc/sysctl.conf
echo "kernel.shmmni=4096" >> /etc/sysctl.conf
echo "kernel.sem=250 32000 100 128" >> /etc/sysctl.conf
echo "net.core.rmem_default=262144" >> /etc/sysctl.conf
echo "net.core.wmem_default=262144" >> /etc/sysctl.conf
echo "net.core.wmem_max=1048586" >> /etc/sysctl.conf
echo "net.core.rmem_max = 4194304" >> /etc/sysctl.conf
sysctl -p
直接执行这个就可以修改了
注:记得使用 ulimit -a 查看一下
排查问题
- 服务器层面看句柄数量是否正确,以及具体句柄是什么,使用的命令
lsof|awk '{print $2}'|sort|uniq -c|sort -nr|more
统计打开文件数量 和进程pid,发现好家伙150w+个,当时我配置的最大的文件数量也就是2048,也不明白为什么会超过这个数量?
- 使用查一下这个进程下打开的文件都是什么和数量
lsof -p 进程id
lsof -p 进程id |wc -l
6w+ ,并且都是sock 连接,都是几天之前的,说明这些连接一直都没有释放,大概明白是socket 连接数很多,且没有释放导致,当时是使用的udp协议进行连接,但是和上面的数量上差的也有点多。那看来是 lsof 和lsof -p 是有区别的,百度一下:
linux lsof加-p和不加-p的区别(第一次用就被坑难受)_Waria的博客-CSDN博客_lsof 鈥損
也就是说 进程持有资源,线程基本不持有资源,共享进程所持有的资源,打开的文件 属于 线程共享
lsof 统计的是进程占用的资源*线程数,lsof -p pid 统计的是进程上的句柄数
- 日志查看,vim 打开日志文件,查找报 too many open files 的位置,识别每个日志的输出点,统计可能导致问的原因,发现有一个500内部错误,这个是视频源服务报的错误,也是意料之外的。是不是它导致的呢?
结果
我单独让它报错,发现句柄的数量急剧增加,那就是它的问题了,不报500就很稳定。后续是我们在业务上没有太符合视频流的规范,他们的地址是变动的,我们使用了之前的地址,然后会500。我们写个程序定时去替换这个地址就好了。但是我个人觉得他们不应该返回错误提示,而不应该是 500 可能是使用的rtsp协议,只能返回视频流,他们无法处理吧。
后续
- 虽然问题找到了,这个项目 但是为什么在源视频流服务500的时候会增加连接数
- 项目为什么每个线程都会去增加这个连接数? socket 长连接?
总结
- 遇到问题,要按照正确的思路去排查,多看多查,思路要多多总结。
- 技术和业务综合考虑去处理问题
- 增加自身对技术的理解和处理能力,尝试看下那个源码,解决后续的项目问题。
网友评论