问题说明:
1) 在Linux中查看日志时,发现有Can’t open so many files信息。应该是虚拟机打开文件数或者sockets数太多了。在Linux下,我们使用ulimit -n命令可以看到单个进程能够打开的最大文件句柄数量(socket连接也算在里面)。系统默认值1024。对于一般的应用来说(象Apache、系统进程)1024完全足够使用。但是如何象Java等单进程处理大量请求的应用来说就有点捉襟见肘了。如果单个进程打开的文件句柄数量超过了系统定义的值,就会提到“too many files open”的错误提示。
2) mysql报错:[ERROR] Error in accept: Two many open files
1 Linux下查看及修改进程打开的文件句柄数量
- # ulimit -n
- 1024
---- 查看Linux系统默认的最大文件句柄数详细说明
- # ulimit -a
-
- core file size (blocks, -c) 0
- data seg size (kbytes, -d) unlimited
- scheduling priority (-e) 30
- file size (blocks, -f) unlimited
- pending signals (-i) 30605
- max locked memory (kbytes, -l) 40000
- max memory size (kbytes, -m) unlimited
- open files (-n) 1024
- pipe size (512 bytes, -p) 8
- POSIX message queues (bytes, -q) 819200
- real-time priority (-r) 65
- stack size (kbytes, -s) 8192
- cpu time (seconds, -t) unlimited
- max user processes (-u) 30605
- virtual memory (kbytes, -v) unlimited
- file locks (-x) unlimited
---- 查看Linux系统所有进程情况
- # top
---- 查看Linux系统某个应用的进程PID
- # ps aux| grep mysql
---- 查看Linux系统某个进程打开的文件句柄数量
- # lsof -n | grep 5950 -c
- 212
---- 查看Linux系统所有进程以及各进程打开的文件句柄数量
- # lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr
- 212 131133
--- 得到进程号后,查看该进程对应的详细应用内容
- # ps -ef|grep 131133
-
2 Linux下修改linux服务器的文件句柄数量
修改Linux系统的最大文件句柄数限制的方法:
1) 针对当前session有效,用户退出或者系统重新后恢复默认值
- # ulimit -n 65535
-
2) 只对单个用户有效; 修改 pro
- # ulimit -n 65535
-
3) 永久生效法:针对单个进程最大文件句柄数:
修改文件:/etc/security/limits.conf,在文件中添加:(立即生效-当前session中运行ulimit -a命令无法显示);修改以后保存,注销当前用户,重新登录,执行ulimit -a ,ok ,参数生效了:
- * soft nofile 32768 #限制单个进程最大文件句柄数(到达此限制时系统报警)
- * hard nofile 65536 #限制单个进程最大文件句柄数(到达此限制时系统报错)
- fs.file-max=655350 #限制整个系统最大文件句柄数
- * cat limits.conf
- * soft core 102400
* hard core 102400
* hard nofile 10000
* soft nofile 10000
* hard nproc 10000
* soft nproc 10000
- 最后系统使用这个
# End of file
* - nofile 102400
* - nproc 102400
soft / hard:这个当中的硬限制是实际的限制,而软限制,是warnning限制,只会做出warning.
nofile 代表max number of opened file,
10000:代表最大打开句柄数
3 MySQL 报“too many open files”异常问题分析
我先将手册里面的原话贴出来:
MySQL is multi-threaded, so there may be many clients issuing queries for a given table simultaneously. To minimize the problem with multiple client sessions having different states on the same table, the table is opened independently by each concurrent session. This uses additional memory but normally increases performance. WithMyISAMtables, one extra file descriptor is required for the data file for each client that has the table open. (By contrast, the index file descriptor is shared
between all sessions.)
好了,那你现在应该明白了,为什么并没有同时打开那么文件,但是却有那么多的文件描述符。弄清楚问题,那么现在就来解决这个问题。首先是增大 open_files_limit ,具体用法参考手册上说明,然后根本解决方法是在os上增大mysqld这个线程的最大开打文件数,在linux里面可以通过编辑文件 /etc/security/limits.conf。
a. echo n > /proc/sys/fs/file-max
b. vi /etc/sysctl.conf 然后添加一行 fs.file-max=n 然后使用sysctl -p使其生效
但有时候,我们遇到的不是two many open files 而是 two many connections,这个就是并发的连接数,通过修改参数mysql的max_connections来解决 网络上的讨论有很多,包括调整系统本身的
相关的设定有:
/proc/sys/fs/file-max
这是系统资源分配的最高档案数,设定值与内存大小有关,早期
ulimit -n
ulimit
my.cnf
table_cache: mysql 5.1.3
max_connections:
open_files_limit: mysqld
理论上
问题来了,那个函式怎么算的,一般说法是
仔细一看
换句话说,如果
结论就是,不管我们要将我们的
PS: