Row Cache For InnoDB 第二版优化(附带安装和配置说明)
本来第二版在6月份的时候已经做好了,由于后来被临时去做一个其他项目,就延迟发这一博了..实际上patch老早就上传到code.google.com了
下面说一下第二版的一个改进:
- log的显示优化了.能够显示出打log的时间了,也能正确换行
- 优化misc内存的占用..
- 对小内存分配进行了优化(单独的内存池)
- 可配置对需要的索引进行缓存,而不是无差别的对所有索引缓存(支持通配符哦)
- 这个功能的目的是为了能使缓存可控,并不是所有的数据都合适被row cache,只有那些数据比较离散的合适,比如辅助索引5. 支持使用操作系统的malloc进行内存分配(如果你用TC_malloc或JE_malloc可以尝试开启此功能)
- 支持在线清空row cache缓存
- 修正一些可能会引起crash的地方
- 修正一个可能会导致内存泄露的地方
这次的patch经过了比较长时间(跑了一个礼拜)的高压力稳定性测试.应该是比较稳定了,建议大家使用这个版本的patch
还存在的一些问题和接下去要做的一些优化
- misc的内存占用还是个大问题..
- 32位下一个misc结构要使用48个字节的内存.64位下面就需要将近90个字节了,所以需要做指针压缩
- 也可以考虑一个misc结构缓存多条记录的方式来提高内存利用率2. 内存碎片
有使用row cache的一些弟兄也可以给我一些反馈,不管是好的还是不好的,都有助于我更好的维护row cache哦
可以发邮件到zephyrleaves@gmail.com ,谢谢
附安装和配置说明中文版:
- 安装
- 下载5.1.48版的mysql源码 http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.48.tar.gz
- 解压mysql源码
tar zvxf mysql-5.1.48.tar.gz3. 打上row cache for innodb的补丁
patch -p0 < ./row_cache_for_mysql.5.1.48_2011_05_11.diff4. Configure
建议参数:
CFLAGS=”-O3” CXX=gcc CXXFLAGS=”-O3 -felide-constructors -fno-exceptions -fno-rtti” ./configure –prefix=/usr/mysql –with-extra-charsets=all –with-plugins=partition,heap,innobase,myisam,myisammrg,csv –enable-assembler5. make & make install* 新增的配置(my.cnf)(row cache是作用在innodb_plugin之上的哦,记得开启innodb_plugin)
innodb_row_cache_mem_pool_size
分配给Row cache 的内存大小
默认1M* innodb_row_cache_on
开启row cache 的开关,如果是OFF,那么一切内存都不会被分配
默认OFF* innodb_row_cache_cell_num
row cache所使用的hash table的cell数,越大越容易被一次命中,但是也越占内存(也还好,也就占一个指针的空间)
默认 1000* innodb_row_cache_mutex_num_shift
由于row cache是使用多缓存实例的方式来提高并发性,这个参数就是用来配置实例数的,由于实例数必须是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时 会清空row cache
显示的值 永远是0 innodb_row_cache_use_sys_malloc 新增的状态(使用show status可以看到)
Innodb_row_cache_n_get
总的向row cache请求数,包括可能missing的请求数* Innodb_row_cache_n_geted
从row cache返回成功的数量* Innodb_row_cache_lru_count
row cache一共缓存记录数* Innodb_row_cache_lru_n_add
向row cache一共添加的记录数* Innodb_row_cache_lru_n_evict
被row cache逐出的记录数* Innodb_row_cache_lru_n_make_first
被row cache置顶的记录数(就是被访问到的次数 应该和Innodb_row_cache_n_geted是相等的,不过Innodb_row_cache_lru_n_make_first是在锁内的更精确 )* Innodb_row_cache_mem_pool_size
row cache分配的内存数 Innodb_row_cache_mem_pool_used 在show innodb status 上也加入了关于row cache使用情况: