我的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,它可以帮助很多。