要知道,在linux的世界里,一切皆文件.因此要实现大的并发量的第一步,修改linux系统的文件标识符限制数,也就是文件打开数量的限制
首先,内核级的总限制 fs.file-max
man proc 里有这么一段话 /proc/sys/fs/file-max This file defines a system-wide limit on the number of open files for all processes. (See also setrlimit(2), which can be used by a process to set the per-process limit, RLIMIT_NOFILE, on the number of files it may open.) If you get lots of error messages about running out of file handles, try increasing this value: echo 100000 > /proc/sys/fs/file-max
#查看限制数 fs.file-max [root@web01]# sysctl fs.file-max fs.file-max = 65535 #修改限制数 [root@web01]# sysctl -w fs.file-max=6553500 fs.file-max = 6553500 需要永久生效则 echo "fs.file-max=6553500" >>/etc/sysctl.conf
/proc/sys/fs/file-nr 记录了系统中fd的使用情况,已分配文件句柄的数目
[root@web01]# sysctl fs.file-nr fs.file-nr = 960 0 6553500
其中第一个数表示当前系统已分配使用的打开文件描述符数,第二个数为分配后已释放的(目前已不再使用),第三个数等于file-max。
其次是用户级进程的打开文件数限制。执行:
#查看资源硬限制数 [root@web01]# ulimit -Hn 4096 #查看资源软限制数 [root@web01]# ulimit -Sn #或 ulimit -n 1024 #修改限制数 [root@web01]# ulimit -n 204800
通过ulimit -Sn设置最大打开文件描述符数的soft limit,注意soft limit不能大于hard limit(ulimit -Hn可查看hard limit),另外ulimit -n默认查看的是soft limit,但是 ulimit -n 204800 则会同时设置soft limit和hard limit。对于非root用户只能设置比原来小的hard limit
若要使修改永久有效,则需要在/etc/security/limits.conf中进行设置,可添加如下两行。
* soft nofile 65535
* hard nofile 65535
以上设置需要注销之后重新登录才能生效:
设置nofile的hard limit还有一点要注意的就是hard limit不能大于/proc/sys/fs/nr_open,假如hard limit大于nr_open,注销后无法正常登录。可以修改nr_open的值: echo 2000000 > /proc/sys/fs/nr_open
相关介绍:
ulimit -a 用来显示当前的各种用户进程限制。
Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数,下面我把某linux用户的最大进程数设为10000个:
ulimit -u 10000
对于需要做许多 socket 连接并使它们处于打开状态的Java 应用程序而言,最好通过使用 ulimit -n xx 修改每个进程可打开的文件数,缺省值是 1024。
ulimit -n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024
其他建议设置成无限制(unlimited)的一些重要设置是:
数据段长度:ulimit -d unlimited
最大内存大小:ulimit -m unlimited
堆栈大小:ulimit -s unlimited
CPU 时间:ulimit -t unlimited
虚拟内存:ulimit -v unlimited
公 司服务器需要调整 ulimit的stack size 参数调整为unlimited 无限,使用ulimit -s unlimited时只能在当时的shell见效,重开一个shell就失效了。。于是得在/etc/profile 的最后面添加ulimit -s unlimited 就可以了,source /etc/profile使修改文件生效。
如果你碰到类似的错误提示ulimit: max user processes: cannot modify limit: 不允许的操作 ulimit: open files: cannot modify limit: 不允许的操作
为啥root用户是可以的?普通用户又会遇到这样的问题?
看一下/etc/security/limits.conf大概就会明白。
linux对用户有默认的ulimit限制,而这个文件可以配置用户的硬配置和软配置,硬配置是个上限。
超出上限的修改就会出“不允许的操作”这样的错误。
在limits.conf加上
* soft noproc 10240
* hard noproc 10240
* soft nofile 10240
* hard nofile 10240
就是限制了任意用户的最大线程数和文件数为10240。
还有就是应用自身设定的限制
例如MySQL层的几个参数:open-files-limit、innodb-open-files、table-open-cache、table-definition-cache
1、open-files-limit
它限制了mysqld进程可持有的最大打开文件数,相当于是一个小区的总电闸,一旦超限,小区里所有住户都得停电。
5.6.7(含)以前,默认值0,最大和OS内核限制有关;
5.6.8(含)以后,默认值会自动计算,最大和OS内核限制有关。在5.6.8及以后,其自动计算的几个限制规则见下,哪个计算结果最大就以哪个为上限:
1) 10 + max_connections + (table_open_cache * 2) 2) max_connections * 5 3) open_files_limit value specified at startup, 5000 if none
2、innodb-open-files
限制InnoDB引擎中表空间文件最大打开的数量,相当于自己家中电箱里的某个电路保险,该电路短路的话,会自动跳闸,而不会影响其他电路,去掉短路源后重新按上去就可以使用。
其值最低20,默认400,只计算了包含ibdata*、ib_logfile*、*.ibd 等三类文件,redo log不计算在内,5.6以后可独立undo log,我还未进行测试,应该也不会被计算在内,有兴趣的朋友可验证下。
3、table-definition-cache
该cache用于缓存 .frm 文件,该选项也预示着 .frm 文件同时可打开最大数量。
5.6.7 以前默认值400;
5.6.7 之后是自动计算的,且最低为400,自动计算公式:400 + (table-open-cache / 2)。对InnoDB而言,该选项只是软性限制,如果超过限制了,则会根据LRU原则,把旧的条目删除,加入新的条目。
此外,innodb-open-files 也控制着最大可打开的表数量,和 table-definition-cache 都起到限制作用,以其中较大的为准。如果没配置限制,则通常选择 table-definition-cache 作为上限,因为它的默认值是 200,比较大。
4、table-open-cache
该cache用于缓存各种所有数据表文件描述符。
5.6.7 以前,默认值400,范围:1 – 524288;
5.6.8 – 5.6.11,默认值2000,范围:1 – 524288;
5.6.12以后,默认值2000(且能自动计算),范围:1 – 524288。
补充说明1:关于如何计算表文件描述符的建议:
table-open-cache 通常和 max-connections 有关系,建议设置为 max_connections * N,N的值为平均每个查询中可能总共会用到的表数量,同时也要兼顾可能会产生临时表。
补充说明2:MySQL会在下列几种情况把表从table cache中删掉:
1、table cache已满,并且正要打开一个新表时; 2、table cache中的条目数超过 table_open_cache 设定值,并且有某些表已经长时间未访问了; 3、执行刷新表操作时,例如执行 FLUSH TABLES,或者 mysqladmin flush-tables 或 mysqladmin refresh
补充说明3:MySQL采用下述方法来分配table cache:
1、当前没在用的表会被释放掉,从最近最少使用的表开始; 2、当要打开一个新表,当前的cache也满了且无法释放任何一个表时,table cache会临时加大, 临时加大的table cache中的表不用了之后,会被立刻释放掉。
转载整理自 http://imysql.com/2015/07/30/mysql-faq-howto-calculate-open-files.shtml
转载于:https://blog.51cto.com/itest/1736715