mysql 高 CPU 使用率 (280%)

Posted

技术标签:

【中文标题】mysql 高 CPU 使用率 (280%)【英文标题】:mysql high cpu usage (280%) 【发布时间】:2018-09-14 03:39:25 【问题描述】:

嗨,我的服务器 cpu mysql 使用率 280 % 我的 cnf 文件

[mysqld_safe] 套接字 = /var/run/mysqld/mysqld.sock 不错 = 0 [mysqld] 用户 = mysql pid 文件 = /var/run/mysqld/mysqld.pid 套接字 = /var/run/mysqld/mysqld.sock 端口 = 3306 basedir = /usr 数据目录 = /var/lib/mysql tmpdir = /tmp lc-messages-dir = /usr/share/mysql 跳过外部锁定 绑定地址 = 127.0.0.1 线程堆栈 = 192K 线程缓存大小 = 32 myisam-recover-options = 备份 query_cache_limit = 128M log_error = /var/log/mysql/error.log expire_logs_days = 1 最大连接数 = 500 max_user_connections = 500 排序缓冲区大小 = 2M key_buffer_size = 128M tmp_table_size = 128M innodb_log_file_size = 16M 跳过名称解析=1 最大连接错误 = 100 并发插入 = 2 连接超时 = 30 query_cache_size = 32M 查询缓存类型 = 0 table_open_cache = 12000 open_files_limit=24000 等待超时 = 14400 交互超时 = 14400 低优先级更新 = 1 读取缓冲区大小 = 5M log_queries_not_using_indexes = 1

我的 mysql 调谐器输出

>> MySQLTuner 1.7.7 - 海登少校 >> 在 http://mysqltuner.com/ 上的错误报告、功能请求和下载 >> 使用“--help”运行以获取其他选项和输出过滤 [--] 跳过 MySQLTuner 脚本的版本检查 [OK] 使用 debian 维护帐户的凭据登录。 [OK] 当前运行支持的 MySQL 版本 5.7.21-0ubuntu0.16.04.1 [OK] 在 64 位架构上运行 -------- 日志文件建议 ---------------------------------------- -------------------------- [--] 日志文件:/var/log/mysql/error.log(83K) [OK] 日志文件 /var/log/mysql/error.log 存在 [OK] 日志文件 /var/log/mysql/error.log 可读。 [OK] 日志文件 /var/log/mysql/error.log 不为空 [OK] 日志文件 /var/log/mysql/error.log 小于 32 Mb -------- 存储引擎统计 ---------------------------------------- -------------------------- [--] 状态:+ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MEMORY +MRG_MYISAM +MyISAM +PERFORMANCE_SCHEMA [--] MyISAM 表中的数据:120M(表:4) [--] InnoDB 表中的数据:106M(表:53) [OK] 碎片表总数:0 -------- 安全建议 ---------------------------------------- -------------------------- [OK] 没有任何数据库用户的匿名帐户 [OK] 所有数据库用户都分配了密码 [!!] 用户 'root@%' 没有特定的主机限制。 [--] 列表中有 612 个基本密码。 -------- CVE 安全建议 ---------------------------------------- ---------------------- [OK] 未找到您的版本的安全 CVE - - - - 性能指标 - - - - - - - - - - - - - - - - - - - - ------------------------------------------- [--] 最多:10m 44s(77K q [120.610 qps],9K conn,TX:754M,RX:89M) [--] 读取/写入:78% / 22% [--] 二进制日志被禁用 [--] 物理内存:49.1G [--] MySQL 最大内存:4.8G [--] 其他进程内存:494.7M [--] 总缓冲区:全局 320.0M + 每个线程 7.7M(最大 600 个线程) [--] P_S 最大内存使用量:72B [--] Galera GCache 最大内存使用量:0B [OK] 达到的最大内存使用量:3.3G(已安装 RAM 的 6.75%) [OK] 最大可能内存使用量:4.8G(已安装 RAM 的 9.80%) [OK] 与其他进程的总体可能内存使用量与可用内存兼容 [OK] 慢查询:0% (0/77K) [OK] 可用连接的最高使用率:66% (400/600) [OK] 中止连接:0.01% (1/9317) [!!] 由于互斥量争用,查询缓存可能默认被禁用。 [!!] 查询缓存效率:0.0%(0 缓存/46K 选择) [OK] 每天查询缓存修剪次数:0 [OK] 需要临时表的排序:0%(0 个临时排序/26 个排序) [OK] 没有没有索引的连接 [OK] 在磁盘上创建的临时表:0%(磁盘上 63 / 总共 9K) [OK] 线程缓存命中率:80%(创建 1K / 9K 连接) [OK] 表缓存命中率:92%(1K 打开/1K 打开) [OK] 使用的打开文件限制:21% (225/1K) [!!] 立即获得表锁:76% -------- 性能模式 ---------------------------------------- -------------------------------- [--] P_S 使用的内存:72B [--] 系统架构已安装。 -------- 线程池指标 ---------------------------------------- -------------------------------- [--] 线程池统计被禁用。 -------- MyISAM 指标 ---------------------------------------- ---------------------------------- [!!] 使用的密钥缓冲区:18.3%(已使用 24M / 134M 缓存) [OK] 密钥缓冲区大小/MyISAM 索引总数:128.0M/4.5M [OK] Read Key 缓冲区命中率:99.9%(12K 缓存/15 次读取) [!!] 写入键缓冲区命中率:38.7%(1K 缓存/416 次写入) -------- InnoDB 指标 ---------------------------------------- ---------------------------------- [--] InnoDB 已启用。 [--] InnoDB 线程并发:0 [OK] 每个表的 InnoDB 文件被激活 [OK] InnoDB 缓冲池/数据大小:128.0M/106.4M [OK] InnoDB log file size / InnoDB Buffer pool size: 16.0M * 2/128.0M 应该等于 25% [OK] InnoDB 缓冲池实例:1 [--] InnoDB 缓冲池块数:1 代表 1 个缓冲池实例 [OK] Innodb_buffer_pool_size 与 Innodb_buffer_pool_chunk_size & Innodb_buffer_pool_instances 对齐 [OK] InnoDB 读取缓冲区效率:100.00%(366193213 hits/ 366199541 total) [OK] InnoDB 写入日志效率:95.85%(219192 hits/ 228694 total) [OK] InnoDB 日志等待:0.00%(0 次等待 / 9502 次写入) -------- AriaDB 指标 ---------------------------------------- ---------------------------------- [--] AriaDB 被禁用。 -------- TokuDB 指标 ---------------------------- ---------------------------------- [--] TokuDB 被禁用。 -------- XtraDB 指标 ---------------------------- ---------------------------------- [--] XtraDB 被禁用。 -------- RocksDB 指标 ---------------------------------------- ---------------------------------- [--] RocksDB 被禁用。 -------- 蜘蛛指标 ---------------------------------------- ---------------------------------- [--] 蜘蛛被禁用。 -------- 连接指标 ---------------------------------------- ---------------------------------- [--] 连接被禁用。 -------- Galera Metrics ---------------------------------------- ---------------------------------- [--] Galera 被禁用。 -------- 复制指标 ---------------------------------------- ------------------------------------------- [--] Galera 同步复制:否 [--] 此服务器没有复制从属服务器。 [--] Binlog 格式:ROW [--] XA 支持启用:开 在连接 (.) 或字符串中使用未初始化的值 $_[0] mysqltuner.pl 第 233 行 (#1) (W 未初始化)一个未定义的值被使用,就好像它已经被使用一样 定义。它被解释为“”或 0,但可能是一个错误。 要抑制此警告,请为您的变量分配一个定义的值。 为了帮助您找出未定义的内容,perl 会尝试告诉您 未定义的变量(如果有)的名称。在某些情况下 它不能这样做,所以它还会告诉你你使用了什么操作 未定义的值。但是请注意,perl 优化了您的程序 并且警告中显示的操作不一定会出现 从字面上看,在您的程序中。例如,“that $foo”通常是 优化为 "that" 。 $foo,警告将指向 连接 (.) 运算符,即使没有 .在 你的程序。 [--] [--] [--] 这是一个独立的服务器 -------- 建议 ----------------------------------------- ---------------------------------- 一般建议: 将警告行控制到 /var/log/mysql/error.log 文件中 将错误行控制到 /var/log/mysql/error.log 文件中 将 user@% 的主机限制为 user@SpecificDNSorIp MySQL 在过去 24 小时内启动 - 建议可能不准确 优化查询和/或使用 InnoDB 减少锁等待 要调整的变量: query_cache_size (=0) query_cache_type (=0) query_cache_limit (> 128M, 或使用更小的结果集)

请帮帮我

【问题讨论】:

为什么这个 mysql 相关或 php 从 Alex 之前的编辑中删除的标签中?请相应地标记。 如果减少 max_connectionsmax_user_connections 会发生什么? 这个问题nothing 与编码有关,完全不适合***。服务器故障可能是一个更好的地方。 高 CPU 几乎总是由于缺少索引(尤其是“复合”索引)和/或查询公式不佳。打开慢日志以确定“最差”的查询。然后让我们讨论它们。 (您无法通过调优来解决 CPU 问题。) 【参考方案1】:

为您的 my.cnf-ini [mysqld] 部分考虑的建议

max_connect_errors=10  # from 100 - do not be so liberal with hackers/crackers
key_buffer_size=48M  # from 128M only 24M used
query_cache_size=0  # from 32M to disable QC - insist on quality coding
max_heap_table_size=128M  # should always be same as tmp_table_size
innodb_buffer_pool_size=256M  # from 128M for growth of data/ndxs
read_buffer_size=128K  # from 5M more than default is not necessary
thread_cache_size=100  # from 32 to support > 1000 threads_created V8 CAP=100
query_cache_limit=1K  # from 128M to conserve RAM and keep framework for QC
query_cache_min_res_unit=512  # from 4096 for more efficient use of QC if ever used
low_priority_updates=0  # from 1 for storage ASAP
log_queries_not_using_indexes=0  # from 1 only use when FOCUS is specific to avoid intermingling with Slow Queries
expire_logs_days=30  # from 1 V8 will default to 30 days
log_warnings=2  # for addl information when connection fails

当您想查找不使用索引的查询时,

long_query_time=5000  # yes, 5000 seconds and 
min_examined_row_limit=1  # to avoid clutter
log_queries_not_using_indexes=1

然后,一个小时后,返回正常的慢查询日志:

long_query_time=nn  # whatever seconds you use typically
min_examined_row_limit=0  # if that is your typical limit and
log_queries_not_using_indexes=0   # for slow queries only

如果您可以发布以下文本结果 ulimit -a 我们会知道您正在使用的操作系统限制。

我们仍然想知道您的 ulimit 值设置为多少。

【讨论】:

将此配置用于 64gb 内存? 您的 Mysqltuner 报告表明您有 ~50G RAM 可用。您何时发布 ulimit -a 以便我们知道您可用的操作系统限制? 2018 年 4 月 5 日提供的建议应该适用于您的 50G MySQL 实例。 long_quer_time 使用 1 秒。 @coloner1995 我在 2018 年 4 月 5 日的建议对于 64G 服务器应该没问题。您是否有机会发布 ulimit -a 的结果以便我们知道您的打开文件限制?

以上是关于mysql 高 CPU 使用率 (280%)的主要内容,如果未能解决你的问题,请参考以下文章

高CPU消耗MySQL

mysql-CPU使用率高处理

zabbix服务器mysql cpu利用率比较高

mysql经常占用cpu100%以上,该怎么解决

记一次mysql 导致的CPU使用率过高问题

Centos 7 , WHM 高 Mysql&MariaDB CPU 使用率 %600