五一前,一个DBA同事反馈,在日常环境中删除一个大的slow log文件(假设文件大小10G以上吧),然后在MySQL中执行flush slow logs,会发现mysqld hang住。

今天尝试着重现了此问题,这里简要分析下原因。

重现步骤:

1. 构造slow log (将long_query_time设成了0);

2. 观察删rm slow log瞬间,tps/qps变化;

3. 观察执行flush slow logs瞬间,tps/qps变化;

4. 记录flush slow logs执行时, pstack打出的调用栈情况;

第一步,没啥好说的。

第二步,tps/qps没啥变化。

第三步,会发现tps/qps瞬间跌0,如下所示:

[ 639s] threads: 32, tps: 1121.00, reads/s: 15843.98, writes/s: 4490.99[ 640s] threads:32, tps: 792.99, reads/s: 10803.89, writes/s: 3150.97[ 641s] threads:32, tps: 0.00, reads/s: 0.00, writes/s: 0.00[ 642s] threads:32, tps: 0.00, reads/s: 0.00, writes/s: 0.00[ 643s] threads:32, tps: 471.01, reads/s: 6860.08, writes/s: 1908.02

mysql命令行会发现,flush slow logs执行时间刚好为3s左右。

第四步,我们看下pstack的输出结果,只记录相关的:

610 Thread 5 (Thread 0x2afdc4101700 (LWP 30762)):611 #0 0x0000003c6e40a7d6 in pthread_rwlock_rdlock () from /lib64/libpthread.so.0

612 #1 0x0000000000825135 ininline_mysql_rwlock_rdlock ()613 #2 0x0000000000838004 inLOGGER::lock_shared() ()614 #3 0x00000000008283bf in LOGGER::slow_log_print(THD*, char const*, unsigned int, unsigned long long) ()615 #4 0x0000000000832b30 in slow_log_print(THD*, char const*, unsigned int, unsigned long long) ()616 #5 0x0000000000609f23 in log_slow_statement(THD*) ()617 #6 0x00000000006099d1 in dispatch_command(enum_server_command, THD*, char*, unsigned int) ()618 #7 0x0000000000606e02 in do_command(THD*) ()619 #8 0x00000000006f070f in do_handle_one_connection(THD*) ()620 #9 0x00000000006f020d inhandle_one_connection ()621 #10 0x0000003c6e4077f1 in start_thread () from /lib64/libpthread.so.0

622 #11 0x0000003c6e0e570d in clone () from /lib64/libc.so.6

623 Thread 4 (Thread 0x2afdd0080700 (LWP 30763)):624 #0 0x0000003c6e40a7d6 in pthread_rwlock_rdlock () from /lib64/libpthread.so.0

625 #1 0x0000000000825135 ininline_mysql_rwlock_rdlock ()626 #2 0x0000000000838004 inLOGGER::lock_shared() ()627 #3 0x00000000008283bf in LOGGER::slow_log_print(THD*, char const*, unsigned int, unsigned long long) ()628 #4 0x0000000000832b30 in slow_log_print(THD*, char const*, unsigned int, unsigned long long) ()629 #5 0x0000000000609f23 in log_slow_statement(THD*) ()630 #6 0x00000000006099d1 in dispatch_command(enum_server_command, THD*, char*, unsigned int) ()631 #7 0x0000000000606e02 in do_command(THD*) ()632 #8 0x00000000006f070f in do_handle_one_connection(THD*) ()633 #9 0x00000000006f020d inhandle_one_connection ()634 #10 0x0000003c6e4077f1 in start_thread () from /lib64/libpthread.so.0

635 #11 0x0000003c6e0e570d in clone () from /lib64/libc.so.6

636 Thread 3 (Thread 0x2afdd0101700 (LWP 30764)):637 #0 0x0000003c6e40a7d6 in pthread_rwlock_rdlock () from /lib64/libpthread.so.0

638 #1 0x0000000000825135 ininline_mysql_rwlock_rdlock ()639 #2 0x0000000000838004 inLOGGER::lock_shared() ()640 #3 0x00000000008283bf in LOGGER::slow_log_print(THD*, char const*, unsigned int, unsigned long long) ()641 #4 0x0000000000832b30 in slow_log_print(THD*, char const*, unsigned int, unsigned long long) ()642 #5 0x0000000000609f23 in log_slow_statement(THD*) ()643 #6 0x00000000006099d1 in dispatch_command(enum_server_command, THD*, char*, unsigned int) ()644 #7 0x0000000000606e02 in do_command(THD*) ()645 #8 0x00000000006f070f in do_handle_one_connection(THD*) ()646 #9 0x00000000006f020d inhandle_one_connection ()647 #10 0x0000003c6e4077f1 in start_thread () from /lib64/libpthread.so.0

648 #11 0x0000003c6e0e570d in clone () from /lib64/libc.so.6

649 Thread 2 (Thread 0x2afe18080700 (LWP 30855)):650 #0 0x0000003c6e40e54d in close () from /lib64/libpthread.so.0

651 #1 0x00000000008f56ed inmy_close ()652 #2 0x0000000000825c16 ininline_mysql_file_close ()653 #3 0x000000000082b305 in MYSQL_LOG::close(unsigned int) ()654 #4 0x000000000082b634 inMYSQL_QUERY_LOG::reopen_file() ()655 #5 0x0000000000828283 inLOGGER::flush_slow_log() ()656 #6 0x000000000071d8fc in reload_acl_and_cache(THD*, unsigned long, TABLE_LIST*, int*) ()657 #7 0x0000000000610200 in mysql_execute_command(THD*) ()658 #8 0x000000000061534d in mysql_parse(THD*, char*, unsigned int, Parser_state*) ()659 #9 0x00000000006086a0 in dispatch_command(enum_server_command, THD*, char*, unsigned int) ()660 #10 0x0000000000606e02 in do_command(THD*) ()661 #11 0x00000000006f070f in do_handle_one_connection(THD*) ()662 #12 0x00000000006f020d inhandle_one_connection ()663 #13 0x0000003c6e4077f1 in start_thread () from /lib64/libpthread.so.0

664 #14 0x0000003c6e0e570d in clone () from /lib64/libc.so.6

会发现Thread 2在执行flush slow logs操作,其他的线程都在等待锁LOCK_log上边。

背后的原因其实很简单,在shell中执行rm slow log操作时,由于mysqld仍有文件句柄打开此文件,所以实际上此时文件并未删除。执行flush logs操作,其实际执行的是1)close;2)open 操作(logger.flush_slow_log -> mysql_slow_log.reopen_file),在close操作执行时,文件系统真正删除文件,此时该线程占用着LOCK_log锁。

删除时会执行刷脏(当然我构造这个场景很极端,基本所有slow log文件的内容都在文件系统缓存中),这个会很耗时间,比如我执行这个语句耗了3s。此时间段内,如果连接发来的语句需要记log(server层的log:slow log/binlog/general log共有LOCK_log这把锁)就会处于等待状态,那么系统对外的反应就是hang住了。

flush slow logs中调用执行的close所需时间和文件大小、以及文件系统缓存中该文件脏页比例都有关系,比如我在执行flush slow logs前使用sysctl vm.drop_caches=3清空

了文件系统缓存的话,同样大小的flush slow logs操作执行时间是0.42s,相应的阻塞时间也会减少不少。

可以考虑在slow logs的文件句柄上执行posix_fadvise调用,促使不会缓存很大的log文件内容(slow log也没啥需要缓存的),这有篇霸爷的文章,可以参考下posix_fadvise清除缓存的误解和改进措施 。

另外,peter在07年就讨论过这个问题, Be careful rotating MySQL logs 其给出的建议是先mv file,然后flush logs,再执行删除文件的操作,让真正的删除行为由自己而不是mysqld完成。比较遗憾的是,七年过去了,LOCK_log这把锁的问题还没有完整的解决掉。

PS:

文章结尾记一点备忘,通过close/rm操作删除一个10G大小的文件,在执行sysctl vm.drop_caches=3清空缓存后,此操作的耗时仍在百毫秒量级(我的机器上是200ms+),其背后做了什么事情还需要找内核组的同事了解下。

bug report:  http://bugs.mysql.com/bug.php?id=72529

删除logs mysql_关于删除MySQL Logs的一点记录相关推荐

  1. 删除logs mysql_关于删除MySQL Logs的问题记录_MySQL

    五一前,一个DBA同事反馈,在日常环境中删除一个大的slow log文件(假设文件大小10G以上吧),然后在MySQL中执行flush slow logs,会发现mysqld hang住. 今天尝试着 ...

  2. 删除logs mysql_关于删除MySQL Logs的一点记录 - 刘浩de技术博客

    五一前,一个DBA同事反馈,在日常环境中删除一个大的slow log文件(假设文件大小10G以上吧),然后在MySQL中执行flush slow logs,会发现mysqld hang住. 今天尝试着 ...

  3. 服务器c盘logs文件夹,Win10系统Logs文件夹有什么作用Logs文件夹可以删除吗

    摘要 腾兴网为您分享:Win10系统Logs文件夹有什么作用Logs文件夹可以删除吗,中信期货,中国人保,西餐菜谱,无忧课堂等软件知识,以及大家来找茬器,河南干部,理想财富,硬盘粉碎机,调音器和节拍器 ...

  4. 服务器c盘logs文件夹,Win10系统Logs文件夹有什么作用?Logs文件夹可以删除吗?

    Windows系统中一般都会有一个Logs文件夹,它能够记载系统运行的一些记录,我们可以使用记事本将它打开.最近,有Win10系统的用户,在查看电脑的时候发现有一个Logs文件夹,不知道Logs文件夹 ...

  5. sc delete mysql_彻底删除MySQL服务 删除服务:sc delete mysql//这里的mysql是你要删除的服务名在...

     进入"控制面板->管理工具->服务"查看才发现,虽然MYSQL已经卸载了,但是MYSQL服务仍然残留在系统服务里. 又不想改服务名,改怎么办呢. 只要在CMD里输 ...

  6. mysql利用binlog删除数据库_MySQL数据库之mysql手动删除BINLOG的方法

    本文主要向大家介绍了MySQL数据库之mysql手动删除BINLOG的方法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 在MySQL中执行以下命令: 复制代码 代码如下: P ...

  7. 【MySQL】面试官:如何查询和删除MySQL中重复的记录?

    写在前面 最近,有小伙伴出去面试,面试官问了这样的一个问题:如何查询和删除MySQL中重复的记录?相信对于这样一个问题,有不少小伙伴会一脸茫然.那么,我们如何来完美的回答这个问题呢?今天,我们就一起来 ...

  8. 安装mysql删除_mysql安装和删除

    首先,先在服务(开始-->控制面板-->管理工具-->服务)里停掉MySQL的服务. 打开控制面板-添加删除程序,找到MySQL,卸载.或者用360安全卫士来卸载也行.也可以用mys ...

  9. mysql 删除版本信息_linux 删除mysql

    写作背景 明天项目上线,今天晚上在客户的机房进行网站的部署,在安装mysql的时候出现了一个问题,就是死活安装不上,说已经存在mysql,最后分析错误信息才知道,原来是centos 6.3 自带安装了 ...

最新文章

  1. java org.jb2011报错_Java中getResourceAsStream()用法总结(转)
  2. 信道编码之编码理论依据
  3. mybaits八:select查询返回map集合
  4. 可以对窗口函数之后再加条件_SQL 窗口函数——解决实际问题
  5. 架构漫谈(八):从架构的角度看如何写好代码
  6. opencv图像的基础操作
  7. .net core 实现基于 JSON 的多语言
  8. python合并路径和文件名_Python实例 分割路径和文件名
  9. PowerShell 方式部署Sharepoint Solution
  10. 日本最后一刻阻拦鸿海收购夏普:质疑董事私心
  11. Apache24(VC15)安装步骤
  12. boost电路输出电流公式_boost升压电路参数计算
  13. iOS测试技巧:GPX文件修改经纬度
  14. APP支付如何对接合适的支付通道?
  15. 基于Html+Css+javascript的网页制作——音乐舞蹈学校(5页面) 计算机毕设网页设计源码
  16. 微信小程序 js创建Object对象
  17. 怎么看xray发了那些数据包
  18. OneNET平台创建产品
  19. js计算金额精度问题--currency.js(2022.11.10 阴)
  20. 【JavaScript】用循环语句解决鸡兔同笼和百元买百鸡问题

热门文章

  1. 如何在xp中添加打印机
  2. Linux入门学习(三)
  3. 亚马逊aws深度学习_AWS速查表:Amazon Web Services入门时首先要学习的5件事
  4. react和nodejs_如何使用React,TypeScript,NodeJS和MongoDB构建Todo应用
  5. web可用性测试_Web开发人员和设计人员的最佳可用性测试工具
  6. VS2103没有“dirent.h”文件
  7. SpringBoot-Web原生组件的注入
  8. word2003文档题注
  9. 漫步微积分七——连续函数
  10. vue复选框默认被选中_vue .js绑定checkbox并获取、改变选中状态的实例