说明:
这篇是网上看到的有关修改max user processes limits,觉得还可以,就保留了下来!稍微加了点东西
具体:
最近新上了一批服务器,内核升级到了2.6.32版本,部署完MySQL实例后上到线上,直接负载冲到15,cpu使用达到700%。
01:20:01 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 03:50:01 PM 34 1506 22.95 18.11 11.78 01:20:01 PM CPU %user %nice %system %iowait %steal %idle 03:50:01 PM all 95.13 0.00 3.31 0.06 0.00 1.49
当时就有点蒙,io并不是瓶颈,业务也米有变更,线上的服务器都运行正常,为什么这台新机器就变成这个模样了呢?
最后才发现又是一个ulimit的坑啊,之前对于ulimit -n已经碰了多次头,这次又差点碰的头破血流,万幸灰度上了1台slave,并没有影响到线上。
这次碰到的问题是ulimit -u,这个-u是做什么用的呢?
core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 514875 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 204800 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 204800 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
可以从上面看出,用来限制max user processes的数量的。
但是这个user processes是什么呢?
Linux itself has a Max Processes per user limit. This feature allows us to control the number of processes an existing user on the server may be authorized to have
这个ulimit -u是用来限制每个用户的最大processes数量。如果ulimit -u进行了限制那么每个linux用户可以派生出来的process就会被限制再这个数值之内。
那么这个限制和MySQL有什么关系呢,我们看如下的测试。
测试:
首先,在一台服务器上启两个MySQL实例,分别限制max connetcionts=1024 , ulimit -u=1024
然后,在一台服务器上运行类似下面的脚本
for i in `seq 1 2010` do echo $i mysqlha_login.sh -h 10.77.7.56 -P 3306 -e'system sleep 60;' & mysqlha_login.sh -h 10.77.7.56 -P 3307 -e'system sleep 60;' & done
当i的数值超过1009的时候就会出现如下报错
Can’t create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug
这就是无法再创建出新的process了。
如果我们将ulimit -u改为10240,再进行一次测试呢?
User myadmin already has more than ‘max_user_connections’ active connections
报错就变更为我们常见的超过最大连接数的报错了。
so,对于提供长链接的MySQL服务,建议都讲这个值调整为10240或者更大。对于提供短链接的服务,暂时并没有出现本次发现的错误。
修改:
不同内核参数的默认值也是不同的,请注意。
2.6.18 ore file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 139264 max locked memory (kbytes, -l) 32 max memory size (kbytes, -m) unlimited open files (-n) 288000 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
2.6.32 core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 514875 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 204800 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 1024 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
然后,一般来说,修改ulimit的数值,只需要修改/etc/security/limits.conf即可,但是这个参数需要修改/etc/security/limits.d/90-nproc.conf。
至于为什么需要修改这里,请看褚霸的这篇blog:
但是,还有一个问题,这个参数需要在mysqld启动之前调整,如果mysqld已经启动,再动态调整是无效的。(大家都知道stop start mysql是一件比较麻烦的事情,涉及线上业务就更麻烦了)
那么,有没有可以动态调整的方法呢?
echo -n ‘Max processes=SOFT_LIMITS:HARD_LIMITS’ > /proc/`pidof mysqld`/limits
通过如上命令就可以动态调整已经存在的mysqld的processes限制了。
附录:
附录1:centos 6.*可以修改/etc/security/limits.d/90-nproc.conf
但,centos 5.*并没有90-nproc.conf这个文件,我这边是通过修改/etc/security/limits.conf,在最后添加
* soft nproc 65535
* hard nproc 65535
来实现的