如何减少mysql InnoDB的磁盘IO?

2013-01-14 15:36:30 +08:00
 sdjl
服务器mysql最近每秒query有1000次以上,用iotop查看mysqld程序平均每秒要写入1-2M的数据, 分析下来是因为频繁的对程序中的Session表Update导致的

所以, 我想问一下, 怎么让mysql多利用内存, 少写磁盘?

Session表本身并不大, 但是更新频率较高, 我已经设置了

innodb_buffer_pool_size = 1024M
innodb_flush_log_at_trx_commit = 2

但是不起作用, 请问一下大家是怎么配置的?

Session表使用InnoDB
7230 次点击
所在节点    MySQL
14 条回复
keakon
2013-01-14 16:41:09 +08:00
把Session放在redis里试试,不过不能join了
Cadina
2013-01-14 16:49:29 +08:00
频繁更新的记录放在memcache里?
Cadina
2013-01-14 16:50:27 +08:00
说错了= =
更新->查询
iZr
2013-01-14 17:00:00 +08:00
使用RDS
napoleonu
2013-01-14 17:00:38 +08:00
并不是平均每秒要写入1-2M的数据IO就有压力了吧,你确定你IO有压力了?

要优化IO也是让MySQL尽量Merge IO以减少随机IO和过多小IO,你数据要写那么多,往磁盘写多少数据是不可避免的,sync_binlog的设置对IO的影响比较大。
BOYPT
2013-01-14 17:47:45 +08:00
更新数据就是commit后mysql是一定要保证写进磁盘的吧,怎么可能利用内存呢,你要么把session从mysql移到其他组件
sdjl
2013-01-14 18:47:51 +08:00
我想通过优先让mysql利用内存缓存数据的方式解决, 这样可以不用修改程序。 mysql有内存表,但是session数据是要定时保存的, 内存表能定期保存在磁盘中么?

希望通过不增加程序复杂度的办法解决, 需要考虑的关键问题在于:
1 需要频繁更新, 所以想放到内存中, 但数据不超过100M
2 数据需要定时保存, 且重启程序后容易复原
3 尽量不改动python程序, 比如通过配置mysql实现,低耦合
sdjl
2013-01-14 18:52:49 +08:00
@napoleonu 嗯,确实不算太高, 但我用的是42区vps, 教主那边发邮件说希望优化一下~~~
bruce
2013-01-14 18:56:58 +08:00
这么频繁写入 1 则是设计问题, 2 则应该把频繁修改的分离出来而不放在 Session 表里
sdjl
2013-01-14 18:59:54 +08:00
刚才的 dstat 输出片段, 这不算高的时候, 高时send有3000k以上

You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
7 1 87 5 0 0| 47k 2755k| 0 0 | 10B 38B|2746 5030
13 2 84 0 0 1| 0 3876k| 100k 1865k| 0 0 |5610 7468
10 1 88 0 0 0| 256k 4908k| 93k 1897k| 0 0 |5593 6086
8 2 76 13 0 1| 260k 4932k| 83k 1868k| 0 0 |6057 6507
8 2 88 2 0 1| 256k 13M| 74k 1615k| 0 0 |5587 6479
9 2 88 0 0 1| 256k 1120k| 76k 1632k| 0 0 |4697 5905
8 2 89 0 0 1| 0 4556k| 81k 1652k| 0 0 |5122 6241
15 3 79 2 0 1| 260k 8632k| 91k 1847k| 0 0 |6334 9172
14 3 77 6 0 0| 260k 5416k| 95k 1777k| 0 0 |5738 7993
8 1 90 1 0 0| 256k 4584k| 89k 1824k| 0 0 |4726 4875
11 2 86 0 0 0| 256k 260k| 72k 1753k| 0 0 |4414 5313
11 2 86 0 0 0| 0 4548k| 86k 1772k| 0 0 |5817 7145
8 1 90 0 0 0| 256k 312k| 99k 1831k| 0 0 |4407 4639
5 1 94 0 0 1| 256k 336k| 100k 1958k| 0 0 |4081 3636
13 2 82 2 0 1| 256k 4924k| 99k 1923k| 0 0 |5056 6616
10 2 87 0 0 1| 0 5356k| 99k 1864k| 0 0 |5654 6865
napoleonu
2013-01-14 19:01:09 +08:00
@sdjl 如果这样你可以把这个表引擎改成memory引擎,自己写个crontab定时dump出来这个表的数据,并且这个表不记录binlog,设置如下

binlog-wild-ignore-table = your_table
sdjl
2013-01-14 19:05:21 +08:00
@napoleonu 嗯, 这个明白, 但是, mysql就没有配置选项解决这个问题么?
napoleonu
2013-01-14 19:09:51 +08:00
你数据要写那么多,往磁盘写多少数据是不可避免的。

你的问题是什么?怎么设置让数据写内存不写磁盘?数据库崩溃了你怎么办?服务器崩溃了你怎么办?
sdjl
2013-01-14 19:35:17 +08:00
@napoleonu 就是想先缓存大概几秒, 然后再写, 比如每5秒写一次, 因为是session, 所以可以接受丢失几秒的数据

我用的是webpy, webpy的session有一个问题, 那就是就算在一次请求中session没有变动, webpy也会执行update操作, 不知道新版本的webpy是否会解决这个问题, 不过作者已经挂了~~~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/57538

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX