@korsamc

Как изменить лимит открытых файлов в Ubuntu 18.04?

При тестирование своего приложения у меня появляется ошибка такого вида
Горутина отработала за 3.213085ms
open /dev/null: too many open files
Горутина отработала за 3.258772ms
open /dev/null: too many open files
Горутина отработала за 3.196158ms
open ./flowscript.sh: too many open files
open ./flowscript.sh: too many open files
open /dev/null: too many open files
Горутина отработала за 3.570144ms

Нашёл информацию, что необходимо изменить лимит открытых файлов в ОС пробовал по разному.
sudo sh -c "ulimit -Hn 500000 ; exec su \"$USER\""
 vi /etc/sysctl.conf
fs.file-max = 500000
# vi /etc/security/limits.conf
* soft nofile 60000
* hard nofile 60000

Но все равно выходит данная ошибка.
Вот сам код, который я вызываю
func exec_cmd(cmd string,nfFile string,wg *sync.WaitGroup,f func ()string,args ...string){

	t0 := time.Now()

	os.Mkdir("tmp",os.ModePerm)

	file, err := os.Create(bash_script);utils.Checkerr(err)
	defer file.Close()

	file.WriteString(binbash + "\n")
	file.WriteString(cmd)

	err = os.Chmod(bash_script,0777);utils.Checkerr(err)
	
	bashscript := exec.Command("bash",bash_script,nfFile,args[0],args[1],f());utils.Checkerr(err)
	err = bashscript.Run();utils.Checkerr(err)
	t1 := time.Now()
	fmt.Printf("Горутина отработала за %v\n", t1.Sub(t0))

	wg.Done()

}
func main(){

	t0 := time.Now()

	var path 		= flag.String("p", "","Path to directory (including month)")
	var filter 		= flag.String("f", "","Access list filename. Defaults to flow.acl.")
	var nf 			= flag.String("nf","","Select the active definition. Defaults to default")
	//var staticFile 	= flag.String("w", "","Write statistics to file")


	flag.Parse();
	flag.Usage = Usage

	if len(os.Args) == 1 {
		Usage()
		os.Exit(1)
	}

	name := TempFileName() // имена временных файлов

	var wg sync.WaitGroup
	NetflowFileNames := getAbsolutePathToFileNetflow(*path) // имена файлов за вчерашний день
	wg.Add(len(NetflowFileNames)) // 288
	for _, filename := range NetflowFileNames{
		go exec_cmd(cmdCommand,filename,&wg,name,*filter,*nf)

	}
	wg.Wait()
	os.RemoveAll(bash_script)
	t1 := time.Now()
	fmt.Printf("Время работы программы: %v\n", t1.Sub(t0))

}

и тут у меня возникает вопрос, что лучше использовать горутины с каналами или же тип sync.WaitGroup
  • Вопрос задан
  • 648 просмотров
Пригласить эксперта
Ответы на вопрос 2
@PapaStifflera
Родился, вырос...
Используйте канал-семафор для контроля количества запущенных горутин.
Ответ написан
Комментировать
ivankomolin
@ivankomolin
Чтобы работало после перезагрузки поменять можно тут: /etc/security/limits.conf
Учтите что начинает действовать только в следующем сеансе работы

Но начинать нужно не с этого)
1. Необходимо определиться сколько вам нужно открытых дескрипторов.
Команда которая покажет сколько открыл определенный процесс:
lsof -p 9189 | wc -l

2. Ответьте честно, действительно ли столько нужно? Или можно что-то оптимизировать в коде?
3. Если все таки нужно, то да, меняйте в /etc/security/limits.conf hard и soft
4. Перезагрузитесь или перезапустите сеанс, если не помогло см. п. 1
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы