TSINGSEE青犀视频编译中通过GoLang代码修改Linux服务的ulimit的实现

Posted TSINGSEE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TSINGSEE青犀视频编译中通过GoLang代码修改Linux服务的ulimit的实现相关的知识,希望对你有一定的参考价值。

在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青犀视频编译中通过GoLang代码修改Linux服务的ulimit的实现的主要内容,如果未能解决你的问题,请参考以下文章

TSINGSEE青犀视频开发中Go语言时间转换分享

技术教程在TSINGSEE青犀视频平台中如何使用GO调用dll文件?

TSINGSEE青犀视频行人检测对接景区票务系统请求数据库优化时间长问题

TSINGSEE青犀视频通过Webrtc编译android版本找不到gzip模块如何处理?

TSINGSEE青犀视频编译webrtc协议为什么需要turn服务器?

TSINGSEE青犀视频编译Winsock2 websocket服务端连接异常断开问题排查