经过多年的实践经验,整理了一些资料,与大家分享Linux环境下MySQL性能突发事件的排查技巧。作为一名DBA,当面对突如其来的性能问题时,你是否曾束手无策、无从下手?其实性能无非就是存储、操作系统、应用程序、数据库等方面的问题,性能分析问题并没有想象中那么难。当你了解了一些常用的Linux系统命令和基本的MySQL排查命令后,所有的问题点就可以定位了。先上一张Linux性能工具图,BrendanD.Gregg动态跟踪工具DTrace的作者。这有点复杂,所以不要太小心。只要了解以下常用命令和分析要点,就可以确定大部分性能问题。Linux平台常用的性能收集工具:1.top——Linux系统进程监控top命令是Linux下常用的性能分析工具,可以实时显示系统中各个进程的资源使用情况,类似于Windows任务管理器。并且它也是Linux系统管理员经常用来监控系统性能的工具。top命令可以定期显示所有正在运行和实际正在运行和更新的列表,它显示CPU使用率、内存使用率、交换内存、缓存大小、缓冲区大小、进程控制、用户和更多命令。它还显示内存和CPU使用率较高的正在运行的进程。2.vmstat——虚拟内存统计vmstat命令用于显示虚拟内存、内核线程、磁盘、系统进程、I/O模块、中断、CPU活动状态等。3.lsof——打开文件列表lsof命令可以用于很多Linux/Unix系统,主要以列表的形式显示打开的文件和进程。打开的文件主要包括磁盘文件、网络套接字、管道、设备和进程。此命令可以轻松查看正在使用的文件。4、tcpdump——网络数据包分析器tcpdump是使用最广泛的命令行网络数据包分析,它完全截取网络中传输的数据包并提供分析。支持对网络层、协议、主机、网络或端口进行过滤,并提供and、or、not等逻辑语句,帮助您去除无用信息。包可以通过tcpdump命令解析,也可以保存为后缀为pcap的文件,用wireshark等软件查看。3.netstat——网络统计netstat命令是一个命令行工具,用于监控进出网络数据包的统计界面。它是许多系统管理员监控网络性能和解决网络相关问题的非常有用的工具。4.iostat-输入/输出统计iostat是一个简单的工具,用于收集和显示系统输入和输出存储设备的统计信息。该工具通常用于查找存储设备的性能问题,包括设备、本地磁盘和远程磁盘(如NFS)。除了上述之外,还有其他常用的Linux工具,如sar、htop、IPTraf、iotop、iftop、iptraf等。常用的MySQL性能应急分析命令:1.SHOWPROCESSLIST;-当前在MySQL数据库中运行的所有线程2.INNODB_TRX;--allcurrentlyrunningtransactions##allcurrentlyrunningtransactions,andspecificstatements3.INNODB_LOCKS;--Lockscurrentlyappearing##当前事务中出现的锁的语句信息4.INNODB_LOCK_WAITS;—锁等待的对应关系##锁等待的对应关系5.SHOWOPENTABLESwhereIn_use>0;--当前打开的表,查看有哪些表Inuse,In_use列表示有多少线程正在使用某个表,Name_locked表示表名是否被锁定,一般出现在Drop或Rename命令对该表进行操作时。所以这个命令不能帮助回答我们常见的问题:某个表是否存在死锁,谁拥有这个表的锁等等,下面是重点部分,请注意!6.显示引擎INNODB状态\G;—Innodb状态展示除了大量的内部信息外,输出内容比较复杂难懂,输出内容包含一些一般的统计信息。这些平均值是自上次输出生成以来的统计数据。具体分析如下:①.Header是简单的打印,输出时间,距离上次输出的间隔。②.背景线③。SEMAPHORES信号量OSWAITARRAYINFOOSWAITARRAYINFO操作系统等待数组信息,它是一个槽数组,innodb使用了多少次操作系统的等待保留统计(reservationcount)显示了innodb分配槽的频率信号count(signalcount)衡量线程通过数组获取信号的频率RW-sharedspins:#这一行显示读写共享锁的计数器RW-exclspins:#这一行显示读写独占的计数器lockRW-sxspins:#这一行显示共享排他锁计数器*备注:5.7.2增加了一种新的读写锁类型,叫做SX共享排他锁。锁的拥有者可以读取表中的任何数据,如果在相应的行上可以获得X锁,则可以对该行进行修改。④.TRANSACTIONS包含Innodb事务(transactions)的统计信息,以及当前活跃的事务列表。transactionid:这个ID是一个系统变量,每次产生新的交易都会递增。清除完成:正在进行的清除操作的事务ID。可以查看第一个事务id和第一个PurgedoneID的区别,了解未被purge的事务落后的情况。Historylistlength:记录撤销空间中未清除的事务数。⑤.FILEI/O显示I/OHelper线程的状态,包括一些统计信息挂起操作、挂起日志和缓冲池线程的fsync()调用399OSfile:line显示读取、写入和fsync()调用次数。0.00reads/s...:显示每秒的统计数据。,segmentsize哈希表:显示了哈希表的一些信息***一行显示了每秒有多少哈希搜索,和非哈希搜索⑦。LOGLog序号表示lsnLogflusheduptoinredologbufferredologfile中lsnPagesflushedupto表示的bufferpool中最旧脏页的lsnLastcheckpointat是指flushlatestphysicalpage时fil_page_lsn的变量值到磁盘。⑧.BUFFERPOOLANDMEMORY当前内存使用状态Pagesreadahead:显示每秒线性预读和机器预读的次数备注:InnoDB提供了两种预读方式,一种是线性预读,由参数innodb_read_ahead_threshold控制,当你连续读一个区段的阈值页,将触发下一个区段64页的预读。另一种是Randomread-ahead,由参数innodb_random_read_ahead控制。当连续读取设定的页数时,会触发读取该extent的剩余页数。InnoDB的预读功能是使用后台线程异步完成的。⑨.ROWOPERATIONSInnoDB中的0个查询,队列中的0个查询:显示Innodb内核中有多少线程InnoDB中打开的读取视图:显示打开了多少读取视图,读取视图是用于一致性保证的MVCC“快照”注释:Innodb多版本并发(MVCC)使用读取视图来确定一致性读取期间的数据库快照。Innodb的读视图决定了一条记录是否可见。在RC隔离级别下,每一次SELECT都会得到***读视图;在RR隔离级别下,读取view7。显示STATUSLIKE'innodb_row_lock_%';在事务中的第一个SELECT请求发出时创建;--锁性能状态查看当前锁性能状态解释如下:Innodb_row_lock_current_waits:当前等待锁的次数Innodb_row_lock_time:自系统启动以来锁的总时间长度Innodb_row_lock_time_avg:每次平均锁时间Innodb_row_lock_time_max:最长锁timeInnodb_row_lock_waits:自系统启动以来的锁总数8.SQL语句EXPLAIN;——查询优化器EXPLAIN执行计划部分,略过(后续话题分享)作为DBA,故障排除技能是每个工程师都需要掌握的核心技能。作者介绍:崔虎龙,云和恩墨-开源架构部-MySQL技术顾问,长期服务于数据中心(金融、游戏、物流)行业,熟悉数据中心运营管理的流程和规范,自动化运维等。擅长MySQL、Redis、MongoDB数据库高可用设计和运维故障排除、备份恢复、升级迁移、性能优化。
