我一直在与拥有高流量网站的客户合作(在任何给定时间有 50 万访问者和 600-800 活跃用户)。这使用 wordpress,数据库使用 MyISAM 引擎。我们遇到的问题是服务器中的 CPU 使用率很高。CPU负载一直是15-20。我们在 Dual Xeon L5506、12GB RAM 服务器和 Sata HDD 中使用 litespeed 和 MySQL 5.1 和 CentOS 5.9。
所以我分析了数据库,发现该数据库只有 4GB 的数据和索引大小,并决定转换为 InnoDB。一旦我们这样做了,我们最终会有 80-150 个 CPU 负载并且服务器即将崩溃。所以我们将 MySQL 转移到另一台具有相同配置但 MySQL 5.5 的服务器。
在新数据库服务器中,CPU 负载为 1-2,而 Web 服务器仍处于 4-6 恒定 CPU 负载。
这是我的 my.cnf
[mysqld]
innodb_file_per_table=1
local-infile = 0
default-storage-engine = InnoDB
max_connections = 1000
innodb_buffer_pool_size = 8G
innodb_flush_method = O_DIRECT
innodb_log_file_size = 256M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 2
innodb_thread_concurrency = 8
innodb_file_format = Barracuda
myisam_sort_buffer_size = 16MB
query_cache_type = 1
query_cache_limit = 2M
query_cache_size = 256M
thread_cache_size = 16K
key_buffer_size = 128M
max_heap_table_size = 128M
tmp_table_size = 128M
join_buffer_size = 32M
read_buffer_size = 32M
read_rnd_buffer_size = 1M
sort_buffer_size = 32M
table_cache = 4K
open_files_limit = 65535
log-slow-queries = /var/log/mysql/slowqueries.log
long_query_time = 3
PS:并非我们所有的数据库都是 InnoDB,所以 MyISAM 值是在经过良好分析之后放置的。
统计:4小时
Questions since startup: 7,339,471 Documentation
ø per hour: 1,704,102
ø per minute: 28,402
ø per second: 473
Traffic ø per hour
Received 4.8 GiB 1.1 GiB
Sent 248.5 GiB 57.7 GiB
Total 253.3 GiB 58.8 Gi
观察#1
承诺使用 InnoDB 时,您还需要承诺调整多核。
观察#2
我看你有
innodb_thread_concurrency = 8
。如果您将innodb_thread_concurrency设置为 0(这是默认值),您将拥有无限并发。这让 InnoDB 存储引擎决定它认为它需要和可以处理多少线程。观察#3
您的数据库服务器有 12GB 的 RAM。您的 InnoDB 缓冲池大于 RAM 的一半。您需要通过将innodb_buffer_pool_instances设置为 2 来对缓冲池进行分区。结合此,您需要运行
numactl --interleave=all
(不适用于 VM)。观察#4
我看你有
innodb_file_format = Barracuda
。我希望你能回到innodb_file_format = Antelope
. 为什么要回到未压缩的状态?它往往会使 InnoDB 缓冲池膨胀,因为压缩和未压缩的数据和索引页在缓冲池中共存。我刚刚写过这个:见我的帖子innodb_file_format 梭子鱼结语
这是我过去关于调整 InnoDB 的一些帖子
Oct 22, 2012
: mysql innodb_buffer_pool_size 应该有多大?Jul 23, 2012
:如何在具有 16 GB RAM 的 QuadCore 机器上充分利用 MySQL?Jul 21, 2012
: InnoDB - ibdata1 文件和 ib_logfile0 上的高磁盘写入 I/OSep 20, 2011
:多核和 MySQL 性能Sep 12, 2011
:可以让 MySQL 使用多个核心吗?Feb 12, 2011
:您如何针对繁重的 InnoDB 工作负载调整 MySQL?试试看 !!!
我想您现在担心 Web 服务器 CPU 负载,因为在这样的繁忙数据库上加载 1-2 非常好。我注意到你有:
在您的配置中。使用此设置,您不会捕获所有长时间运行的查询 - 3 秒对于繁忙的网站来说非常长。当 PHP 向数据库发出请求并等待 3 秒时,Web 服务器上的进程处于可运行状态并增加负载。要查看这种效果,请编写一个循环 SELECT SLEEP(3) 查询的 PHP 脚本,并行运行一百个这样的脚本,看看这对负载有何影响)。
我的建议是降低
long_query_time
到更合理的值(0.2?0.1?),用pt-query-digest处理慢查询日志,并处理累积时间最长的查询。由于您自己可能无法更改查询,因此您可能会在索引流行表时获得一些运气。