mysql hang_mysql夯hang死堆栈采集工具
這里我們的場景是mysql client已經無法登陸,無法執行sql。
基本思路是打出堆棧來分析
此時首先懷疑mysql內部發生了死鎖
1. 使用pstack打出堆棧,會有一定性能影響
yum install gdb
pstack mysql_pid > /tmp/pstack.out
也可以用gdb
gdb -batch -ex "thread apply all bt" -p mysql_pid > /tmp/gdb.log
堆??赡鼙容^多,需要耐心一點點排查,找出死鎖的調用路徑
2. 使用strace打出一段時間內的系統調用信息,會有一定性能影響
strace -o /tmp/strace_output.txt -T -tt -f -e trace=all -p {mysql_pid}
可以作為額外信息,輔助堆棧的排查
如果pstack或gdb也無法進入,那可能mysql已經不響應信號了
只能從操作系統提供的proc文件收集一些信息
cat /proc/mysql_pid/status
注意,status里除了進程狀態之外,也有信號處理相關的信息Sig*
cat /proc/mysql_pid/task/*/stack
cat /proc/mysql_pid/syscall
cat /proc/mysql_pid/stack
當前的系統調用信息,比如是不是某個系統調用一直沒有返回
ps -p{mysql_pid} -ocmd,stat,wchan
如果proc文件顯示進程處于Running狀態,沒有夯在任何系統調用上
我目前能找到的方法就是打coredump,會殺死進程,但是能留下堆棧
prlimit --p $(mysql pid) --core=unlimited
先調整core limit,保證coredump文件能正常生成(linux 內核版本 2.6.36 以后才能使用prlimit)
kill -SIGSYS mysql_pid
linux有很多默認行為是打coredump的信號,但是有些信號被mysql捕獲自己做了處理,比如SIGABRT,所以這里我們用SIGSYS
參考:http://man7.org/linux/man-pages/man7/signal.7.html
如果以上方法都沒有成功收集到堆棧
那可能是操作系統層面的問題(或許可以從redhat bug文檔中找類似問題),或者是硬件問題,不簡單是mysql bug導致的死鎖
文章來源: www.oschina.net,作者:comix,版權歸原作者所有,如需轉載,請聯系作者。
原文鏈接:https://my.oschina.net/u/3211934/blog/3190544
總結
以上是生活随笔為你收集整理的mysql hang_mysql夯hang死堆栈采集工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十二星宫的守护者套装怎么领取?
- 下一篇: mysql库可以无限创建吗_mysql