MySQL · 专家投稿 · MySQL数据库SYS CPU高的可能性分析

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 问题背景 我们在管理繁忙的 MySQL 数据库时,可能都有碰到 SYS CPU 高的经历:系统突然 SYS CPU 高起来,甚至比 USER CPU 高很多,这时系统 QPS、TPS 急剧下降。 SYS CPU高是什么造成的呢?主要有2种可能: 1. context switch 不高,但

问题背景

我们在管理繁忙的 MySQL 数据库时,可能都有碰到 SYS CPU 高的经历:系统突然 SYS CPU 高起来,甚至比 USER CPU 高很多,这时系统 QPS、TPS 急剧下降。

SYS CPU高是什么造成的呢?主要有2种可能:
1. context switch 不高,但在内核态 spin,导致 SYS CPU 高
2. context switch 高,每秒超过 200K,有时超过1M,过多 context switch 导致 SYS CPU 高

下面我们对这两种情况逐一分析。

context switch 不高,但在内核态 spin

MySQL 在内核态 spin,说明需要系统资源,当这个资源紧张不足时,就会在内核态 spin。

有些资源,用户进程(或线程)通过执行系统调或因中断进入内核,一般来说申请这些资源的执行时间很短,当出现资源争用时,如果采用 sleep 再唤醒机制,代价较大,因此多采用在内核态spin的策略。

例如申请内存或发生缺页中断,没有 free 内存可用时,进程或线程就可能在内核态先执行内存回收再执行内存分配,但系统内存是共享资源,分配回收时需要锁保护,当多个进程(或线程)同时回收分配内存时。就会在内核态 spin。

当 free 内存不足时,可能出现这种情况。典型症状:

  1. MySQL running 高,但系统 qps、tps 下降
  2. 系统 free 内存不足;或系统 free 内存充足时,但启用了 numa 内存分配策略,有的节点 free 内存很少
  3. 系统 context switch 不高
  4. MySQL InnoDB 的 mutex、RWlock 查不到等待信息
  5. sar -B 显示有 pgscand 产生

分析

当系统内存不足时,MySQL 突然有大量访问,紧急需要大量内存,kswapd 在短时间内回收不了足够多的 free 内存,或 kswapd 还没有触发执行,这时 MySQL 用户线程就会在内核态执行内存回收操作,从而出现以上症状。

sar -B 输出中,pgscank 是表示内核线程 kswapd 回收内存,k意思是 kernel;pgscand是表示用户进程或线程直接回收内存,d意思是direct。

解决办法:保证系统有充足 free 内存可用,NUMA 环境要求每个节点都有足够free内存可用。

由于 Linux 系统会尽量使用 free 内存,一个运行很久的 Linux 系统,free内存通常很少,存在大量 filecache 内存,但 Linux 没有直接提供控制 filecache 占用多少的参数,那怎么能够保留足够可用的 free 内存,以应对突然内存需求呢?

对此,Linux 2.3.32+ 内核中增加一个新的参数vm.extra_free_kbytes,就是控制free内存的。

关于系统free内存,有2个重要参数:vm.min_free_kbytes 和 vm.extra_free_kbytes(2.6.32+)

vm.min_free_kbytes:系统保留给内核用的内存。

这个值决定 /proc/zoneinfo 中 zone 的min值。当系统 free 内存小于这个值时,kswapd 会回收内存,直到free内存达到/proc/zoneinfo中 high 值才停止回收;

当用户进程或线程分配内存或发生缺页中断时,free 内存少于 vm.min_free_kbytes,会在用户线程上下文中直接进行回收内存(pgscand)和分配内存。

vm.extra_free_kbytes:系统保留给应用的free内存。

这个值决定了/proc/zoneinfo中Normal zone的low值。当系统free内存小于vm.min_free_kbytes + vm.extra_free_kbytes 时,kswapd会开始回收内存,直到free内存达到 /proc/zoneinfo 中high值才停止回收。

这个额外的vm.extra_free_kbytes就是给应用突发内存需求时使用的,避免急需内存时发生pgscand或kswapd回收内存不及时。

vm.extra_free_kbytes 分配多大合适呢?一般能应对流量高峰时1-2秒内存需求就可以了。free内存减少后,kswapd进程会在后台回收内存的,一般512M-2G可以满足要求。

context switch 高

有很多种情况都会导致 context switch。MySQL 中的 mutex 和 RWlock 在获取不成功后,短暂spin,还不成功,就会发生 context switch,sleep,等待唤醒。

在 MySQL中,mutex 和 RWlock导致的 context switch,一般在show global status,show engine innodb mutex,show engine innodb status,performance_schema等中会体现出来,针对不同的mutex和RWlock等待,可以采取不同的优化措施。

除了MySQL的mutex和RWlock,还发现一种情况,是MySQL外的mutex竞争导致context switch高。

典型症状:

  1. MySQL running 高,但系统 qps、tps 低
  2. 系统context switch很高,每秒超过200K
  3. 在 MySQL 内存查不到mutex和RWlock竞争信息
  4. SYS CPU 高,USER CPU 低
  5. 并发执行的SQL中出现timestamp字段,MySQL的time_zone设置为system

分析

对于使用 timestamp 的场景,MySQL 在访问 timestamp 字段时会做时区转换,当 time_zone 设置为 system 时,MySQL 访问每一行的 timestamp 字段时,都会通过 libc 的时区函数,获取 Linux 设置的时区,在这个函数中会持有mutex,当大量并发SQL需要访问 timestamp 字段时,会出现 mutex 竞争。

MySQL 访问每一行都会做这个时区转换,转换完后释放mutex,所有等待这个 mutex 的线程全部唤醒,结果又会只有一个线程会成功持有 mutex,其余又会再次sleep,这样就会导致 context switch 非常高但 qps 很低,系统吞吐量急剧下降。

解决办法:设置time_zone=’+8:00’,这样就不会访问 Linux 系统时区,直接转换,避免了mutex问题。

另外,对于spin消耗,MySQL配置变量中的innodb_spin_wait_delay 和 innodb_sync_spin_loops 可以用于微调。

作者介绍
高亚芳 北京理工大学计算机系毕业,IT行业老兵,目前负责数据存储基础架构工作,开源爱好者。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
16天前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
20天前
|
SQL 关系型数据库 MySQL
【MySQL】SQL分析的几种方法
以上就是SQL分析的几种方法。需要注意的是,这些方法并不是孤立的,而是相互关联的。在实际的SQL分析中,我们通常需要结合使用这些方法,才能找出最佳的优化策略。同时,SQL分析也需要对数据库管理系统,数据,业务需求有深入的理解,这需要时间和经验的积累。
42 12
|
23天前
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
28天前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
28天前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
2月前
|
关系型数据库 MySQL OLAP
无缝集成 MySQL,解锁秒级 OLAP 分析性能极限,完成任务可领取三合一数据线!
通过 AnalyticDB MySQL 版、DMS、DTS 和 RDS MySQL 版协同工作,解决大规模业务数据统计难题,参与活动完成任务即可领取三合一数据线(限量200个),还有机会抽取蓝牙音箱大奖!
|
2月前
|
存储 监控 数据挖掘
消防行业如何借助时序数据库 TDengine 打造高效的数据监控与分析系统
本篇文章来自“2024,我想和 TDengine 谈谈”征文活动的优秀投稿,深入探讨了如何在消防行业中运用 TDengine 进行业务建模。文章重点介绍了如何通过 TDengine 的超级表、标签设计和高效查询功能,有效管理消防监控系统中的时序数据。作者详细阐述了实时监控、报警系统以及历史数据分析在消防行业中的应用,展示了 TDengine 在数据压缩、保留策略和分布式架构下的强大优势。
57 0
|
3月前
|
存储 数据挖掘 数据处理
2600 万表流计算分析如何做到? 时序数据库 TDengine 助力数百家超市智能化转型
在生鲜超市的高效运营中,实时数据分析至关重要。万象云鼎的“云鲜生”通过智能秤+网关+软件系统的组合,实现了销售数据的精准管理与优化。而在数据处理方面,TDengine 的流计算能力成为了这一方案的核心支撑。本文详细分享了“云鲜生”如何利用 TDengine 高效存储和分析海量销售数据,在优化超市运营、提升用户体验的同时,解决高基数分组、高并发查询等技术挑战。
79 1
|
4月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
170 7
MySQL事务日志-Undo Log工作原理分析
|
4月前
|
关系型数据库 MySQL 数据库
mysql慢查询每日汇报与分析
通过启用慢查询日志、提取和分析慢查询日志,可以有效识别和优化数据库中的性能瓶颈。结合适当的自动化工具和优化措施,可以显著提高MySQL数据库的性能和稳定性。希望本文的详解和示例能够为数据库管理人员提供有价值的参考,帮助实现高效的数据库管理。
108 11

相关产品

  • 云数据库 RDS MySQL 版