天天看點

MySQL 被ulimit 所困

開始:晚上十點被報警驚醒(幸好還沒睡覺),報警内容:xxxxxxxxxxxxx“MySQL IS Down”;MySQL 沒有任何預兆的就死啦。

勘察現場:->檢視下MySQL程序---存在

->系統load,cpu,io 均很正常

->(個人覺得zabbix 不會誤報)

->登入MySQL提示:ERROR 1135 (HY000): Can’t create a new thread (errno 11)

->perror 11 顯示:

OS error code 11: Resource temporarily unavailable

->第一反應是 檔案句柄不夠用,檢視檔案句柄使用情況:

lsof -n | awk '{print $2}' | sort | uniq -c | grep 'pid of mysql'

-------一切正常;

ulimit -a 

顯示所有的結果:

max process 為 1024;--基本可以肯定問題就出在這裡,某個程式發起了過多的連接配接,現在可以考慮坐下限制(簡單粗暴的方法是 設定ulimit -u 102400,然後再重新開機MySQL--):

----> 檢視3306 連接配接數:

1

<code>netstat</code> <code>-ano | </code><code>grep</code> <code>ip:3306 | </code><code>awk</code> <code>'{print $5}'</code> <code>| </code><code>awk</code> <code>-F </code><code>':'</code> <code>'{print $1}'</code> <code>| </code><code>sort</code> <code>| </code><code>uniq</code> <code>-c</code>

可以考慮使用iptables 限制最大連接配接數來處理:

<code>iptables -A INPUT -p tcp -m tcp --dport 3306 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 200 --connlimit-mask 32 -j REJECT --reject-with tcp-reset</code>

每個ip并發連接配接不超過200個

明天可以讓程式查代碼啦!

故障反思:

其中漏掉的一點是:檢視系統限制:/etc/security/limits.conf 中 

max process = 65535

但ulimit -a 的時候顯示的是 1024

<code>su</code> <code>mysql </code><code>bash</code> <code>-c  </code><code>"ulimit -a"</code>

這不科學的:

發現在centos 6.x中,添加了一個新的檔案:/etc/security/limits.d/90-nproc.conf ,隻有 noproc是已這個檔案為準;

總結為:在centos5裡面,隻要在/etc/security/limits.conf 設定好久可以啦,在Centos6裡面除了上面提到的limits.conf 配置檔案,還要設定好/etc/security/limits.d/90-nproc.conf

方法二:找到一個可以不重新開機MySQL就可以線上修改noproc的方式!

從Linux 2.6.32開始可以使用echo -n "Max processes=204800:204800" &gt; /proc/`pidof mysqld`/limits 來動态修改程序的系統資源limits資訊,不用再因為修改這個而去重新開機執行個體,親測可用!

關于更多ulimit 的執行個體,可以參考@淘寶褚霸的文章:

<a href="http://blog.yufeng.info/archives/2311" target="_blank">http://blog.yufeng.info/archives/2311</a>

<a href="http://blog.yufeng.info/archives/2568" target="_blank">http://blog.yufeng.info/archives/2568</a>

本文轉自 位鵬飛 51CTO部落格,原文連結:http://blog.51cto.com/weipengfei/1301858,如需轉載請自行聯系原作者

繼續閱讀