我最近将我的 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 配置没有任何问题。
确保您的数据库和表使用的是 innodb 而不是 myISAM。如果您使用的是 myisam - 那么您可能会遇到表锁定,这会增加 CPU 使用率,因为更多的查询将被放入队列,直到锁定被释放为止。
根据您的配置,您的站点确实很小(最多 20 个并行连接),因此流量不是问题。
如果您运行自定义网站 - 问题可能出在低效查询上,那么您需要设置 sloq 查询日志并监控 2 秒后慢速查询的执行时间。如果您的查询运行时间超过 15 秒 - 则您的索引存在问题。
您需要检查表中有多少条记录,然后应用索引或对数据库进行非规范化
另一个问题是,你可能在“过度拥挤”的虚拟化环境中获得了 VPS。这意味着你的 IO 效率可能非常低下,或者与其他虚拟机争夺内存/CPU。运行
vmstat 1
并观看专栏
- CPU id *(空闲时间),中间越多越好
- 交换与输入输出
给出以下命令的输出
- 状态监测
- iotop
- 以 root 身份登录 mysql > show processlist