1. 系统环境

OS: CentOS Linux release 7.8.2003 (Core)

Kernel: 3.10.0-1127.19.1.el7.x86_64

MySQL: 用5.0、5.7均有此问题,应该和版本无关

2. 压测工具

benchyou[1]

mysql_random_load[2]

3. 问题现象

利用 mysql_random_load 工具连接MySQL写入数据时,性能非常非常低。

由于 mysql_random_load 工具不支持通过socket连接,只好放弃,改用benchyou。顺便说一下,benchyou和sysbench极为相似,也非常好用。

改用benchyou工具后,压测正常。看来的确不是MySQL版本的问题。

用 mysql_random_load 工具进行压测时,系统负载非常高,同时可观测到系统的中断也很高并且也很不均衡。

[root@yejr.run]# vmstat -S m 1

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----

r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

2  0      0  73585      2  41051    0    0   117    91    4    2  0  0 99  0  0

2  0      0  73585      2  41051    0    0     0 28320 55444 100207 18  2 80  0  0

4  0      0  73584      2  41052    0    0     0  1936 52949 98607 18  2 81  0  0

2  0      0  73583      2  41052    0    0     0  4864 56375 101262 14  2 84  0  0

4  0      0  73583      2  41052    0    0     0 29064 55806 103715 19  2 80  0  0

5  0      0  73583      2  41052    0    0     0  5704 55854 98386 15  2 83  0  0

可以看到 system.in 这列的值非常高,改成benchyou工具后,这列的值从5.5万降到1.6万。

[root@yejr.run]# vmstat -S m 1

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----

r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

4  0      0  77238      2  38371    0    0   118    88    2    3  0  0 99  0  0

2  0      0  77234      2  38374    0    0     0 31620 16039 77988  3  2 95  0  0

2  0      0  77231      2  38377    0    0     0 31996 16091 78926  3  2 95  0  0

3  0      0  77229      2  38378    0    0     0 33028 16347 81006  3  2 95  0  0

0  0      0  77226      2  38383    0    0     0 52412 15496 75715  3  2 95  0  0

2  0      0  77224      2  38384    0    0     0 32252 16167 79352  3  2 95  0  0

再看下有问题时的系统中断表现

[root@yejr.run]# mpstat -I SUM -P ALL 1

Linux 3.10.0-1127.19.1.el7.x86_64 (yejr.run)  09/28/2020  _x86_64_ (32 CPU)

05:37:40 PM  CPU    intr/s

05:37:41 PM  all  51833.00

05:37:41 PM    0   2069.00

05:37:41 PM    1   1159.00

05:37:41 PM    2   2979.00

05:37:41 PM    3   1580.00

05:37:41 PM    4   1627.00

05:37:41 PM    5   1461.00

05:37:41 PM    6   1243.00

05:37:41 PM    7   1825.00

05:37:41 PM    8   2154.00

05:37:41 PM    9   1367.00

05:37:41 PM   10   1277.00

05:37:41 PM   11   1376.00

05:37:41 PM   12   4085.00

05:37:41 PM   13   1601.00

05:37:41 PM   14   4045.00

05:37:41 PM   15   1857.00

05:37:41 PM   16   1692.00

05:37:41 PM   17    722.00

05:37:41 PM   18    118.00

05:37:41 PM   19   1862.00

05:37:41 PM   20   1637.00

05:37:41 PM   21   1130.00

05:37:41 PM   22   1750.00

05:37:41 PM   23   1653.00

05:37:41 PM   24   1417.00

05:37:41 PM   25   1547.00

05:37:41 PM   26   1500.00

05:37:41 PM   27   1033.00

05:37:41 PM   28     20.00

05:37:41 PM   29   1683.00

05:37:41 PM   30    888.00

05:37:41 PM   31   1549.00

可以看到每秒中断总量有5.5万,但多个CPU间并不均衡。

4. 问题分析

初步认定是因为系统中断太高导致的写入性能差,并且也认定是因为多个CPU间中断不均衡导致的这个问题。

观察是都有哪些中断比较高,发现主要是 LOC 和 RES 这两个每秒的增长比较大。

[root@yejr.run]# watch -d cat /proc/interrupts

...

LOC: 2468939840 2374791518 2373834803 2373613050   Local timer interrupts

SPU:          0          0          0          0   Spurious interrupts

PMI:          0          0          0          0   Performance monitoring interrupts

IWI:   50073298   45861632   45568755   45833911   IRQ work interrupts

RTR:          0          0          0          0   APIC ICR read retries

RES: 3472920231 3022439316 2990464825 3012790828   Rescheduling interrupts

CAL:    5131479    6539715   17285454   11211131   Function call interrupts

TLB:   23094853   24045725   24230472   24271286   TLB shootdowns

TRM:          0          0          0          0   Thermal event interrupts

...

在尝试修改相关中断号绑定的CPU后(参考:SMP affinity and proper interrupt handling in Linux[3]),问题还是没有得到缓解。

后来某神秘大佬给指点了下,才发现原来是个内核的bug,涉及到参数 kernel.timer_migration,需要将其设置为 0 才行。

[root@yejr.run]# sysctl -w kernel.timer_migration=0

当然了,最好持久化写入到 /etc/sysctl.conf 文件中。

[root@yejr.run]# cat /etc/sysctl.conf

kernel.timer_migration=0

#加载配置文件使之生效

[root@yejr.run]# sysctl -p

再次用 mysql_random_load 工具进行压测就没事了。

下面是关于该bug的描述

The bug is when linux os receive too many tcp packages,

and the tcp may add too many timer, but in

get_target_base->get_nohz_timer_target it check current

cpu is idle, sometimes thouth the current core is very busy,

but the idle_cpu result is 1, in this time

if set kernel.timer_migration=1 ,the timer will be move to next cpu.

bug详情见:Bug 124661 - kernel.timer_migration=1 cause too many Rescheduling interrupts[4]

最后,值得一提的是,在云主机上修改该参数应该是不管用,除非修改物理机的。我在某云主机上运行 mysql_random_load 工具压测也遇到类似问题,修改内核参数后问题依旧。

文内链接

[1]:https://github.com/xelabs/benchyou

[2]:https://github.com/Percona-Lab/mysql_random_data_load

[3]:http://www.alexonlinux.com/smp-affinity-and-proper-interrupt-handling-in-linux

[4]:https://bugzilla.kernel.org/show_bug.cgi?id=124661

全文完。

Enjoy Linux & MySQL :)

「MySQL核心优化」课已升级到MySQL 8.0,扫码开启MySQL修行之旅

mysql压测宕机_MySQL压测时Linux中断异常飚高,原来是因为...相关推荐

  1. mysql主从 主机宕机_MySQL主从宕机的解决方法

    测试系统:centos6.5系统 测试环境IP地址划分: master: 192.168.80.130 slave:192.168.80.143 slave:192.168.80.146 首先模拟(M ...

  2. linux压测接口工具,jmeter压测工具

    一.目录文件讲解 目录 bin:核心可执行文件,包含配置 mac/linux:使用jmeter启动 windows:使用jmeter.bat启动 jmeter-server:mac/linux分布式压 ...

  3. dubbo 服务压测_全链路压测资料汇总——业内大厂解决方案

    最近忙于公司的全链路压测平台调研和技术规划文档输出工作,参考了全网能搜到的业内大厂的全链路压测方案,这里做个汇总,以及将个人认为可以落地的方案做一个关键点整理. 技术链接 滴滴全链路压测解决之道 阿里 ...

  4. 什么是预热 压测_全链路压测探索实践之路

    背景 去年双十一,为了应对零点的峰值流量冲击,我们在八月下旬启动了全链路压测第一次实践.由于从零开始,因此单独搭建了一套和生产1:1的环境,2个月的时间,光环境成本就高达几百万.经过双十一,压测团队从 ...

  5. 【web压测】压测常用工具、压测指标到底是什么?

    压测常用工具.压测指标到底是什么? 一.压测指标-I 1.QPS,每秒查询 2.TPS,每秒事务 3.RT,响应时间 二.压测指标-II 三.压测工具 1.ab 2.go-wrk(在window上压测 ...

  6. ab压测_上传图片进行压测

    上传图片进行ab压测 背景 今天在做图片分类任务的压力测试,我使用ab(Apache Benchmark)这个压测工具进行压测,这里完整记录下如何上传图片进行ab压测. 流程 整个压测流程大致有以下三 ...

  7. 性能优化与压测引擎二:分布式压测引擎pea

    性能优化与压测引擎二:分布式压测引擎pea 分布式压测引擎pea 基本介绍 视频演示 创建任务 任务执行中的节点状态 整体报告 单个请求细节报告 分布式压测引擎pea 前面介绍了gatling是铺垫, ...

  8. linux内存不足宕机,记一次linux机器内存占用太多导致的服务宕机

    背景 最近我们测试环境部署的一个项目总是不停的宕机,之前也有过,但是最近特别频繁 猜测 可能是因为cup或者内存占用太大导致的服务宕机 执行 1.登录linux服务器 2.top命令 下面是对每一行信 ...

  9. Linux服务器压测/拷机软件收集

    最近公司采购了一批服务器,于是收集了一些拷机软件来压测服务器硬件性能.硬件的稳定相对来说比较重要,7x24小时无间断运行,主要看三个硬件:CPU.内存.硬盘. 下面是收集的一些教程,可能网址已经失效了 ...

  10. mysql主库宕机能写吗_MYSQL主主切换(主库宕机)_MySQL

    bitsCN.com MYSQL主主切换(主库宕机) 将主主(3307写--3308读)切换 前提:3307宕机 一.修改配置文件.命令行操作 vim /home/bbq/mysql/mysql-33 ...

最新文章

  1. Python学习笔记整理(十六)类的设计
  2. git push 如何同时推送至两个git仓库
  3. 让Linux系统崩溃最快速的方法
  4. 常考数据结构与算法:子数组中的最大累加和问题
  5. 感情沟通出了问题要怎么解决_对待感情最理性的星座,懂得如何沟通,会想办法解决问题...
  6. 可视化mysql怎么导入sql文件_使用navicat导入sql文件的方法步骤
  7. java 1.8新增功能_睡觉时:新增的Java 8新增功能
  8. 前端学习(2368):编程式导航
  9. C++将一个数字转化为string的现成方法
  10. loadrunner11完整卸载
  11. 手机锁屏js倒计时停止问题解决办法探索
  12. 蓝桥杯---等差数列(C语言)
  13. 顺势而为,戴尔加速流动文件系统进化
  14. 无法import的原因(ImportError: No module named *****)
  15. java迭代遍历_JAVA集合中的迭代器的遍历
  16. 白话空间统计之:空间自相关
  17. 【历史上的今天】8 月 31 日:人工智能起源;GPU诞生;Windows 98中文版来了
  18. 2022最新简历模板
  19. 从OSPO 来思考开源治理问题
  20. 多个txt文件合并成一个txt文件、多个csv文件合并成一个csv文件

热门文章

  1. 判断字符串是只是数字
  2. 树莓派 之 动态DNS(DNSPod)
  3. android ui机制的学习笔记
  4. poj Ancient Cipher 古代密码
  5. HTML5模板生成工具
  6. HP LaserJet P1007 装不到驱动
  7. 25.Yii2 自动加载
  8. 13.Linux/Unix 系统编程手册(上) -- 文件IO缓冲
  9. 57.should merge Js
  10. 54. Attribute isId 属性