Mysqld 总是以 90% 的 CPU 运行

Mysqld 总是以 90% 的 CPU 运行

我最近将我的 magento 商店从共享主机环境移至私有 VPS。VPS 运行 CentOS、mysql、nginx 和 php-fpm。

我的 VPS 有 4GB RAM 和 4 个 CPU 核心。目前我的网站规模很小,但希望其访客数量会增加。

无论如何,这就是我的问题。Mysqld 总是以 90% 的 CPU 运行。即使没有活动进程,在启动时,也总是如此。不多不少。我已经搜索过这个问题,但没有找到任何可以解决它的方法。

如果有人愿意仔细查看 my.cnf 文件,我将非常感激,看看问题是否是由错误配置引起的,我对这项服务器管理工​​作还很陌生。

[mysql]

# CLIENT #
port                           = 3306
socket                         = /var/lib/mysql/mysql.sock

[mysqld]
query_cache_limit=4M
query_cache_size=16M
query_cache_type=1
sort_buffer_size=1M
read_buffer_size=2M
read_rnd_buffer_size=1536K
join_buffer_size=2M
bulk_insert_buffer_size = 8M
max_allowed_packet = 64M
thread_stack = 192K


# GENERAL #
user                           = mysql
default_storage_engine         = InnoDB
socket                         = /var/lib/mysql/mysql.sock
pid_file                       = /var/run/mysqld/mysqld.pid
symbolic-links=0
skip-networking
skip-slave-start
log_warnings=0


# SAFETY #
skip_name_resolve
innodb                         = FORCE
innodb_strict_mode             = 0

# DATA STORAGE #
datadir                        = /var/lib/mysql
tmpdir                         = /tmp

# BINARY LOGGING #
#log_bin                        = /var/lib/mysql/mysql-bin
#expire_logs_days               = 6
#sync_binlog                    = 1

max_connections=20
max_user_connections=10

wait_timeout=400

key_buffer_size=32M # 256M for 4GB, 512M for 8GB
key_buffer=32M

table_open_cache=1024
table_definition_cache=1024

max_heap_table_size=32M
tmp_table_size=32M




innodb_additional_mem_pool_size=8M
innodb_buffer_pool_size=64M 
innodb_flush_log_at_trx_commit=2
innodb_support_xa = 0
innodb_flush_method=O_DIRECT
innodb_log_file_size=32M
innodb_log_files_in_group=2
innodb_use_sys_malloc=0
innodb_thread_concurrency=10




# Advanced
low_priority_updates=1
concurrent_insert=2
thread_cache_size=32 

非常感谢!非常感谢!


仅显示以下内容:

202 | root | localhost | NULL | Query   |    0 | NULL  | show processlist

vmstat 显示以下内容:

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 3215392      0 172600    0    0    28    10    0   16 69  7  2  0 23

Mysql显示进程列表;

+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host      | db   | Command | Time | State | Info             |
+----+------+-----------+------+---------+------+-------+------------------+
| 11 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
1 row in set (0.00 sec)

答案1

在 my.cnf 文件中插入 slow_query 日志行并查看 slow-query.log

日志慢查询 = /var/log/slow-query.log

重启mysqld服务并执行

tail -f /var/log/slow-query.log

答案2

您的 my.cnf 配置没有任何问题。

  1. 确保您的数据库和表使用的是 innodb 而不是 myISAM。如果您使用的是 myisam - 那么您可能会遇到表锁定,这会增加 CPU 使用率,因为更多的查询将被放入队列,直到锁定被释放为止。

  2. 根据您的配置,您的站点确实很小(最多 20 个并行连接),因此流量不是问题。

  3. 如果您运行自定义网站 - 问题可能出在低效查询上,那么您需要设置 sloq 查询日志并监控 2 秒后慢速查询的执行时间。如果您的查询运行时间超过 15 秒 - 则您的索引存在问题。

您需要检查表中有多少条记录,然后应用索引或对数据库进行非规范化

  1. 另一个问题是,你可能在“过度拥挤”的虚拟化环境中获得了 VPS。这意味着你的 IO 效率可能非常低下,或者与其他虚拟机争夺内存/CPU。运行

    vmstat 1

并观看专栏

  • CPU id *(空闲时间),中间越多越好
  • 交换与输入输出

给出以下命令的输出

  1. 状态监测
  2. iotop
  3. 以 root 身份登录 mysql > show processlist

相关内容