MySQL 高负载 CPU

MySQL 高负载 CPU

我在使用 MariaDB 时遇到问题,当连接分析 ~ 200 mysql 时开始出现 132% 的负载,并将主 CPU 推到 40% 左右。导致网站速度极慢,我使用的是 centos 7(8GB 内存,2 核,NVME SSD + Nginx + php-fpm)

[客户]
#密码 = 你的密码
端口 = 3306
套接字 = /var/lib/mysql/mysql.sock

[mysqld]
等待超时=300
interactive_timeout = 300
binlog_cache_size = 128K
线程堆栈 = 256K
连接缓冲区大小 = 2048K
query_cache_type = 1
最大堆表大小 = 512M
端口 = 3306
套接字 = /var/lib/mysql/mysql.sock
数据目录 = /var/lib/mysql
默认存储引擎 = InnoDB
performance_schema_max_table_instances = 400
表定义缓存 = 400
跳过外部锁定
密钥缓冲区大小 = 384M
最大允许数据包 = 100G
表打开缓存 = 384
排序缓冲区大小 = 1024K
网络缓冲区长度 = 4K
读取缓冲区大小 = 1024K
read_rnd_buffer_size = 768K
myisam_sort_buffer_size = 16M
线程缓存大小 = 128
查询缓存大小 = 0
query_cache_type = 0
查询缓存限制 = 8M
tmp_table_size = 512M
#sql-mode=NO_ENGINE_SUBSTITUTION

#skip-name-resolve
最大连接数 = 500
最大连接错误数 = 100
打开文件限制 = 65535

登录 bin = mysql-bin
binlog_format=混合
服务器 ID = 1
过期日志天数 = 10
slow_query_log=1
慢速查询日志文件=/home/abc.com.com/logs/mysql-slow.log
长查询时间=3
#log_queries_not_using_indexes=on


innodb_data_home_dir = /var/lib/mysql
innodb_data_file_path = ibdata1:10M:自动扩展
innodb_log_group_home_dir = /var/lib/mysql
innodb_buffer_pool_size = 1G
innodb_log_file_size = 128M
innodb_log_buffer_size = 32M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
innodb_max_dirty_pages_pct = 90
innodb_read_io_threads = 2
innodb_write_io_threads = 2
innodb_buffer_pool_instances = 1


[mysqldump]
快的
最大允许数据包 = 500M

[mysql]
无自动重复

[myisamchk]
密钥缓冲区大小 = 64M
排序缓冲区大小 = 1M
读取缓冲区 = 2M
写入缓冲区 = 2M

[mysql热复制]
交互超时

通过 mysqltuner 进行调整

-------- 存储引擎统计 -----------------------------------------------------------------
[--] 状态:+ARCHIVE +Aria +BLACKHOLE +CSV +FEDERATED +InnoDB +MEMORY +MRG_MyISAM +MyISAM +PERFORMANCE_SCHEMA
[--] InnoDB 表中的数据:48.8M(表:21)
[确定] 碎片表总数:0

-------- 分析绩效指标 --------------------------------------------------------------------------
[--] innodb_stats_on_metadata:关闭
[确定] 查询 INFORMATION_SCHEMA 期间没有统计更新。

-------- 安全建议 ------------------------------------------------------------------
[OK] 数据库用户无匿名账户
[确定] 所有数据库用户都已分配密码
[!!] 没有基本密码文件列表!

-------- CVE 安全建议 --------------------------------------------------------------------------
[--] 由于 --cvefile 选项未定义而被跳过

-  -  -  -  性能指标  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - -
[--] 上传时间:8 分 0 秒(85K q [178.621 qps],6K conn,TX:41M,RX:7M)
[--] 读取/写入:98%/2%
[--] 二进制日志记录已启用(GTID 模式:开启)
[--] 物理内存:7.6G
[--] 最大 MySQL 内存:504.5G
[--] 其他进程内存:0B
[--] 总缓冲区:全局 2.0G + 每个线程 1.0G(最多 500 个线程)
[--] P_S 最大内存使用量:0B
[--] Galera GCache 最大内存使用量:0B
[!!] 达到最大内存使用量:95.5G(安装内存的 1250.25%)
[!!] 最大可能的内存使用量:504.5G(已安装 RAM 的 6604.94%)
[!!] 其他进程可能使用的总内存超出了内存限制
[OK] 慢速查询:0% (0/85K)
[OK] 可用连接的最高使用率:18% (93/500)
[OK] 中止连接:0.04% (3/6727)
[!!] 名称解析处于活动状态:每个新连接都会进行反向名称解析,这可能会降低性能
[确定] 由于多处理器机器上的互斥争用,查询缓存默认是禁用的。
[OK] 需要临时表的排序:0% (0 个临时排序/700 个排序)
[OK] 没有索引就没有连接
[!!] 磁盘上创建的临时表:88%(磁盘上 5K/总共 6K)
[OK] 线程缓存命中率:98% (已创建 93 个/6K 个连接)
[OK] 表缓存命中率:215% (114 打开 / 53 已打开)
[OK] table_definition_cache(400) 大于表数(261)
[确定] 使用的打开文件限制:0%(29/65K)
[OK] 立即获取表锁:100% (65K 立即/65K 锁)
[OK] Binlog 缓存内存访问:100.00% (1144 内存 / 1144 总计)

-------- 性能架构 ------------------------------------------------------------------------------------
[--] 性能模式已禁用。
[--] P_S 使用的内存:0B

-------- 线程池指标 ------------------------------------------------------------------------------------
[--] ThreadPool 状态已启用。
[--] 线程池大小:2 个线程。
[--] 对于您的版本 (10.0.38-MariaDB),使用默认值就足够了

-------- MyISAM 指标 ----------------------------------------------------------------------------------------
[!!] 已使用的密钥缓冲区:18.7% (已使用 75M / 402M 缓存)
[OK] 键缓冲区大小/总 MyISAM 索引:384.0M/123.0K
[OK] 读取密钥缓冲区命中率:99.7% (355 缓存/1 读取)
[OK] 写入密钥缓冲区命中率:100.0%(96 次缓存/96 次写入)

-------- InnoDB 指标 ----------------------------------------------------------------------------------------
[--] InnoDB 已启用。
[--] InnoDB 线程并发:0
[确定] InnoDB 每表文件已激活
[OK] InnoDB 缓冲池/数据大小:1.0G/48.8M
[OK] InnoDB 日志文件大小/InnoDB 缓冲池大小的比例:128.0M * 2/1.0G 应等于 25%
[确定] InnoDB 缓冲池实例:1
[--] 您的版本中未使用或定义 InnoDB 缓冲池块大小
[确定] InnoDB 读取缓冲区效率:100.00% (422760044 次命中/ 422761190 次总计)
[!!] InnoDB 写日志效率:46.23% (484 次命中/总共 1047 次)
[OK] InnoDB 日志等待:0.00%(0 次等待/1531 次写入)

-------- 咏叹调指标 ------------------------------------------------------------------------------------------
[--] Aria 存储引擎已启用。
[确定] Aria 页面缓存大小/Aria 总索引:128.0M/0B
[OK] Aria 页面缓存命中率:98.6% (146 次缓存/2 次读取)

-------- TokuDB 指标 ----------------------------------------------------------------------------------------
[--] TokuDB已被禁用。

-------- XtraDB 指标 ----------------------------------------------------------------------------------------
[--] XtraDB 已禁用。

-------- Galera 指标 ----------------------------------------------------------------------------------------
[--] Galera 已被禁用。

-------- 复制指标 -----------------------------------------------------------------------------------
[--] Galera 同步复制:否
[--] 该服务器没有复制从属服务器。
[--] Binlog格式:MIXED
[--] 已启用 XA 支持:开启
[--] 半同步复制主服务器:未激活
[--]半同步复制从属:未激活
[--] 这是一个独立服务器

-------- 建议 ---------------------------------------------------------------------------------------
一般建议:
    控制警告行进入 /var/lib/mysql/dichvu.err 文件
    控制错误行进入 /var/lib/mysql/dichvu.err 文件
    MySQL 在过去 24 小时内启动 - 建议可能不准确
    减少总体 MySQL 内存占用,提高系统稳定性
    将此服务器专用于您的数据库以获得最高性能。
    仅使用 ip 或子网配置您的帐户,然后使用 skip-name-resolve=1 更新您的配置
    临时表大小已经很大 - 减少结果集大小
    减少没有 LIMIT 子句的 SELECT DISTINCT 查询
    应激活性能模式以实现更好的诊断
    由于性能问题,不应为 MariaDB 10.0 激活性能模式
需要调整的变量:
  *** MySQL 的最大内存使用量过高,非常危险 ***
  *** 在增加 MySQL 缓冲区变量之前添加 RAM ***
    performance_schema = ON 启用 PFS
    performance_schema = OFF 禁用 PFS

请就此问题给我建议

CPU 负载高时释放 -m

              总计已用免费共享 buff/缓存可用
内存:7821 1421 4755 431 1644 5715
交换:1023 0 1023

答案1

tmp_table_size = 512M-- 太高了;将其限制为 RAM 的 1% 左右。(这不会对 CPU 造成太大影响,但有助于避免交换。)

CPU 过高意味着索引不当或查询表述不当。请使用 slowlog。更多: http://mysql.rjweb.org/doc.php/mysql_analysis#slow_queries_and_slowlog

然后在 stackoverflow.com 上发帖;那里有更多专注于 MySQL 的人员。

相关内容