MySQL数据库导致高IO运行Zabbix服务器

我的VPS主机抱怨说我正在使用主机上最高的IO。 我运行一个MySQL的innodb数据库的Zabbix监控服务器。 VPS有512MB RAM。 我不明白为什么mysqltuner.pl脚本推荐innodb_buffer_pool_size> 1G时,我只有512MB。 任何build议,我应该开始将不胜感激。 我联系了Zabbix的专家,被告知“tmp表不应该在磁盘上结束,innodb缓冲池在大多数情况下应该尽可能大”,但我不确定如何实现这个数字。

这是mysqltuner.pl脚本的输出。

 --------一般统计---------------------------------------- ----------
 [ - ]跳过版本检查MySQLTuner脚本
 [确定]当前运行支持的MySQL版本5.0.77
 [确定]在64位体系结构上运行

 --------存储引擎统计--------------------------------------- ----
 [ - ]状态:-Archive + BDB -Federated + InnoDB -ISAM -NDBCluster 
 [ - ] InnoDB表中的数据:1G(表:144)
 [!!] BDB已启用,但未被使用
 [确定]碎片表总数:0

 -  -  -  -  性能指标  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - ---------
 [ - ]上行:129d 6h 54m 3s(342M q [30.677 qps],1M conn,TX:112B,RX:46B)
 [ - ]读/写:57%/ 43%
 [ - ]总缓冲区:全球34.0M +每个线程2.7M(最多100个线程)
 [OK]最大可能的内存使用量:309.0M(已安装RAM的62%)
 [OK]慢查询:0%(134 / 342M)
 [OK]可用连接的最高使用率:33%(33/100)
 [确定]键缓冲区大小/总MyISAM索引:8.0M / 67.0K
 [OK]键缓冲命中率:96.3%(caching31M / 1M次)
 [!!]查询caching被禁用
 [确定]需要临时表的sorting:0%(0温度sorting/ 5Msorting)
 [确定]磁盘上创build的临时表:13%(磁盘1M /总共10M)
 [!!]线程caching被禁用
 [!!]表caching命中率:0%(64打开/ 46K打开)
 [OK]使用打开的文件限制:0%(0 / 1K)
 [确定]立即获取表锁:100%(406M即时/ 406M锁)
 InnoDB数据容量/缓冲池:1.8G / 8.0M


 --------build议----------------------------------------- ------------
一般build议:
    将skip-bdb添加到MySQLconfiguration以禁用BDB
    启用慢查询日志来解决不良查询
    将thread_cache_size设置为4作为起始值
    逐渐增加table_cache以避免文件描述符限制
variables调整:
     query_cache_size(> = 8M)
     thread_cache_size(从4开始)
     table_cache(> 64)
     innodb_buffer_pool_size(> = 1G)

这是我目前的my.cnf

的[mysqld]
 DATADIR =的/ var / lib中/ MySQL的
sockets=的/ var / lib中/ MySQL的/的mysql.sock
用户= MySQL的
 #默认使用旧密码格式与mysql 3.x兼容
 #客户端(使用mysqlclient10兼容包的客户端)。
 old_passwords = 1

 #build议禁用符号链接以防止各种安全风险;
 #这样做,取消注释这一行:
 #symbolic-links = 0

 [mysqld_safe的]
对数误差=的/ var /数/ mysqld.log
 PID文件= / var / run中/ mysqld的/ mysqld.pid

自由-m的输出

             caching总共使用的空闲共享缓冲区
 Mem:492 486 6 0 2 44
 -  / + buffers / cache:439 53
交换:255 112 143

从iostat输出

 avg-cpu:%user%nice%system%iowait%steal%idle 0.24 0.03 0.12 0.57 0.01 99.03设备:tps Blk_read / s Blk_wrtn / s Blk_read Blk_wrtn xvda 24.47 36.26 748.69 405085498 8365183264 xvdb 1.16 9.50 6.87 106190600 76708192 xvdc 0.00 0.00 0.00 5961 1416 

innodb_buffer_pool_size > 1G ,因为你的数据集大小是1.8GB。

为了减less读取次数,你需要增加innodb_buffer_pool_size 要减less写入数量,您需要编辑您的zabbix模板(禁用一些不必要的项目,如免费inode,增加检查间隔)。

读/写比例为57%/ 43%,因此启用查询caching将无济于事(这可能会使事情变得更糟,因为写入表会使caching失效 )。

考虑增加tmp_table_size和max_heap_table_size以避免在磁盘上创buildtmp表(占tmp表的13%)。 临时表格以MB为单位? 这是计数? 如果是反制,那就太高了。

减less连接数到50(你的最高数字是33)。

 innodb_support_xa = false innodb_buffer_pool_size = 256M # It depends how many memory is available to MySQL, more is better. innodb_flush_log_at_trx_commit = 0 # disable writing to logs on every commit and disable fsync on each write innodb_max_dirty_pages_pct = 90 # avoid flushing dirty pages to disk innodb_flush_method = O_DIRECT # direct access to disk without OS cache thread_cache_size = 4 query_cache_size = 0 table_cache = 80? # a little more than number_of_tables_in_zabbix_database 

有关InnoDB优化的有用链接 。

InnoDB缓冲池真的太小了(至less要尝试64M或128M)。 考虑启用线程caching,查询caching,并得到一个更大的table_cache,它可以帮助很多。