mysql用户阻塞数_MySQL实例阻塞分析一例(线程statistics状态)

本文用实例来分析MySQL阻塞—线程statistics状态。

一、 现象

某日下午下班后低峰期,现网MySQL一个库突然报出大量慢sql,状态是 statistics,但是过后拿这些sql去执行的时候,实际很快。处于 statistics 状态的线程有个特征:查询的都是视图,但看监控那个时间段并没有明显的update/detele/insert。

通过我们的快照程序,去分析当时的 innodb status,发现如下信息:

SEMAPHORES

----------

OS WAIT ARRAY INFO: reservation count 17208994

--Thread 139964610234112 has waited at srv0srv.cc line 2132 for 14.00 seconds the semaphore:

X-lock (wait_ex) on RW-latch at 0x1635a00 created in file dict0dict.cc line 900

a writer (thread id 139964610234112) has reserved it in mode wait exclusive

number of readers 1, waiters flag 0, lock_word: ffffffffffffffff

Last time read locked in file row0purge.cc line 720

Last time write locked in file /home/admin/146_20161018140650857_13830810_code/rpm_workspace/storage/innobase/srv/srv0srv.cc line 2132

OS WAIT ARRAY INFO: signal count 256984450

Mutex spin waits 626367674, rounds 2776951802, OS waits 1973672

RW-shared spins 149944457, rounds 1650148561, OS waits 3972058

RW-excl spins 72090467, rounds 2017802579, OS waits 11148264

Spin rounds per wait: 4.43 mutex, 11.01 RW-shared, 27.99 RW-excl

...

FILE I/O

--------

I/O thread 0 state: waiting for i/o request (insert buffer thread)

I/O thread 1 state: waiting for i/o request (log thread)

I/O thread 2 state: waiting for i/o request (read thread)

I/O thread 3 state: doing file i/o (read thread) ev set

I/O thread 4 state: waiting for i/o request (read thread)

I/O thread 5 state: doing file i/o (read thread) ev set

I/O thread 6 state: doing file i/o (write thread) ev set

I/O thread 7 state: waiting for i/o request (write thread)

I/O thread 8 state: waiting for i/o request (write thread)

I/O thread 9 state: waiting for i/o request (write thread)

Pending normal aio reads: 18 [0, 12, 0, 6] , aio writes: 1 [1, 0, 0, 0] ,

ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0

Pending flushes (fsync) log: 0; buffer pool: 0

1346747614 OS file reads, 2869418806 OS file writes, 524616747 OS fsyncs

22 pending preads, 1 pending pwrites

6.00 reads/s, 16384 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s

...

ROW OPERATIONS

--------------

0 queries inside InnoDB, 0 queries in queue

38 read views open inside InnoDB

Main thread process no. 34414, id 139964610234112, state: enforcing dict cache limit

Number of rows inserted 2546811699, updated 1708150459, deleted 1004154696, read 413168628410

0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 54.19 reads/s

二、 分析

从上面的信息知道 Thread 139964610234112 是主线程,在源码 srv0srv.cc:2132 行的地方等待信号14s,这个信号是在 dict0dict.cc:900 地方创建的 RW-latch 排它锁。那么奇怪了,主线程自己在等待自己的互斥锁。

由于环境是阿里云的RDS(基于MySQL 5.6.16-log 版本),拿不到他们的代码,找来 5.6.35 的来看,行号对不上。但好在上段信息的最后面有一个 Main thread state: enforcing dict cache limit,发现在 srv0srv.cc 函数 srv_master_do_active_tasks() 约2137行的位置:

if (cur_time % SRV_MASTER_DICT_LRU_INTERVAL == 0) {

srv_main_thread_op_info = "enforcing dict cache limit";

srv_master_evict_from_table_cache(50);

MONITOR_INC_TIME_IN_MICRO_SECS(

MONITOR_SRV_DICT_LRU_MICROSECOND, counter_time);

}

应该是在调用 srv_master_evict_from_table_cache() 从innodb table cache里面清理缓存的地方waiting(这里不是一定会清理,而是先判断空间够不够用,参数50表示只扫描 unused_table list的50%)。srv_master_evict_from_table_cache():

srv_master_evict_from_table_cache(

/*==============================*/

ulint pct_check) /*!< in: max percent to check */

{

ulint n_tables_evicted = 0;

rw_lock_x_lock(&dict_operation_lock);

dict_mutex_enter_for_mysql();

n_tables_evicted = dict_make_room_in_cache( /** 在dict0dict.cc里面 **/

innobase_get_table_cache_size(), pct_check);

dict_mutex_exit_for_mysql();

rw_lock_x_unlock(&dict_operation_lock);

return(n_tables_evicted);

}

就是在 rw_lock_x_lock(&dict_operation_lock) 这个地方获取Latch的时候等待了14s,这个锁就是在数据字典模块 dict0dict.cc:dict_init() 约1065行的地方创建的,与innodb status输出基本一致。

关于 dict_operation_lock 直接看注释吧:

/** @brief the data dictionary rw-latch protecting dict_sys

table create, drop, etc. reserve this in X-mode;

implicit or backround operations purge, rollback, foreign key checks reserve this in S-mode;

we cannot trust that MySQL protects implicit or background operations a table drop since MySQL does not know of them;

therefore we need this; NOTE: a transaction which reserves this must keep book on the mode in trx_t::dict_operation_lock_mode */

在尝试把表定义逐出缓存时,获取的是 dict_operation_lock X-mode lock,可是从已有的信息里看不到另一个数据字典锁是什么。 之前是怀疑是不是 table_definition_cache, table_open_cache, innodb_open_files 设置小了,视图一般是多表join,更容易消耗打开表的数量,导致不断的逐出cache而导致锁争用。但是检查一番并没发现什么问题,更何况是14s的等待。关于它们的设置和关系,可以参考我的文章 table_open_cache 与 table_definition_cache 对MySQL的影响(详见文末参考文献)。

那么得换个思路了,processlist里面有13个长时间处于 statistics 状态的线程,表示正在计算统计数据,以制定一个查询执行计划。 如果一个线程很长一段时间处于这种状态,可能是磁盘IO性能很差,或者磁盘在执行其他工作。

此时注意到最上面的信息里有 Pending normal aio reads: 18 [0, 12, 0, 6] ,有18个读IO被挂起(实际从监控图 innodb_data_pending_reads看来,有达到过50),四个read thread有三个处于忙碌状态。再有 innodb_buffer_pool_pages_flushed 在出异常前10s没有任何变化,也就是没有成功的将脏数据刷盘动作。另外这是一个从库,出异常前10s有出现过瞬间20多秒延迟:

format,png

format,png

(这一切关注的都是 18:59:05 之前的数据,之后的时间,一般恢复了都会有瞬间的读行数上涨,这个时候别把它们反当做起因)

三、结论

结合上面的 enforcing dict cache limit 和 statistics IO pending,找到两个有关的bug report:

https://bugs.launchpad.net/percona-server/+bug/1500176

https://bugs.mysql.com/bug.php?id=84424

第一个是使用 pt-online-schema-change 去更改分区表的结构,可能会出现,但目前bug状态是Undecided,我们的环境没有分区表,没外键,也没有改表动作。 第二个其实 Not a bug:

Thank you for your bug report. This is, however, not a bug, but a very well known issue.

You have to do several things in order to alleviate the problem:

* increase the additional memory pool

(注:这里我认为不应该是additional memory pool,而是 buffer_pool,因为现在innodb内存管理基本是调用系统malloc,

即innodb_use_sys_malloc=ON,参考https://dev.mysql.com/doc/refman/5.7/en/innodb-performance-use_sys_malloc.html)

* increase total number of file handles available to MySQL

* increase number of file handles for InnoDB

* improve performance of the I/O on your operating system

说到底就是数据库服务器IO遇到问题了,可以通过增加 buffer_pool 来缓存更多的数据,或者提高服务器IO能力,这个范围就广了,可参考《8.5.8 Optimizing InnoDB Disk I/O》(详见文末参考文献)。  然而生产服务器都运行了1年之久,高峰期都没出现过IO问题,现在何况低峰期,也没有人为操作。那这个锅只能交给阿里RDS了:怀疑是实例所在物理机磁盘有抖动。

分析这么久得出这个结论,却不能做什么,因为我们没办法看到服务器级别的IO stats。其实想到去年也有实例出现过几例类似 statistics 问题,向阿里云提工单确认物理机状态,得到的结论都是:“是的,物理机有抖动。需要申请迁移实例吗”,但是从来拿不到依据。如果自己能看到OS级别的监控,其实都不需要本文这么冗长的分析。

原文发布时间为:2017-10-25

本文作者:周晓,知数堂第8期学员

本文来自云栖社区合作伙伴“老叶茶馆”,了解相关信息可以关注“老叶茶馆”微信公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无法获取未定义或 null 引用的属性“text”_【CSS】是时候开始用 CSS 自定义属性了...

自定义属性(有时候也被称作CSS变量或者级联变量)是由CSS作者定义的&#xff0c;它包含的值可以在整个文档中重复使用。由自定义属性标记设定值(比如&#xff1a;--main-color: black;)&#xff0c;由var() 函数来获取值(比如&#xff1a;color: var(--main-color);)复杂的网站都…

斐波那契数列不用数组_兔子数列——斐波那契数列

相信人们都对斐波那契数列有或多或少的了解&#xff0c;如果没有&#xff0c;那你一定听过黄金分割比或是见过下面这种图片&#xff1a;斐波那契生活在十三世纪的意大利&#xff0c;原名列奥纳多皮萨诺(Leonardo Pisano)&#xff0c;他出生在意大利那个后来因为伽里略做过自由落…

sqlserver服务启动失败_条码打印软件连接SQL数据库出现TCP连接失败解决办法

小编今天用条码打印软件连接SQL 数据库遇到了一个问题&#xff1a;通过端口1433连接到主机localhost的TCP/IP连接失败。错误&#xff1a;“Connection refused&#xff1a;connect。请验证连接属性。确保SQL Server的实例正在主机上运行&#xff0c;且在此端口接收TCP/IP连接&a…

mysql57win10安装配置_Win10 OS安装(配置)MySQL 5.7(解压版)

Win10 OS安装(配置)MySQL 5.7(解压版)下载及解压文件名&#xff1a;mysql-5.7.27-win32.zipzip是解压版&#xff0c;msi是安装版&#xff0c;本教程仅说明zip格式的配置方法。解压(假设解压后根路径为D:\ide\mysql-5.7.27-win32)相关截图添加环境系统变量path 增加D:\ide\mysql…

pep8 python 编码规范_如何用好python编码规范,写一手漂亮的代码

前一段时间在编写python 代码的时候编辑器中一直在提示规范问题&#xff0c;因为强迫症的原因&#xff0c;我决定遵循python 的编码规范去编码&#xff0c;然后把需要注意的点记录下来&#xff0c; 帮助自己和大家一起成长。这是我的main.py文件中的一部分代码&#xff0c;经过…

mysql约束_Mysql约束条件

约束条件1约束条件约束是一种限制&#xff0c;通过对表中的数据做出限制&#xff0c;来确保表中数据的完整性&#xff0c;唯一性默认约束CREATE TABLE tb(id INT DEFAULT a ,name VARCHAR(20));插入数据的时候&#xff0c;如果没有明确为字段赋值&#xff0c;则自动赋予默认值在…

解决方案和项目的关系_项目经理入门知识系列之《项目团队的职责分工》

项目团队的组织结构组织结构项目经理职责整合制定项目计划所需的活动。整合执行项目计划所需的活动。整合进行范围变更所需的活动。1、目经理负责对横跨多个职能线的活动进行协调和整合。整合管理2、项目经理核心技能---沟通能力(因为他的权力太少了)如果一个人有良好的沟通与人…

数据库字段 到类 java bean_将数据库中表的字段自动转换为javaBean实体类

具体代码如下&#xff1a;package param;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.Resul…

el-drawer点击的时候为什么有边框_剪映教学之视频拍摄加剪辑【一】:出视频上下黑色边框模糊效果,视频广告配音...

抖音小视频已经成为风靡全国的一个app了&#xff0c;很多人都喜欢看抖音来打发时间&#xff0c;而经常看小视频的应该都见到过这种现象&#xff0c;就是有一些小视频我们在观看的时候&#xff0c;发现这个小视频的上下都有黑色边框或者模糊的效果&#xff0c;实际这都是一些拍摄…

java synchronized 静态_Java之Synchronized修饰实例方法和静态方法

一、Synchronized修饰实例方法&#xff0c;实际上是对调用该方法的对象加锁&#xff0c;俗称“对象锁”情况一&#xff1a;​同一个对象在两个线程中分别访问该对象的两个同步实例方法结果&#xff1a;会产生互斥​原因&#xff1a;因为锁针对的是对象&#xff0c;当对象调用​…

网站漏洞扫描工具_如何实现免费网站漏洞扫描?推荐一款神器给你

网站漏洞想必有网站的人都比较了解&#xff0c;想要了解网站漏洞&#xff0c;最好的办法就是给网站做一次漏洞扫描&#xff0c;网站漏扫产品比较多&#xff0c;费用也从几十/次到几千/次不等&#xff0c;但是对于我这种小企业来说&#xff0c;几千一次也是非常贵的&#xff0c;…

java mvc设计模式_JavaEE知识点:MVC设计模式

MVC全名是Model View Controller&#xff0c;是模型(model)-视图(view)-控制器(controller)的缩写&#xff0c;是一种软件设计典范&#xff0c;用一种业务逻辑、数据、界面显示分离的方法组织代码&#xff0c;将业务逻辑聚集到一个部件里面&#xff0c;在改进和个性化定制界面及…

mysql 导出数据字典_操作MySQL?这个库比pymysql香一百倍

原创&#xff1a; 阿亮 Python极客社区操作MySQL&#xff0c;我们都习惯于用pymsq&#xff0c;基本流程就是创建连接创建游标执行SQL关闭连接代码是这样的import pymysql# 1.创建连接conn pymysql.connect(host127.0.0.1, port3306, userroot, passwordroot, charsetutf8)# 2.…

java putifabsent_java8中Map的一些骚操作总结

一 前言本篇内容是关于 map 新特性的一些方法使用上的介绍&#xff0c;如果有不足之处欢迎补充&#xff01;&#xff01;二 map新特性关于以下函数式编程的函数的计算知识追寻者都使用 简单字符串代替了&#xff0c;参数无非就是Key,value&#xff1b;2.1 forEachforEach迭代&a…

java 注解 target_详解JDK 5 Annotation 注解之@Target的用法

前言目前&#xff0c;越来越多的架构设计在使用注解&#xff0c;例如spring3.0、struts2等框架。让我们先来看看注解的定义。如下是一段使用了JDK 5 Annotation Target的代码&#xff1a;Target({ElementType.METHOD})Retention(RetentionPolicy.RUNTIME)InheritedDocumentedpu…

pajek软件使用方法_使用Jco远程连接SAP软件系统方法

作者&#xff1a;JongWill声明&#xff1a;本文章仅用于SAP软件的应用与学习&#xff0c;不代表SAP公司。(注&#xff1a;文中所示截图来源SAP软件&#xff0c;相应著作权归SAP所有。)SAP公司的ERP系统是一套成熟的套装软件&#xff0c;它是博大精深的&#xff0c;但也不是无所…

镜像浏览器_害怕win10镜像有第三方软件,直接到微软官网下载,原汁原味

很多时候我们在网上下载的一些win10镜像ISO文件都包含有一些第三方的软件&#xff0c;虽然这都是网站为了盈利而不得不做的&#xff0c;但是辛苦下载安装好的windows系统&#xff0c;如果有乱七八糟的软件心里真的会非常不舒服&#xff0c;甚至以前电脑城的win7所谓正版光碟都是…

post大小限制_作为一个程序员,面试中常问的get和post的区别,你真的知道吗

作为一个程序员无论是搞前端的还是搞后端的&#xff0c;只要问起来GET和POST的区别&#xff0c;都能说出来个一二三四来。你可能自己写过无数个GET和POST请求&#xff0c;或者也看过很多权威网站总结出来的区别&#xff0c;你非常清楚的知道什么时候用GET什么时候用POST.当你在…

java static 修饰变量吗_Java面试 - static 修饰的变量和方法有哪些特点?

1、static修饰的变量和方法&#xff0c;在类加载时即被初始化&#xff0c;可直接通过类名.变量名和类型.方法名进行调用。2、static修饰的变量&#xff0c;在类加载时会被分配到数据区的方法区。类的实例可共享方法区中的变量。如果static修饰的变量发生改变&#xff0c;那么所…

安卓手机如何防盗_如何设置安卓手机各版本USB调试模式

关注我们&#xff0c;获得更多资讯在这篇教学中&#xff0c;小蛙会详细向大家讲解USB调试模式的开启及关闭方法&#xff0c;以及其用途。在这个过程中&#xff0c;由于Android 机型众多&#xff0c;所以无办法列举太多。但请相信小蛙&#xff0c;开启USB 调试的操作方法基本上是…