說明:
這篇是網上看到的有關修改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字節