热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用穷人版profiler定位调试MySQL

此文已由作者温正湖授权网易云社区发布。欢迎访问网易云社区,了解更多网易技术产品运营经验。 

此文已由作者温正湖授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

  周末闲得蛋疼,来英飞特做人工空气净化器。开了电脑后,习惯性得点击xshell按钮,进入InnoSQL稳定性测试机。show processlist几次,发现不对劲啊。我跑的是oltp加oltp_simple(select)测试,怎么好像没有update/delete/insert了,似乎只有select了。因为改了InnoDB层持锁相关的代码,莫非死锁(非事务死锁,而是latch死锁)了,但死锁怎么还能select呢。进一步打开oltp和oltp_simple两个screen的输出report,果然是oltp_simple正常,oltp的tps为0。为了调试方便,把oltp_simple停了。在此show processlist,发现10个线程齐刷刷地处于commit阶段。至此,通过mysql客户端似乎看不出什么了。

 

 按照正常的定位思路,这个时候应该先看下mysqld进程输出的error log,但阴差阳错,我并没有这么做。直接想到了上gdb,但多线程情况下gdb其实挺烦,你懂点。之前在看MongoDB存储引擎WiredTiger WAL日志性能优化文章(1,2 写到不错,推荐看看)的时候提到了一个工具,叫做穷人版profiler,打算试用下。简单过滤后,摘取的10个线程信息如下:

每行的第一列是拥有同样内容的线程个数。可以看到有8个线程在提交阶段等mutex latch,有一个线程在等rwlock latch,还有一个,他竟然在commit阶段sleep,在往后看,竟然是wait_for_free_space。理一理,在commit阶段flush_cache_to_file函数中在wait_for_free_space进行sleep,那么很显然,磁盘满了呗。直接用df -h看了下,数据盘果然满了。盘有100G,数据量才10G左右,咋会满。看了下数据目录,全是binlog文件。好吧,那应该是binlog过期没删。在MySQL客户端使用show variables like “%expire%”看下,发现该值为空啊,那就很显然了。这次问题是由于在MySQL主从复制环境下跑稳定性测试,没有设置binlog过期时间导致binlog堆积占满了数据盘,引起读写事务无法正常提交。 最后查看了而error log确认了下:

果然如此啊。那么执行set global expire_logs_days = 1设置binlog过期时间为一天,然后flush logs。迅速把磁盘空间降下来,再次show processlist,ok了!

 这是一个很简单的MySQL使用问题。作为一个有经验的MySQL研发或运维人员都能够快速定位。在此只是作为一个例子来说明穷人版profiler的使用方式。我觉得他使用gdb attach到进程后快速获取各个线程的调用栈信息后后迅速detach,并将调用栈信息按照层级快速合并汇总并统计处于同样调用栈的线程个数。这样有如下优点:

 1、attach后获取信息就快速detach,对MySQL进程影响较少,甚至在线上环境也能够使用。比靠人工操作高效很多;

 2、自动统计和整理调用栈信息,提供直观的信息和每个线程的函数调用关系,便以形成对问题的初步了解;对于简单的问题,直接可以通过函数调用关系来知道问题所在。

 3、当然,其还可以通过周期性多次采样,这样能够直观反映进程一段时间内的运行情况。

 其实类似的工具不止一个。比如pstack等也有类似功能。但不管如何,这是一个不错的工具。对于c/c++多线程开发的同学,一定还是有些用处的。最后,贴上该工具的脚本,非常简单易懂:

网易云免费体验馆,0成本体验20+款云产品! 

更多网易技术、产品、运营经验分享请点击。

相关文章:【推荐】 限时购校验小工具&dubbo异步调用实现限



推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
author-avatar
你永远不冫会懂我的心O_751
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有