百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> 记一次MySQLsemaphorecrash的剖析
分享文章到:

记一次MySQLsemaphorecrash的剖析

发布时间:09/01 来源:未知 浏览: 关键词:
DBA应当对InnoDB:MySQL后台线程srv_error_monitor_thread发明存在阻塞超过600s的latch锁时,要是陆续10次检测该锁仍没有开释,就会触发panic以免办事延续hang下去。

BA应当对InnoDB: Semaphore wait has lasted > 600 seconds. We intentionally crash the server because it appears to be hung. 一点都不生疏,MySQL后台线程srv_error_monitor_thread发明存在阻塞超过600s的latch锁时,要是陆续10次检测该锁仍没有开释,就会触发panic以免办事延续hang下去。

产生了什么

版本号:MySQL 5.5.40

日志中延续输出线程期待数据字典锁,位置是dict0dict.c line 305,期待工夫超过了900s。

持有锁的线程是 139998697924352 ,其十六进制是7f53fca8a700。

--Thread 139998393616128 has waited at dict0dict.c line 305 for 934.00 seconds the semaphore:X-lock on RW-latch at 0x105a1b8 created in file dict0dict.c line 748a writer (thread id 139998697924352) has reserved it in mode exclusivenumber of readers 0, waiters flag 1, lock_word: 0Last time read locked in file dict0dict.c line 302Last time write locked in file /pb2/build/sb_0-13157587-1410170252.03/rpm/BUILD/mysql-5.5.40/mysql-5.5.40/storage/innobase/dict/dict0dict.c line 305

上锁线程 139998697924352 的事务信息,查询数据字典表的操纵。

---TRANSACTION 0, not started updating table statistics:MySQL thread id 14075, OS thread handle 0x7f53fca8a700, query id 110414021 21.14.5.139 jzjkusrSELECT ROUND(SUM(DATA_LENGTH+INDEX_LENGTH+DATA_FREE)/1024/1024/1024) AS MY_DB_TOTAL_SIZE FROM information_schema.TABLES

检查下持锁线程 139998697924352 可否存在其他锁期待。

发明线程 139998697924352 ,self-lock 在 btr0sea.c line 1134,该锁构造和 AHI 相干。

--Thread 139998697924352 has waited at btr0sea.c line 1134 for 934.00 seconds the semaphore:X-lock (wait_ex) on RW-latch at 0x1eb06448 created in file btr0sea.c line 178a writer (thread id 139998697924352) has reserved it in mode wait exclusivenumber of readers 1, waiters flag 1, lock_word: ffffffffffffffffLast time read locked in file btr0sea.c line 1057Last time write locked in file /pb2/build/sb_0-13157587-1410170252.03/rpm/BUILD/mysql-5.5.40/mysql-5.5.40/storage/innobase/btr/btr0sea.c line 1134

接下来看下两处锁构造离别在哪个函数内:

dict0dict.c line 305在dict_table_stats_lock函数内

btr0sea.c line 1134在btr_search_drop_page_hash_index函数内

什么状况会调取这些函数?

启用 innodb_table_monitor,输出日志时调取 dict_table_stats_lock 上 X 锁,本案例未开启。

启用 innodb_stats_on_metadata 时,查询数据字典表会触发统计信息的更新操纵,会调取 dict_table_stats_lock 上 X 锁。这与持锁线程的事务信息匹配。

Adaptive hash index(AHI) 是 InnoDB 用来加快索引页查寻的 hash 表构造。当页面拜访次数知足一定前提后,这个页面的地址将存入一个 hash 表中,减少 B 树查询的开销。

MySQL 5.5 版本 AHI 是由全局锁 btr_search_latch 保护 hash 表修改的一致性。

InnoDB buffer pool 状态显示 free buffer 根本维持0余暇。InnoDB buffer pool 驱赶数据页时,会调取 btr_search_drop_page_hash_index 函数,从 AHI 中清算该数据页。

-----------------------------BUFFER POOL AND MEMORY-----------------------------Total memory allocated 17582522368; in additional pool allocated 0

Dictionary memory allocated 4289681

Buffer pool size 1048576

Free buffers 0

Database pages 1040831

Old database pages 384193

Modified db pages 0

小结

AHI 的全局锁 btr_search_latch 时常会是竞争热点影响机能,5.7版本后有所改进与 InnoDB buffer 同样做了多实例拆分。本案例在开启 Innodb_stats_on_metadata 参数,查询元数据信息时触发统计信息更新,上锁数据字典,阻塞了了批量业务操纵,又因为 buffer pool 空间不够,致使表驱赶旧页触发 AHI 的 btr_search_latch 锁竞争,终究致使信号量超时 crash。

>> 彩蛋 <<

在动辄几兆的日志中剖析 Semaphore crash,寻觅锁、线程、事务之间的关系,相当令人抓狂的。借助 sed、awk、grep 三大法宝,虽有效率提拔,但仍不足高效。

为了偷懒写了一个小程序,帮忙DBA迅速梳理出这些关系。

它的用途是这样的:

hongbin@MBP ~> mysqldba doctor -f /Users/hongbin/workbench/mysqld_safe.log

指标版本,查代码时寻对应版本:

MySQL Server Version: '5.7.16-log’

日志中涌现的 semaphore crash 次数和 mysql 启动次数,要是启动次数大于 crash 次数注明可能是正常启动或其他 crash 造成:

********** MySQL service start count **********

MySQL Semaphore crash -> 3 times ["2018-08-13 23:12:18" "2018-08-14 12:13:43" "2018-08-16 13:42:36"]

MySQL Service start -> 3 times ["2018-08-13 23:12:59" "2018-08-14 12:15:20" "2018-08-16 13:46:37"]

线程主要在期待哪些 RW-latch,内容包含:锁位置、涌现次数、线程 id (涌现次数),重点关注涌现次数较多的:

********** Which thread waited lock **********row0purge.cc:861 -> 58 140477266503424:(57) 140617703745280:(1)gi.cc:14791 -> 1 140477035656960:(1)trx0undo.ic:171 -> 1 140617682765568:(1)ha_innodb.cc:14791 -> 620 140617389913856:(58) 140202719565568:(58) 140202716903168:(57) 140477029533440:(56) 140617407219456:(55) 140477035656960:(52) 140477035124480:(29) 140477108467456:(29) 140477025539840:(26) 140477031130880:(25) 140477027669760:(22) 140617634944768:(21) 140617634146048:(21) 140477019948800:(21) 140477026604800:(20) 140477022078720:(18) 140477018883840:(16) 140477038585600:(15) 140477028734720:(10) 140477022877440:(9) 140477034325760:(1) 140477031663360:(1)srv0srv.cc:1968 -> 208 140477276993280:(185) 140617714235136:(23)ha_innodb.cc:5510 -> 601 140617398167296:(57) 140617409615616:(55) 140617392043776:(53) 140477110597376:(52) 140617395771136:(50) 140617636275968:(45) 140617632548608:(40) 140617634146048:(33) 140617639675648:(32) 140617397102336:(28) 140617639409408:(23) 140617635743488:(21) 140617637811968:(18) 140617638610688:(16) 140617399232256:(12) 140617638344448:(10) 140617638078208:(10) 140477033793280:(10) 140477029267200:(10) 140617397368576:(9) 140617635211008:(6) 140617393641216:(5) 140617637545728:(3) 140617402693376:(2) 140477037254400:(1)dict0dict.cc:1239 -> 136 140477122623232:(50) 140617392842496:(35) 140202726487808:(26) 140477123688192:(12) 140477038851840:(5) 140477030065920:(4) 140617634412288:(4)row0trunc.cc:1835 -> 1 140477109798656:(1)

上述锁被哪些写线程持有 X 锁,重点关注涌现次数较多的:

********** Which writer threads block at **********

140616681907968 -> 1 trx0undo.ic:171:(1)140477173069568 -> 243 srv0srv.cc:1968:(185) row0purge.cc:861:(57) row0trunc.cc:1835:(1)140617682765568 -> 29 srv0srv.cc:1968:(23) ha_innodb.cc:5510:(5) row0purge.cc:861:(1)

写线程对应的事务信息,也可能存在日志记载没有输出事务信息:

********** These writer threads trx state **********MySQL thread id 83874, OS thread handle 140477173069568, query id 13139674 10.0.1.146 aml deleting from reference tables

统计写线程持有 S 锁状况:

****These writer threads at last time reads locked ****

140477173069568 -> 243 row0purge.cc:861:(243)140617682765568 -> 24 row0purge.cc:861:(24)140616681907968 -> 1 trx0undo.ic:190:(1)

统计写线程持有 X 锁状况:

****These writer threads at last time write locked ****

140477173069568 -> 243 dict0stats.cc:2366:(243)140617682765568 -> 24 dict0stats.cc:2366:(24)140616681907968 -> 1 buf0flu.cc:1198:(1)

通过事后日志剖析,有可能涌现线程的事务信息没有输出到日志中的状况,没法获知事务概括施行了什么操纵。应答这种状况,小程序参加了事中采集事务信息。

用途是这样的:

hongbin@MBP ~> mysqldba -uxxx -pxxx doctor -w

它会监视指标 mysql 的差错日志,一旦涌现“a writer (thread id 140616681907968) has reserved it in mode” 关键字就查询 ps 中的事务信息,并保留下来。

以上只是小程序一个用途,作为一个为DBA办事的小程序,还有其他功能等你去发明。欢送与我交换你的设法。

更多SQL的相干技术文章,请拜访SQL教程栏目进行学习!

以上就是记一次MySQL semaphore crash的剖析的细致内容,更多请关注 百分百源码网 其它相干文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有154人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板