V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
sdjl
V2EX  ›  MySQL

如何减少mysql InnoDB的磁盘IO?

  •  
  •   sdjl · 2013-01-14 15:36:30 +08:00 · 7193 次点击
    这是一个创建于 4119 天前的主题,其中的信息可能已经有所发展或是发生改变。
    服务器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
    14 条回复    1970-01-01 08:00:00 +08:00
    keakon
        1
    keakon  
       2013-01-14 16:41:09 +08:00
    把Session放在redis里试试,不过不能join了
    Cadina
        2
    Cadina  
       2013-01-14 16:49:29 +08:00
    频繁更新的记录放在memcache里?
    Cadina
        3
    Cadina  
       2013-01-14 16:50:27 +08:00
    说错了= =
    更新->查询
    iZr
        4
    iZr  
       2013-01-14 17:00:00 +08:00 via iPad
    使用RDS
    napoleonu
        5
    napoleonu  
       2013-01-14 17:00:38 +08:00
    并不是平均每秒要写入1-2M的数据IO就有压力了吧,你确定你IO有压力了?

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

    希望通过不增加程序复杂度的办法解决, 需要考虑的关键问题在于:
    1 需要频繁更新, 所以想放到内存中, 但数据不超过100M
    2 数据需要定时保存, 且重启程序后容易复原
    3 尽量不改动python程序, 比如通过配置mysql实现,低耦合
    sdjl
        8
    sdjl  
    OP
       2013-01-14 18:52:49 +08:00
    @napoleonu 嗯,确实不算太高, 但我用的是42区vps, 教主那边发邮件说希望优化一下~~~
    bruce
        9
    bruce  
       2013-01-14 18:56:58 +08:00
    这么频繁写入 1 则是设计问题, 2 则应该把频繁修改的分离出来而不放在 Session 表里
    sdjl
        10
    sdjl  
    OP
       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
        11
    napoleonu  
       2013-01-14 19:01:09 +08:00
    @sdjl 如果这样你可以把这个表引擎改成memory引擎,自己写个crontab定时dump出来这个表的数据,并且这个表不记录binlog,设置如下

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

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

    我用的是webpy, webpy的session有一个问题, 那就是就算在一次请求中session没有变动, webpy也会执行update操作, 不知道新版本的webpy是否会解决这个问题, 不过作者已经挂了~~~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5771 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 02:17 · PVG 10:17 · LAX 19:17 · JFK 22:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.