在现场 EasyCVR/EasyGBS 使用过程中,在接入大量设备后,程序运转会显现 too many open files。于是咱们在 shell 中运转 ulimit –n 10240,可以成功,但是以服务运转,依然是 too many open files。因而对 Linux 的 ulimit 进行针对性研讨,处理该问题。
一、ulimit 指令
ulimit 用于 shell 发动进程所占用的资源。
检查体系约束数量 ulimit –n
检查体系显现数量(更具体) ulimit –a
设置体系显现数量 ulimit –n 1024 设置 open files 1024
检查 2056 进程的约束 cat /proc/2056/limits
检查某个进程翻开的文件数 lsof -p 2056 | wc –l
lsof -e /run/user/1000/gvfs -p 2056 | wc –l
检查进程翻开的文件信息
lsof -c easydss
lsof |wc -l
cat /proc/15386/limits 1024-4096 go
大局设置 ulimit 数据
二、Soft Limit 和 Hard Limit 的差异
ulimit –n 默认检查的是软约束
ulimit –Hn 检查的是硬约束
ulimit –Sn 检查的是软约束
ulimit -n 的最大值是 $((2**20))
也就是最大 1048576 多加个 1 都会报错
nofile 的 hard 肯定不允许超越 1048576,soft 随意,大不了最大1048576
三、服务和进程 ulimit 的差异
默认的软约束为 1024,硬约束为 4096
首要设置 ulimit –n 3000
以进程运转程序 ./tsingsee, 终究检查进程占用的 ulimit
进程为 5210
cat /proc/5210/limits
进程的最大连接数现已增加,为 3000
修改以服务运转,检查对应的 ulimit,依然未 1024 4096
为什么以服务运转,ulimit 约束依然为默认值?持续探索。
运转 cat /proc/5673/status 检查进程的状况,发现父进程的 pid 为 1:
检查对应的父进程为 systemd
以进程运转,pid为6943,检查对应的 6943 的父进程为 4286,检查 4286 的进程
结论:
服务的 ulimit 约束和进程的 ulimit 约束不是同一个地方设置的。
ulimit –n 1000 是暂时设置 shell 的大小,网上的设置 /etc/security/limits.conf 中的 ulimit 大小,也是不会设置到服务程序中。
四、怎么设置服务的 ulimit
CentOS 的服务是 systemd 程序发动的,其他操作体系是以别的的程序发动的。针对 CentOS 的装备如下:
有的操作体系是以 SysVinit 的方法发动服务的,对应的 ulimit 设置不同,需求针对性的探索。
以内核作为示范。首要内核安装的服务名为 TsingseeMediaServer
在 CentOS 为例,首要进入服务路径 /etc/system/system
里边会有一个 TsingseeMediaServer.service
vi TsingseeMediaServer.service
在 Service 选项添加一个一行
LimitNOFILE=5000
检查原始进程对应的 ulimit 约束
cat /proc/4043/limits
现在是 4000 个 ulimit。运转以下指令,让 5000 生效
systemctl daemon-reload
重启 tsingsee 服务,检查对应的进程的 ulimit
以上设置成功后,不会再出现 ulimit 的约束。