開始:晚上十點被報警驚醒(幸好還沒睡覺),報警内容: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" > /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,如需轉載請自行聯系原作者