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…

python怎么播放mp3_python上播放mp3歌曲

试试这个。它过于简单但可能不是最好的方法。from pygame import mixer # Load the required librarymixer.init()mixer.music.load(e:/LOCAL/Betrayer/Metalik Klinik1-Anak Sekolah.mp3)mixer.music.play()请注意&#xff0c;支持MP3pip install pygame第二种方法试一试使用p…

python语言发明者 google_谷歌的语言何以战胜Python?50%的人都应该立即学习Golang...

全文共2623字&#xff0c;预计学习时长9分钟图源&#xff1a;dailybtc很多软件工程师视Python为最喜爱的语言之一&#xff0c;工作生活都和它死死绑定在一起。但Google, Uber, Dropbox, Soundcloud, Slack, 和Medium的软件工程师并不是这样。长期以来&#xff0c;顶级企业的程序…

python基础文档_python基本文件操作

python文件操作python的文件操作相对于java复杂的IO流简单了好多&#xff0c;只要关心文件的读和写就行了基本的文件操作要注意的是&#xff0c;当不存在某路径的文件时&#xff0c;w&#xff0c;a模式会自动新建此文件夹&#xff0c;当读模式&#xff0c;文件不存在&#xff0…

python如何计算整数和_python 整数和浮点数

Python支持对整数和浮点数直接进行四则混合运算&#xff0c;运算规则和数学上的四则运算规则完全一致。基本的运算&#xff1a;1 2 3 # > 64 * 5 - 6 # > 147.5 / 8 2.1 # > 3.0375使用括号可以提升优先级&#xff0c;这和数学运算完全一致&#xff0c;注意只能使用…

cocoscreator连接MySQL_CocosCreator幼麟麻将搭建步骤

我的客户端和服务器都是在本机Windows8上搭建的&#xff0c;软件环境为&#xff1a;MySQL&#xff1a;5.7Node.js&#xff1a;6.11.0CocosCreator&#xff1a;1.6.2步骤如下&#xff1a;一、服务器环境搭建1、安装MySql数据库(百度)2、登录MySql: mysql –u用户名 –p密码 (登录…

hikaricp mysql_使用 HikariCP 数据源

概述HikariCP是Spring Framework 5.0的默认 数据库连接池&#xff0c;这得益于他的高性能。但是如果配置不当&#xff0c;数据库连接池也可能因影响到系统性能。重要参数maximum-pool-sizeminimum-idlepool-nameauto-commitidle-timeoutmax-lifetimeconnection-timeout初始化过…

return两个返回值_异步函数的两个视角

我们来一起看一下两个程序员之间的故事。以下示例代码是用Scala写的&#xff0c;不过本文所讲的话题并不仅限于Scala&#xff0c;任何有Future/Promise支持的语言都是适用的。下面这个wiki页面罗列了各个有Future/Promise支持的语言&#xff0c;已经涵盖了大多数的常用语言。Fu…

python怎么控制速度_如何控制python的ThreadPoolExecutor的吞吐量速度?

我使用python的concurrent.futuresThreadPoolExecutor启动异步任务。按照this方法&#xff0c;我使用tqdm进度条监视异步调用的进度。在我的代码如下所示&#xff1a;with concurrent.futures.ThreadPoolExecutor(max_workers n_jobs) as executor:future_to_url {executor.s…

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…

mysql数据库更新数据库语句_MySQL数据库之UPDATE更新语句精解

UPDATE和REPLACE基本类似&#xff0c;但是它们之间有两点不同。1. UPDATE在没有匹配记录时什么都不做&#xff0c;而REPLACE在有重复记录时更新&#xff0c;在没有重复记录时插入。2. UPDATE可以选择性地更新记录的一部分字段。而REPLACE在发现有重复记录时就将这条记录彻底删除…

ubuntu安装python编译器_Ubuntu中安装VIM编辑器

Ubuntu安装好以后&#xff0c;默认是安装使用nano编辑器。不过这对于用惯了vim的人可能会有些不习惯。好在Ubuntu下安装vim还是比较简单的&#xff0c;使用如下命令即可&#xff1a;sudoapt-get install vim(apt-get install vim-full这下就好了 在输入 :syntax on 或者把/etc/…

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

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

MySQL故障检测_检测MySQL的表的故障的方法

表的故障检测和修正的一般过程如下&#xff1a;检查出错的表。如果该表检查通过&#xff0c;则完成任务&#xff0c;否则必须修复出错的数据库表。在开始修复之前对表文件进行拷贝&#xff0c;以保证数据的安全。开始修复数据库表。如果修复失败&#xff0c;从数据库的备份或更…

mysql约束_Mysql约束条件

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

mysql导入greenplum_greenPlum中通过gpfdist导入文本数据到数据库表中

1.python版本要求2.4.4以上[roottest install]# pythonPython 2.6.2 (r262:71600, May 14 2009, 10:46:21)[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2Type "help", "copyright", "credits" or "license" for more informatio…

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

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

python小车行驶路线图_基于opencv-Python小车循线学习笔记

基于opencv-Python小车循线学习笔记加入摄像头模块&#xff0c;让小车实现自动循迹行驶思路为&#xff1a;摄像头读取图像&#xff0c;进行二值化&#xff0c;将白色的赛道凸显出来选择下方的一行像素&#xff0c;黑色为0&#xff0c;白色为255找到白色值的中点目标中点与标准中…