下载见:http://code.google.com/p/row-cache-for-innodb/downloads/detail?name=row_cache_for_mysql.5.1.48_2011_06_16.diff&can=2&q=#makechanges

本来第二版在6月份的时候已经做好了,由于后来被临时去做一个其他项目,就延迟发这一博了..实际上patch老早就上传到code.google.com了

下面说一下第二版的一个改进:

  1. log的显示优化了.能够显示出打log的时间了,也能正确换行

  2. 优化misc内存的占用..

  3. 对小内存分配进行了优化(单独的内存池)

  4. 可配置对需要的索引进行缓存,而不是无差别的对所有索引缓存(支持通配符哦)

  • 这个功能的目的是为了能使缓存可控,并不是所有的数据都合适被rowcache,只有那些数据比较离散的合适,比如辅助索引

支持使用操作系统的malloc进行内存分配(如果你用TC_malloc或JE_malloc可以尝试开启此功能)支持在线清空rowcache缓存修正一些可能会引起crash的地方修正一个可能会导致内存泄露的地方

这次的patch经过了比较长时间(跑了一个礼拜)的高压力稳定性测试.应该是比较稳定了,建议大家使用这个版本的patch

还存在的一些问题和接下去要做的一些优化

  1. misc的内存占用还是个大问题..

  • 32位下一个misc结构要使用48个字节的内存.64位下面就需要将近90个字节了,所以需要做指针压缩

  • 也可以考虑一个misc结构缓存多条记录的方式来提高内存利用率

内存碎片
  • 虽然已经进行了一些优化,但是由于使用InnoDB自带的mem0pool的伙伴算法来分配内存,内存碎片还是比较严重的

  • 准备参考redis,memcached的一些实现来避免内存碎片

  • 使用系统的malloc也是一种办法

有使用rowcache的一些弟兄也可以给我一些反馈,不管是好的还是不好的,都有助于我更好的维护rowcache哦

可以发邮件到zephyrleaves@gmail.com,谢谢

附安装和配置说明中文版:

  • 安装

  1. 下载5.1.48版的mysql源码http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.48.tar.gz

  2. 解压mysql源码

  • tarzvxfmysql-5.1.48.tar.gz

打上rowcacheforinnodb的补丁
  • patch-p0<./row_cache_for_mysql.5.1.48_2011_05_11.diff

Configure
  • 建议参数:

  • CFLAGS=”-O3″CXX=gccCXXFLAGS=”-O3-felide-constructors-fno-exceptions-fno-rtti”./configure–prefix=/usr/mysql–with-extra-charsets=all–with-plugins=partition,heap,innobase,myisam,myisammrg,csv–enable-assembler

make&makeinstall新增的配置(my.cnf)(rowcache是作用在innodb_plugin之上的哦,记得开启innodb_plugin)
  • innodb_row_cache_mem_pool_size

    • 分配给Rowcache的内存大小

    • 默认1M

  • innodb_row_cache_on

    • 开启rowcache的开关,如果是OFF,那么一切内存都不会被分配

    • 默认OFF

  • innodb_row_cache_cell_num

    • rowcache所使用的hashtable的cell数,越大越容易被一次命中,但是也越占内存(也还好,也就占一个指针的空间)

    • 默认1000

  • innodb_row_cache_mutex_num_shift

    • 由于rowcache是使用多缓存实例的方式来提高并发性,这个参数就是用来配置实例数的,由于实例数必须是2的幂,所以实例数就是(1<<innodb_row_cache_mutex_num_shift)即2^innodb_row_cache_mutex_num_shift这个数字建议比innodb_thread_concurrency大一点就行了,不需要很大

    • 默认6

  • innodb_row_cache_additional_mem_pool_size

    • 额外的内存池,用于分配misc需要用到的内存,当innodb_row_cache_additional_mem_pool_size分配的内存用光时misc会到innodb_row_cache_mem_pool_size分配的内存里面去申请内存

    • 默认1M

  • innodb_row_cache_index

    • 用于配置需要被缓存的索引

    • 配置样例:innodb_row_cache_index=test/test_large:idx_age,test是数据库,test_large是表,idx_age是索引,如果是主索引的话用PRIMARY

    • 配置是支持*和?这样的通配符的

    • 如果不配置就是对所有索引进行缓存

    • 这个配置是可以被在线更新的哦

    • 默认为NULL

  • innodb_row_cache_clean_cache

    • 这个主要是用来做Debug用的

    • 在线把这个值设置为1时会清空rowcache

    • 显示的值永远是0

  • innodb_row_cache_use_sys_malloc

    • 设置rowcache是否使用系统的malloc来进行内存分配

    • 如果你安装了TC_Malloc或JE_Malloc可以尝试开启

    • 默认OFF

新增的状态(使用showstatus可以看到)
  • Innodb_row_cache_n_get

    • 总的向rowcache请求数,包括可能missing的请求数

  • Innodb_row_cache_n_geted

    • 从rowcache返回成功的数量

  • Innodb_row_cache_lru_count

    • rowcache一共缓存记录数

  • Innodb_row_cache_lru_n_add

    • 向rowcache一共添加的记录数

  • Innodb_row_cache_lru_n_evict

    • 被rowcache逐出的记录数

  • Innodb_row_cache_lru_n_make_first

    • 被rowcache置顶的记录数(就是被访问到的次数应该和Innodb_row_cache_n_geted是相等的,不过Innodb_row_cache_lru_n_make_first是在锁内的更精确)

  • Innodb_row_cache_mem_pool_size

    • rowcache分配的内存数

  • Innodb_row_cache_mem_pool_used

    • rowcache已经使用的内存数

在showinnodbstatus上也加入了关于rowcache使用情况:
----------------------
ROW CACHE
----------------------
Total memory allocated 5368709120; used 5367472576 (999 / 1000); Total LRU count 12569422
Row total add 30544838 , 344.35 add/s
Row total make first 771088189 , 13720.31 mf/s
Row total evict 17975130 , 332.97 evict/s
Row read from cache 802835501, 14085.11 read/s
Row get from cache 772330451, 13740.67 get/s
Row cache hit rate 975 / 1000