Log*_*est 6 mysql innodb performance mysql-5.5 fusion-io
我现在正在学习成为一名 DBA,因为我管理着一个非常敏感的大型实时数据库。这是我的专用数据库服务器的当前系统统计信息:
MySQL 5.5.23
top - 18:40:27 up 14 days, 4:43, 1 user, load average: 19.72, 22.62, 24.04
任务:总共183个,3个运行,180个睡眠,0个停止,0个僵尸
Cpu(s): 69.9%us, 0.4%sy, 0.0%ni, 29.2%id, 0.0%wa, 0.1%hi, 0.4%si, 0.0%st
内存:总共 24685224k,已使用 20172096k,4513128k 空闲,343420k 缓冲区
交换:总共 2007284k,已使用 0k,可用 2007284k,缓存 729004k
PID 用户 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令
5446 mysql 15 0 18.4g 17g 6176 R 765.8 76.2 114437:38 mysqld
我目前正在使用 50gb FusionIO 片中的 43gb。MySQL 平均大约 700 QPS 和 75-90% 的 CPU 使用率。这是我的 my.cnf 文件:
[mysqld]
user=mysql
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
#innodb
#innodb_log_file_size = 256M
#innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 2
innodb_lock_wait_timeout=50
innodb_file_per_table
innodb_buffer_pool_size=16G
innodb_buffer_pool_instances=4
#eliminating double buffering
innodb_flush_method = O_DIRECT
flush_time=86400
skip-name-resolve
query_cache_limit=4M
query_cache_size=256M
sort_buffer_size=8M
read_rnd_buffer_size=1M
max_connections=5000
interactive_timeout=60
wait_timeout=300
connect_timeout=30
thread_cache_size=32
key_buffer=124M
tmp_table_size=4096M
max_heap_table_size=256M
join_buffer=16M
max_connect_errors=2000
table_cache=2048
thread_concurrency=12
long_query_time=5
log-slow-queries=/var/log/mysql-slow.log
#table_definition_cache=384
max_allowed_packet=1024M
#server-id=20
#log-bin=mysql-bin
#expire_logs_days=10
event_scheduler=ON
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Run Code Online (Sandbox Code Playgroud)
你们可以推荐我应该对 MySQL 或 CentOS 进行的任何配置更改,以大大降低我的 CPU 使用率吗?或者就此而言任何其他资源改进?
Rol*_*DBA 10
你需要释放两件事
多年来我一直在讨论这个问题。请参阅我之前关于让 InnoDB 参与更多 CPU/核心活动的一些帖子。
May 26, 2011:关于单线程与多线程数据库性能Sep 12, 2011:可以让 MySQL 使用多个核心吗?Sep 20, 2011:多核和 MySQL 性能Apr 26, 2012: CPU 性能与数据库服务器有关吗?试一试 !!!
你最后的评论
嘿 Rolando,我在 8 点添加了 read_io 和 write_io 并阅读了您的其他帖子,但它似乎并没有降低 CPU 使用率。我什至将 4 个缓冲池实例减少到 1 个,希望它具有更好的性能,但仍然没有成功。您还有什么我可以实施的有助于降低 CPU 使用率的建议吗?
我建议将innodb_buffer_pool_instances提高到 8 以匹配内核数。MySQL 文档建议每个缓冲池实例 1G。然后,您将提高到 16(因为您的 innodb_buffer_pool_size 为 16G)。先试 8,然后试 16。
尽管如此,我还是有一些令人沮丧的消息:这是2 年前来自 FusionIO 的新闻稿。第 2 段说:
StatSoft 白皮书得出的结论是,Fusion ioDrives 显着提高了 STATISTICA 分析软件产品和解决方案套件的 I/O 性能,大大提高了 CPU 利用率和效率。与传统的基于磁盘的存储相比,使用 ioMemory,StatSoft 实现了 300% 和 500% 的数据性能和延迟减少改进。随着 Fusion ioDrives 提高 I/O 性能,在大型数据集测试中 CPU 利用率增加到 90%,而在基于磁盘的技术中观察到的 CPU 利用率为 32%。
如果您将 RAID 10 SAS 甚至 SSD 用于/var/lib/mysql,InnoDB 将与 CPU 一起度过。但是,从本新闻稿的外观来看,InnoDB 正在与 FusionIO 竞争 CPU 利用率。
找出 FusionIO 磁盘的 IOP 并将innodb_io_capacity设置为该数字。innodb_io_capacity的默认值为200,如果IOPs大于200,请设置。如果 IOP 达到 1000,那么 InnoDB 就有机会与 FusionIO 处于一个公平的竞争环境中。
试一试 !!!