zoukankan      html  css  js  c++  java
  • 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
    链接:https://juejin.cn/post/7041494791175012382/
    来源:稀土掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    IDEA 编译时 未结束的字符串文字
    JAVA文件下载,页面显示另存为效果
    no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
    【转】修改LINUX时间
    【转】tomcat7性能调优
    【转】Nginx中upstream有以下几种方式:
    【转】tomcat性能调优
    【转】Memcached安装
    【转】 linux下的g++编译器安装
    【转】nginx+tomcat+memcached (msm)实现 session同步复制
  • 原文地址:https://www.cnblogs.com/TSINGSEE/p/15693920.html
Copyright © 2011-2022 走看看