![MySQL 高负载 CPU](https://linux22.com/image/767504/MySQL%20%E9%AB%98%E8%B4%9F%E8%BD%BD%20CPU.png)
我在使用 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 的人员。