QConf保证数据的正确性新方法 - Qihoo360/QConf GitHub Wiki

新value验证方法

因为QConf读写共享内存时不对内存加锁,所以要采用数值验证方法来保证数据正确性,旧版采用md5保证数据正确性。由于计算md5开销比较大,所以最新实现方法对于将要放入共享内存的数据,如果小于某一值(当前设置为1500)就将数据本身复制一份作为验证码,如果大于设定值还是采用md5。

  • 存入共享内存的数据格式
-----------------------------------------
| value len | value | verification code |
-----------------------------------------
  • value len:value的长度(uint16_t)
  • verification code:
  1. value的MD5
  2. 原value值

性能测试

测试策略

  • 测试次数 : 循环取2000000次key值。
  • 测试数据 : 存在1000个不同key对应的值,80%的key对应的value的大小是10100B,15%为1001KB,剩下的为1600~1700B。
  • 测试方式 : 多进程测试,多个进程同时循环取1000个key,然后取所有进程结果平均值。
  • 测试机器 : Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.60GHz, 24核;157G memory
  • 测试语言 : c++

测试结果

使用新value验证方法的版本比使用md5验证的版本性能提升了约1.34倍。

测试数据

md5 result 新验证码优化

注意事项

master分支最新提交即为新版实现,默认没有将新的value验证方法功能开启。如需开启,将base/qconf_shm.cc:24行的// #define USE_MIXED_VERIFY注释去掉,重新编译,同时必须删除之前QConf的共享内存。