linux修改max user processes limits

说明:
这篇是网上看到的有关修改max user processes limits,以为还能够,就保留了下来!稍微加了点东西

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

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是作什么用的呢?linux

core file size          (blocks, -c) 0data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0file size               (blocks, -f) unlimited
pending signals                 (-i) 514875max locked memory       (kbytes, -l) 64max memory size         (kbytes, -m) unlimited
open files                      (-n) 204800pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 10240cpu time               (seconds, -t) unlimited
max user processes              (-u) 204800virtual 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
而后,在一台服务器上运行相似下面的脚本sql

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或者更大。对于提供短连接的服务,暂时并无出现本次发现的错误。

修改:
不一样内核参数的默认值也是不一样的,请注意。shell

2.6.18ore file size          (blocks, -c) 0data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0file size               (blocks, -f) unlimited
pending signals                 (-i) 139264max locked memory       (kbytes, -l) 32max memory size         (kbytes, -m) unlimited
open files                      (-n) 288000pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 10240cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimitedvirtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
2.6.32core file size          (blocks, -c) 0data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0file size               (blocks, -f) unlimited
pending signals                 (-i) 514875max locked memory       (kbytes, -l) 64max memory size         (kbytes, -m) unlimited
open files                      (-n) 204800pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 10240cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024virtual 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 65535centos



Linux对于每一个用户,系统限制其最大进程数。为提升性能,能够根据设备资源状况,设置各linux 用户的最大进程数bash

能够用ulimit -a 来显示当前的各类用户进程限制。
下面我把某linux用户的最大进程数设为10000个:
     ulimit -u 10240
     对于须要作许多 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 命令登陆 shell 会话期间。
     永久地,经过将一个相应的 ulimit 语句添加到由登陆 shell 读取的文件中, 即特定于 shell 的用户资源文件,如:服务器

1)、解除 Linux 系统的最大进程数和最大文件打开数限制:
        vi /etc/security/limits.conf
        # 添加以下的行
        * soft noproc 11000
        * hard noproc 11000
        * soft nofile 4100
        * hard nofile 4100
       说明:* 表明针对全部用户,noproc 是表明最大进程数,nofile 是表明最大文件打开数
2)、让 SSH 接受 Login 程式的登入,方便在 ssh 客户端查看 ulimit -a 资源限制:
        a、vi /etc/ssh/sshd_config
             把 UserLogin 的值改成 yes,并把 # 注释去掉
        b、重启 sshd 服务:
              /etc/init.d/sshd restart
3)、修改全部 linux 用户的环境变量文件:
    vi /etc/profile
    ulimit -u 10000
    ulimit -n 4096
    ulimit -d unlimited
    ulimit -m unlimited
    ulimit -s unlimited
    ulimit -t unlimited
    ulimit -v unlimitedsession

 保存后运行#source /etc/profile 使其生效并发

/**************************************ssh

有时候在程序里面须要打开多个文件,进行分析,系统通常默认数量是1024,(用ulimit -a能够看到)对于正常使用是够了,可是对于程序来说,就太少了。
修改2个文件。


1./etc/security/limits.conf
vi /etc/security/limits.conf
加上:
* soft nofile 8192
* hard nofile 20480


2./etc/pam.d/login
session required /lib/security/pam_limits.so
/**********
另外确保/etc/pam.d/system-auth文件有下面内容
session required /lib/security/$ISA/pam_limits.so
这一行确保系统会执行这个限制。


/***********
3.通常用户的.bash_profile
#ulimit -n 1024
从新登录ok
 

ulimit 的做用
  =======================
 
ulimit:显示(或设置)用户可使用的资源的限制(limit),这限制分为软限制(当前限制)和硬限制(上限),其中硬限制是软限制的上限值,应用程序在运行过程当中使用的系统资源不超过相应的软限制,任何的超越都致使进程的终止。


参数 描述
ulimited 不限制用户可使用的资源,但本设置对可打开的最大文件数(max open files)
和可同时运行的最大进程数(max user processes)无效
-a 列出全部当前资源极限
-c 设置core文件的最大值.单位:blocks
-d 设置一个进程的数据段的最大值.单位:kbytes
-f Shell 建立文件的文件大小的最大值,单位:blocks
-h 指定设置某个给定资源的硬极限。若是用户拥有 root 用户权限,能够增大硬极限。任何用户都可减小硬极限
-l 能够锁住的物理内存的最大值
-m 可使用的常驻内存的最大值,单位:kbytes
-n 每一个进程能够同时打开的最大文件数
-p 设置管道的最大值,单位为block,1block=512bytes
-s 指定堆栈的最大值:单位:kbytes
-S 指定为给定的资源设置软极限。软极限可增大到硬极限的值。若是 -H 和 -S 标志均未指定,极限适用于以上两者
-t 指定每一个进程所使用的秒数,单位:seconds
-u 能够运行的最大并发进程数
-v Shell可以使用的最大的虚拟内存,单位:kbytes
-x

范例1:

[root@localhost proc]# ulimit -a
core file size (blocks, -c) 100
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
pending signals (-i) 2047
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 2047
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[root@localhost proc]#

输出的每一行由资源名字、(单位,ulimit命令的参数)、软限制组成。详细解释:
参数 描述
core file size core文件的最大值为100 blocks,
data seg size 进程的数据段能够任意大
file size 文件能够任意大
pending signals 最多有2047个待处理的信号
max locked memory 一个任务锁住的物理内存的最大值为32kB
max memory size 一个任务的常驻物理内存的最大值
open files 一个任务最多能够同时打开1024的文件
pipe size 管道的最大空间为4096字节
POSIX message queues POSIX的消息队列的最大值为819200字节
stack size 进程的栈的最大值为8192字节
cpu time 进程使用的CPU时间
max user processes 当前用户同时打开的进程(包括线程)的最大个数为2047
virtual memory 没有限制进程的最大地址空间
file locks 所能锁住的文件的最大个数没有限制

范例2:经过ulimit命令来限制文件的大小,从而致使拷贝命令的失败

[root@localhost]ls temp.txt
ls: temp.txt: 没有那个文件或目录
[root@localhost]ulimit -f 1 #设置建立文件的最大块(一块=512字节)
[root@localhost]cat a.c > temp.txt
文件大小超出限制

文件a.c的大小是5002字节,而咱们设定的建立文件的大小是512字节x1块=512字节 

相关文章
相关标签/搜索