我正在运行带有 InnoDB 表的 MySQL 5.5。每秒大约有 200 个查询。还有一些表包含 500 000 行或更多行。但我在服务器负载和 io/wait 方面遇到了很大的问题,尤其是使用 jdb2 时。
jdb2/md2-8 占用了 99% 的 IO/等待,查看 iotop 输出图像: Iotop 输出
机箱规格:Xeon 1246 v3、32 GB RAM、2x 240 Intel SSD RAID 1
我不知道我的配置是否有问题,或者这是与 RAID 相关的问题。有什么建议吗?
我的mysql my.cfg:
innodb_file_per_table = 1
join_buffer_size = 1M
open_files_limit = 10000
myisam_use_mmap = 1
query_cache_type = 1
table_open_cache = 2000
concurrent_insert = 2
max_connections = 3000
query_cache_size = 16M
key_buffer_size = 16M
read_buffer_size = 8M
query_cache_limit = 4M
query_cache_min_res_unit = 1K
tmp_table_size = 64M
thread_cache_size = 1500
sort_buffer_size = 2M
max_heap_table_size = 64M
innodb_buffer_pool_size = 5000M
read_rnd_buffer_size = 128M
thread_concurrency = 8
thread_stack = 1M
innodb_log_buffer_size = 2M
谢谢。
答案1
jbd2 是用于将文件系统日志同步到磁盘的内核进程。这意味着您的 MySQL 设置目前是写绑定的。
如此低的查询数(每秒 200 次)却有如此高的 jdb2 负载,这很奇怪,尤其是使用快速 SSD 时。您是否使用无缓存 RAID 卡?它可能会禁用您的 SSD 内部缓存,从而导致性能极差。如果是这样,您可以尝试:
- 重新启用磁盘的私有缓存
- 使用 my.cnf 选项
innodb_flush_log_at_trx_commit=0
- 使用支持 BBU 的 RAID 卡,具有 512+ MB 受保护的 DRAM 缓存
请注意,选项 1 和 2 在断电情况下有丢失部分交易的风险,但风险不大,但并非为零。到目前为止,最安全的选项是第三个 - 购买合适的 RAID 卡。
答案2
需要考虑两件事:
1)您的查询是否有合适的索引?
2)您可以给您的服务器添加RAM吗?
通过解决 #1,您将显著减少完成查询所需的全表扫描次数。不过,您需要花费大量时间来了解哪种类型的查询导致最多的 IO 负载。
通过解决 #2,您将允许更多的数据库缓存在 RAM 中,这将同时加快查询速度并减少 IO。
答案3
你的 my.cnf 包含 4 行应该删除,它们是
read_buffer_size
read_rnd_buffer_size
join_buffer_size
thread_stack
这些都是每个连接的 RAM 要求,并且会使您的 RAM 占用量远远超过必要水平。让默认设置为您工作,以改善响应时间,并留出 RAM 空间。
如需更详细的分析,请在 OriginalPost 中添加以下内容,
SHOW GLOBAL STATUS;
SHOW GLOBAL VARIABLES;
SHOW ENGINE INNODB STATUS;
最多可监控五条具体的 cfg 建议,每天一条。