在EasyDSS、EasyGBS、EasyCVR和EasyNVR等产品中,如果部署在Linux系统下,当接入设备过多时,由于操作系统对于打开文件数有一定限制,会出现程序报错的现象,出现 “open too many files”错误。这个错误我们之前也介绍过一些解决方法,但是鉴于很多用户都有类似情况,我们还是决定对代码进行研修,消除此类报错。
这里我们需要手动修改操作系统的配置,然后重启操作系统使操作设置正确。但是手动操作比较麻烦,因此直接使用代码实现该功能。代码如下:
// Package base Copyright 2021 TSINGSEE.
// http://www.tsingsee.com
// ulimit 服务限制
// Creat By Sam
// History (Name, Time, Desc)
// (Sam, 20211202, 创建文件)
package main
import (
"bufio"
"bytes"
"errors"
"fmt"
"io"
"io/ioutil"
"os/exec"
"runtime"
"strings"
)
var ErrOsNotSupport = errors.New("OS not support, only linux can use this function")
func main() {
fmt.Println("修改 ulimit 配置", ModifyServiceUlimit(1000000))
fmt.Println("设置 ulimit 有效", SystemdConfEffect())
}
// 修改服务的 ulimit
func ModifyServiceUlimit(ulimit int) error {
if runtime.GOOS != "linux" {
return ErrOsNotSupport
}
//confFile := "C:\\Users\\sam\\Desktop\\going\\system.conf"
confFile := "/etc/systemd/system.conf"
readBytes, err := ioutil.ReadFile(confFile)
if err != nil {
return err
}
oriContent := string(readBytes)
strReader := strings.NewReader(oriContent)
br := bufio.NewReader(strReader)
newLine := fmt.Sprintf("DefaultLimitNOFILE=%d\n", ulimit)
findNofile := false
var buffer bytes.Buffer
for {
l, e := br.ReadBytes('\n')
if e == io.EOF {
break
}
line := string(l)
if strings.Contains(line, "DefaultLimitNOFILE") {
line = newLine
findNofile = true
}
buffer.WriteString(line)
}
// 如果未找到,则写入 newLine
if !findNofile {
buffer.WriteString(newLine)
}
//fmt.Println(buffer.String())
ioutil.WriteFile(confFile, buffer.Bytes(), 666)
return nil
}
// systemctl daemon-reexec
// 重启 systemd 配置,使 conf 生效
func SystemdConfEffect() error {
if runtime.GOOS != "linux" {
return ErrOsNotSupport
}
cmd := exec.Command("systemctl", "daemon-reexec")
return cmd.Run()
}
复制代码
运行以上代码,将对应的打开文件限制修改为1000000。重启运行的服务,查看对应服务的打开文件数为1000000即可,如下:
作者:TSINGSEE
链接:https://juejin.cn/post/7041494791175012382/
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。