mysql将变量innodb_flush_method设置为O_DSYNC或O_DIRECT

mysql将变量innodb_flush_method设置为O_DSYNC或O_DIRECT,mysql,innodb,my.cnf,Mysql,Innodb,My.cnf,在我的配置中,O-DIRECT的innodb\u flush\u method=O\u DSYNC减少了约75%的iowait,从而减少了负载。除了innodb_flush_方法之外,我应该设置另一个变量来减少更多的iowait吗 我的配置文件是: [mysqld] innodb_file_per_table=1 query_cache_size=128M thread_cache_size=64 key_buffer_size=32M max_allowed_packet=16M table_

在我的配置中,
O-DIRECT
的innodb\u flush\u method=O\u DSYNC减少了约75%的iowait,从而减少了负载。除了innodb_flush_方法之外,我应该设置另一个变量来减少更多的iowait吗

我的配置文件是:

[mysqld]
innodb_file_per_table=1
query_cache_size=128M
thread_cache_size=64
key_buffer_size=32M
max_allowed_packet=16M
table_cache=1024
table_definition_cache=8192
wait_timeout=20
max_user_connections=25
innodb_flush_method=O_DSYNC
open_files_limit=16384

myisam_sort_buffer_size=2M

collation_server=utf8_unicode_ci
character_set_server=utf8

tmp_table_size = 384M
max_heap_table_size = 384M
innodb_buffer_pool_size=64M
innodb_thread_concurrency=8
max_connections=125
我有一个包含100个Innodb表的数据库,其中3个有大约25000条记录,其他的没有重要记录。高峰时间的平均查询量约为160,大部分是
SELECT

innodb\u buffer\u pool\u size 主要问题是
innodb\u buffer\u pool\u size
太小。建议设置为主内存的50~75%

innodb_buffer_pool_size=64M
我强烈建议你增加它的价值

一般来说,
O_DIRECT
有点快,因为InnoDB缓冲池缓存数据+索引,所以禁用了
O_DIRECT
的文件系统页面缓存更快。马纳尔说 ()

根据硬件配置,将innodb_flush_method设置为O_DIRECT可能会对性能产生正面或负面影响。对特定配置进行基准测试,以确定要使用的设置

但根据我的经验,O_DIRECT和O_DSYNC之间没有显著差异。SSD和HDD都在测试中

无论如何您应该增加
innodb\u buffer\u pool\u大小

计算innodb缓冲池命中率 例如上述例子

hit ratio = (11054273949  / (11054273949  + 135237)) * 100 = 99.99%
我认为这个值在你的情况下太小了

查询\u缓存\u大小 “多数是经过挑选的”

如果大多数查询都是SELECT查询,而update查询很少,我认为增加
query\u cache\u size
对您非常有帮助

你能按如下方式发布你的
查询缓存状态吗

mysql> show global status like 'Qc%';
+-------------------------+------------+
| Variable_name           | Value      |
+-------------------------+------------+
| Qcache_free_blocks      | 13         |
| Qcache_free_memory      | 1073403104 |
| Qcache_hits             | 217949     |
| Qcache_inserts          | 337009     |
| Qcache_lowmem_prunes    | 0          |
| Qcache_not_cached       | 2122598    |
| Qcache_queries_in_cache | 68         |
| Qcache_total_blocks     | 167        |
+-------------------------+------------+

mysql> show global status like 'com_select%';
+---------------+---------+
| Variable_name | Value   |
+---------------+---------+
| Com_select    | 3292531 |
+---------------+---------+
1 row in set (0.00 sec)
计算innodb缓冲池命中率
首先,计算您的查询缓存命中率。

我的web服务器和mysql服务器在同一个设备上,有4GB的RAM。您认为,我的最佳innodb_缓冲区_池_大小是多少?@zsola3075457取决于您的服务环境。但是mysql服务器主要是mysql而已。我认为2.5~3GB就足够了。我认为您需要将其从当前的64M更改为1GB的3GB@zsola3075457此时,我猜您的MySQL没有收到足够的查询。(正常运行时间?)。QC命中率约为60%。@zsola3075457欢迎使用SO;-)83%是非常高的。因此,我认为较高的
query\u cache\u size
更适合您。但是,首先,
innodb\u buffer\u pool\u size
对于提高性能来说是最重要的。@zsola3075457抱歉。我认为这是适合你的地方。我希望DBA能尽快帮助您。
mysql> show global status like 'Qc%';
+-------------------------+------------+
| Variable_name           | Value      |
+-------------------------+------------+
| Qcache_free_blocks      | 13         |
| Qcache_free_memory      | 1073403104 |
| Qcache_hits             | 217949     |
| Qcache_inserts          | 337009     |
| Qcache_lowmem_prunes    | 0          |
| Qcache_not_cached       | 2122598    |
| Qcache_queries_in_cache | 68         |
| Qcache_total_blocks     | 167        |
+-------------------------+------------+

mysql> show global status like 'com_select%';
+---------------+---------+
| Variable_name | Value   |
+---------------+---------+
| Com_select    | 3292531 |
+---------------+---------+
1 row in set (0.00 sec)
 query cache hit ratio = ((Qcache_hits) / (Qcache_hits + Com_select)) * 100