博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Max user processes limits
阅读量:6815 次
发布时间:2019-06-26

本文共 4017 字,大约阅读时间需要 13 分钟。

最近新上了一批服务器,内核升级到了2.6.32版本,部署完MySQL实例后上到线上,直接负载冲到15,cpu使用达到700%。

01:20:01 PM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-1503:50:01 PM        34      1506     22.95     18.11     11.7801:20:01 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle03: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) 0data seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 514875max locked memory       (kbytes, -l) 64max memory size         (kbytes, -m) unlimitedopen files                      (-n) 204800pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 10240cpu time               (seconds, -t) unlimitedmax user processes              (-u) 204800virtual memory          (kbytes, -v) unlimitedfile 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.18ore file size          (blocks, -c) 0data seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 139264max locked memory       (kbytes, -l) 32max memory size         (kbytes, -m) unlimitedopen files                      (-n) 288000pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 10240cpu time               (seconds, -t) unlimitedmax user processes              (-u) unlimitedvirtual memory          (kbytes, -v) unlimitedfile locks                      (-x) unlimited2.6.32core file size          (blocks, -c) 0data seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 514875max locked memory       (kbytes, -l) 64max memory size         (kbytes, -m) unlimitedopen files                      (-n) 204800pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 10240cpu time               (seconds, -t) unlimitedmax user processes              (-u) 1024virtual memory          (kbytes, -v) unlimitedfile 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限制了。

 

参考阅读:

转载于:https://www.cnblogs.com/billyxp/archive/2013/04/03/2998079.html

你可能感兴趣的文章
【Swift】iOS UICollectionView 计算 Cell 大小的陷阱
查看>>
为什么我刚发表的文章变成了“待审核”,csdn有没有官方解释啊
查看>>
Android多线程源码详解一:handler、looper、message、messageQueue
查看>>
SaaS加速器II 能力中心:互利互补 共享商业红利
查看>>
病毒木马防御与分析实战
查看>>
分布式工作流任务调度系统Easy Scheduler正式开源
查看>>
Flutter实战(一)写一个天气查询的APP
查看>>
Python零基础学习笔记(十二)—— 字符串及其常用方法
查看>>
Webpack 和 Gulp 构建伪命令行项目
查看>>
在线面试, 前端, 提纲, 草稿
查看>>
hive_异常_01_ Terminal initialization failed; falling back to unsupported
查看>>
分布式事务键值数据库 TiKV 加入 CNCF 沙箱孵化器
查看>>
Vue - day1
查看>>
kvm.virsh常用命令篇
查看>>
[Hive]Hive使用指南四 客户端导入数据
查看>>
10.JUC线程高级-线程八锁
查看>>
Apache Flink轻量级异步快照机制源码分析
查看>>
PostgreSQL 11 preview - 分区表 增强 汇总
查看>>
MediaCodec在Android视频硬解码组件的应用
查看>>
用JAVA自己画一张二维码
查看>>