我们已经了解到想要解决用户出现“too many open files”的问题需要同时修改用户级参数文件limits.conf及系统级参数文件sysctl.conf,那么怎么修改才合理呢?怎么修改才能万无一失呢?文章开始我提到,在最初出现“too many open files”问题的时候,我们只是简单粗暴的在nofile默认值和fs.file-max默认值后面加一个零甚至几个零,为什么会出现有时能解决问题,有时又无济于事的情况呢?我根据日常维护经验总结出了参数值设置需要遵循的以下几个原则:
 1、根据limits.conf 中的soft nofile和hard nofile的定义:soft 指的是当前系统生效的设置值;hard 表明系统中所能设定的最大值,可以看出,soft nofile必须小于等于hard nofile值。
 2、用户级打开文件数参数nofile必须小于等于系统级打开文件数参数fs.file-max。目前X86平台linux默认nofile为5000,fs.file-max为4096,在我们简单粗暴的在nofile默认值后增加几个零,一旦nofile值大于fs.file-max值时,打开文件数仍然会以fs.file-max值为准,也就是4096,仍然小于应用程序所需要的打开文件数,这就合理解释了为什么已经扩大了nofile值却仍然无法解决“too many open files”的问题了。
 3、fs.file-max*4k必须小于内存(字节数)。看到这个公式也许你会有些头晕,那么我来拿4G内存来举个简单的例子。如一台虚拟机内存为4G(4*1024*1024字节),根据公式算出fs.file-max必须小于1024*1024,约100万。也就是说拿一台4G内存的虚拟机来说,fs.file-max值设置低于100万是基于硬件条件下合理的数值;如果设置超出了100万的值,那么相当于对系统打开文件数无限制,没有预警机制,当系统打开文件数超过100万个时,系统将会夯死。换句话说,如果在当前内存下允许的最大文件打开数还是无法符合应用程序要求的话,只能使用增加内存的方式来提高性能了。
 4、nofile最大值不可设置大于102万,大于102万的话会造成用户无法登陆。这个原则来自资深红帽系统工程师的口述,大家记住就好了。