今天在学习mysql时,看到一个案例,大体来说,就是客户端报Too many connections。但是,客户端的连接池,限制为了200,两个客户端java进程,那也才400,然后mysql配置了800的连接。
mysql是在my.cnf中配置了:
[root@localhost CAD_OneKeyDeploy]# vim /etc/my.cnf [mysqld] datadir = /var/lib/mysql socket = /var/lib/mysql/mysql.sock max_connections=800 symbolic-links = 0这个不应该吧,我最多建立400个连接,数据库设置了最大连接为800,结果就报:Too many connections。
然后在mysql上执行:
SHOW VARIABLES LIKE 'max_connections'发现结果是200左右,说明设置了没生效啊。
结果在mysql的启动日志:
Could not increase number of max_open_files to more than mysqld (request: 65535) Changed limits: max_connections: 214 (requested 2000)然后案例中的博主就去修改了:
ulimit -HSn 65535 vim /etc/security/limits.conf我跟着操作了一把,结果,发现并不是那么回事。
也就是说,我照着做了,没生效,那,到底怎么回事?
这里,我总结了一些资料,大家先看看,然后最后我会说明,怎么去正确设置一个进程的最大文件数量。
进程的最大文件数量,受到多方面影响:
登录shell后,手动启动的进程影响因素包括:
操作系统整体的、所有进程可以打开的文件数量总和(由/proc/sys/fs/file-max控制);
该shell用户,可以打开的最大文件数量(由 /etc/security/limits.conf控制);
进程本身的最大文件数量限制(可以通过os提高的api控制,如setrlimit)
开机自动启动的进程影响因素包括:
操作系统整体的、所有进程可以打开的文件数量总和(由/proc/sys/fs/file-max控制);
如果由systemd方式启动,则systemd的service文件中可以进行限制。
受知识所限,目前知道的就上面这些,shell据我所知,还分log和no-log shell,不是很懂,先跳过。
查看某个已运行进程的资源限制在经过一番修改后,想知道修改是否生效时,可以通过如下方式:
先把进程运行起来,查看其最终生效的资源限制的办法,就是如下:
[root@localhost ~]# cat /proc/6660/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 3795 3795 processes -----------------------------如下 Max open files 5000 5000 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 3795 3795 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us os级别,如何查看与设置查看可通过如下命令:
[root@localhost ~]# cat /proc/sys/fs/file-max 95086这里其实就是查看了/proc下的某个文件,那么这个文件的意思是啥呢?查看帮助:
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 in the kernel log about running out of file handles (look for "VFS: file-max limit <number> reached"), try increasing this value: echo 100000 > /proc/sys/fs/file-max The kernel constant NR_OPEN imposes an upper limit on the value that may be placed in file-max. If you increase /proc/sys/fs/file-max, be sure to increase /proc/sys/fs/inode-max to 3-4 times the new value of /proc/sys/fs/file-max, or you will run out of inodes. Privileged processes (CAP_SYS_ADMIN) can override the file-max limit.简单翻译下,该文件定义了一个操作系统级别的,最大可以打开的文件数量限制(针对所有进程加起来)。
针对一个进程,去设置针对每个进程的最大可打开文件数量的限制,可以查看setrlimit中的RLIMIT_NOFILE。
如果要修改,则:
echo 100000 > /proc/sys/fs/file-max修改后,重启os生效。
coding时,调用api进行资源限制可通过man查看:
man setrlimit GETRLIMIT(2) Linux Programmer's Manual GETRLIMIT(2) NAME getrlimit, setrlimit, prlimit - get/set resource limits SYNOPSIS #include <sys/time.h> #include <sys/resource.h> int getrlimit(int resource, struct rlimit *rlim); int setrlimit(int resource, const struct rlimit *rlim); The getrlimit() and setrlimit() system calls get and set resource limits respectively. Each resource has an associated soft and hard limit, as defined by the rlimit structure: struct rlimit { rlim_t rlim_cur; /* Soft limit */ rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */ };