我正在使用InnoDB表运行MySQL 5.5。 每秒约有200个查询。 还有50万行或更多的表格。 但是,我对服务器负载和IO /尤其是与jdb2等待有很大的问题。
jdb2 / md2-8正在采取99%IO /等待看iotop输出图像: Iotop输出
盒子规格:Xeon 1246 v3,32 GB RAM,2x 240英特尔SSD RAID 1
我不知道我的configuration是否有问题,或者是与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)你的查询是否有适当的索引?
2)你可以添加RAM到你的服务器?
通过解决#1问题,您将显着减less满表查询所需的全表扫描数量。 但是,您需要花费大量时间来了解造成最多IO负载的查询types。
通过寻址#2,你将允许更多的数据库被caching在RAM中,这将同时加速查询以及减lessIO。
jbd2是用于将文件系统日志同步到磁盘的内核进程。 这意味着你的MySQL设置目前是写入绑定的。
比如jdb2的高负载对于如此低的查询次数(200每秒)是相当奇怪的,特别是对于快速的SSD。 你使用无caching的RAID卡吗? 它可能会禁用您的SSD内部caching,给予糟糕的性能。 如果是这样,你可以尝试:
innodb_flush_log_at_trx_commit=0 请注意,选项n.1和n.2有一个很小但非零的风险,可以在掉电的情况下丢失一些交易。 到目前为止,最安全的select是第三个 – 购买一个正确的RAID卡。
你的my.cnf包括4行,应该删除,他们是
read_buffer_size read_rnd_buffer_size join_buffer_size thread_stack
这些都是每个连接RAM的要求,并驱动你的RAM足迹比必要的高得多。 让DEFAULTS为你工作,以提高响应时间与呼吸RAM的空间。
为了更详细的分析,添加到OriginalPost以下,
SHOW GLOBAL STATUS; SHOW GLOBAL VARIABLES; SHOW ENGINE INNODB STATUS;
最多五个具体的cfgbuild议,每天一个被应用,监测。