Как увеличить лимиты открытых файлов(сокетов) для go программы?
В логе go валятся такие ошибки
2017/03/08 08:11:11 http: Accept error: accept tcp [::]:9001: accept4: too many open files; retrying in 5ms
2017/03/08 08:11:11 http: Accept error: accept tcp [::]:9001: accept4: too many open files; retrying in 10ms
Собственно в limits.conf
* soft nproc 200000
* hard nproc 200000
* soft nofile 200000
* hard nofile 200000
ulimit -n
200000
в sysctl.conf
fs.file-max = 99999999
но когда смотрю лимиты на сам ап почему то там 1024 софт и 4048 хард
cat /proc/26602/limits
Limit Soft Limit Hard Limit Units
Max open files 1024 4096 files
Объясните мне пожалуйста, как от роста нагрузки растет количество открытых файловых дескрипторов.
Эта вещь неподвластная времени. Хоть в 1970, хоть в 2017, хоть в 2050 году так будет: дескрипторы открывают только для сокетов (которые множатся штучно) либо для работы с какими-то реальными файлами, которых тоже миллиарды быть не может.
Не всегда. Допустим в .Net Framework есть лимит на одновременно открытые соединения для сокета. И это значение равно 1000. При этом сервер вообще не загружен. Каждый запрос занимает от 1 до 100мс. Но из за этого лимита throughput очень маленький получается. Причем этот же лимит есть для nginx под виндой.
AigizK: да, но два сокета то не создать. Точнее создать можно что угодно - рандомно на разные сокеты обращаться, но каждый сокет будет обслуживать такой лимит. То есть при жесточайшей нагрузке сокетов будет очень много - 10 или 20 штук. Но речь не идет о сотнях или тысячах. Сотня сокетов - это несколько триллионов запросов в секунду уже будет. Такие запросы обслуживает уже не один сервер, а целые кластеры.
Пума Тайланд: но сокетов то только один на сервер. Можно смело ставить лимит = 2. Больше уже не будет.
Ну всмысле один сокет на один демон на один сервер (будь то UNIX-socket или TCP-socket).