github.com/kaydxh/golang@v0.0.131/go/syscall/rlimit.go (about)

     1  /*
     2   *Copyright (c) 2022, kaydxh
     3   *
     4   *Permission is hereby granted, free of charge, to any person obtaining a copy
     5   *of this software and associated documentation files (the "Software"), to deal
     6   *in the Software without restriction, including without limitation the rights
     7   *to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     8   *copies of the Software, and to permit persons to whom the Software is
     9   *furnished to do so, subject to the following conditions:
    10   *
    11   *The above copyright notice and this permission notice shall be included in all
    12   *copies or substantial portions of the Software.
    13   *
    14   *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    15   *IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    16   *FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    17   *AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    18   *LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    19   *OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    20   *SOFTWARE.
    21   */
    22  package syscall
    23  
    24  import (
    25  	"fmt"
    26  	"syscall"
    27  
    28  	"golang.org/x/sys/unix"
    29  )
    30  
    31  // SetNumFiles sets the linux rlimit for the maximum open files.
    32  func SetNumFiles(maxOpenFiles uint64) error {
    33  	return unix.Setrlimit(unix.RLIMIT_NOFILE, &unix.Rlimit{Max: maxOpenFiles, Cur: maxOpenFiles})
    34  }
    35  
    36  func GetNumFiles() (uint64, uint64, error) {
    37  	var (
    38  		rlimit unix.Rlimit
    39  		zero   unix.Rlimit
    40  	)
    41  
    42  	err := unix.Getrlimit(syscall.RLIMIT_NOFILE, &rlimit)
    43  	if err != nil {
    44  		return 0, 0, err
    45  	}
    46  	if rlimit == zero {
    47  		return 0, 0, fmt.Errorf("failed to get rlimit, got zero value: %#v", rlimit)
    48  	}
    49  
    50  	return rlimit.Cur, rlimit.Max, nil
    51  }
    52  
    53  func SetMaxNumFiles() (uint64, error) {
    54  
    55  	_, maxOpenFiles, err := GetNumFiles()
    56  	if err != nil {
    57  		return 0, err
    58  	}
    59  
    60  	err = SetNumFiles(maxOpenFiles)
    61  	if err != nil {
    62  		return 0, err
    63  	}
    64  
    65  	newCurOpenFiles, _, err := GetNumFiles()
    66  	if err != nil {
    67  		return 0, err
    68  	}
    69  	if newCurOpenFiles != maxOpenFiles {
    70  		return 0, fmt.Errorf("failed to set %d files, current open %v files", maxOpenFiles, newCurOpenFiles)
    71  
    72  	}
    73  
    74  	return newCurOpenFiles, nil
    75  }