我们正在管理大约100台服务器(Ubuntu 16)。XX - 20.XX),并且每个服务器上都运行着许多进程。这些过程是非常繁重的网络,并通过互联网打开了大量的外部连接以及彼此之间的连接。Linux为每个连接分配一个文件描述符。这些连接中的每一个都产生一个线程,据我所知,它还为线程分配了一个文件描述符。每台服务器通常有3000个连接,每个连接有一个线程。所以我们空闲大约6000个打开的文件描述符,这远远超过了Linux默认的1024个限制。
我们已经尝试了多种方法来提高这个极限,但没有一种方法真正有效。这是非常不可预测的,经常会莫名其妙地改回1024。我们已经在/etc/security/limits.conf文件中添加了条目,我们甚至编写了代码,在这些进程中运行shell命令,使用ulimit命令每5分钟设置一次限制。但它仍然会时不时地默认为1024。我们因此失去了客户,财务影响变得相当严重!
这是/etc/security/limits.conf文件
root soft nofile 327680
root hard nofile 655360
root soft nproc 327680
root hard nproc 655360
mysql soft nofile 327680
mysql hard nofile 655360
mysql soft nproc 327680
mysql hard nproc 655360
所有这些进程都以root身份运行(我知道这不是最安全的方式,但目前有很多原因)。
启动时,我们在/etc/rc.local/
中添加了这个命令ulimit -n 655360
然后我们以5分钟的间隔在进程内部运行相同的命令。但是我们有时还是会遇到文件限制错误。
所以问题是:有没有一种方法可以完全禁用Linux中的限制机制?即使我们故意破坏它,让它失效。我们可以删除一些文件,这样它就不能运行了。也许可以设置某些文件的权限来阻止它启动等等。我们等待着任何硬核黑客来阻止并破坏这个东西。这已经成为一个大问题了。
要禁用限制(以前从未这样做过),可以在PAM模块和注释行中搜索:
session required pam_limits.so
可以使用命令
设置无限值ulimit -u unlimited
或在/etc/security/limits.conf
中添加如下行:
root soft core unlimited
root hard core unlimited
root soft data unlimited
root hard data unlimited
root soft fsize unlimited
root hard fsize unlimited
...