设为首页 收藏本站
查看: 632|回复: 0

[经验分享] High Performance MySQL作者对TokyoTyrant做的性能测试(benchmark)

[复制链接]

尚未签到

发表于 2016-10-20 08:52:47 | 显示全部楼层 |阅读模式
  英语水品欠佳, 有错误还请指出, 以便获取更多知识, 谢谢.
  
  
High Performance MySQL作者对TT做的性能测试(benchmark)
作者的标准测试有两次是涉及TT的, 下面这次是专门关于TT的, 另外一次是Mysql和几种NoSQL数据库的对比测试.
原文地址:
专门针对TT的测试
TokyoTyrant – The Extras Part I : Is it Durable? (http://www.mysqlperformanceblog.com/2009/11/10/tokyo-tyrant-the-extras-part-i-is-it-durable/)
TokyoTyrant – The Extras Part II : The Performance Wall (http://www.mysqlperformanceblog.com/2009/11/11/tokyo-tyrant-the-extras-part-ii-the-performance-wall/)
TokyoTyrant -The Extras Part III : Write Bottleneck (http://www.mysqlperformanceblog.com/2009/11/12/tokyo-tyrant-%E2%80%93-the-extras-part-iii-write-bottleneck/)
多种数据库对比测试
MySQL-Memcachedor NOSQL Tokyo Tyrant – part 1 (http://www.mysqlperformanceblog.com/2009/10/15/mysql-memcached-or-nosql-tokyo-tyrant-part-1/)
MySQL-Memcachedor NOSQL Tokyo Tyrant – part 2 (http://www.mysqlperformanceblog.com/2009/10/16/mysql_memcached_tyrant_part2/)
MySQL-Memcachedor NOSQL Tokyo Tyrant – part 3 (http://www.mysqlperformanceblog.com/2009/10/19/mysql_memcached_tyrant_part3/)
可靠性:
1. 脚本向TC持续插入id-timestampe的数据, 通过kill -9杀死服务
结果: 重启服务后所有以插入记录恢复
分析: TC使用了内存映射文件, 文件缓存操作, 加载文件, 写回数据, 释放内存等工作都由系统完成, 因此kill -9不会导致数据丢失.
2. 突然断电后还是可能会导致数据错误
代码分析
/* Synchronize updated contents of a hashdatabase object with the file and the device. */
bool tchdbsync(TCHDB *hdb){
assert(hdb);
//锁定数据库
if(!HDBLOCKMETHOD(hdb, true)) return false;
//文件描述符小于0, 以writer打开, 在一个事务中的情况,
if(hdb->fd < 0 || !(hdb->omode & HDBOWRITER) ||hdb->tran){
//设置错误代码
tchdbsetecode(hdb, TCEINVALID, __FILE__, __LINE__, __func__);
解锁数据库
HDBUNLOCKMETHOD(hdb);
return false;
}
//首先检查是否以异步方式启动,如果是把刷延迟记录池中的记录
//如果同步启动或刷延迟记录失败, 解锁返回
if(hdb->async && !tchdbflushdrp(hdb)){
HDBUNLOCKMETHOD(hdb);
return false;
}
//将内存同步更新到物理设备上
bool rv = tchdbmemsync(hdb, true);
HDBUNLOCKMETHOD(hdb);
return rv;
}
/* Synchronize updating contents on memoryof a hash database object. */
bool tchdbmemsync(TCHDB *hdb, bool phys){
assert(hdb);
if(hdb->fd < 0 || !(hdb->omode & HDBOWRITER)){
tchdbsetecode(hdb, TCEINVALID, __FILE__, __LINE__, __func__);
return false;
}
bool err = false;
char hbuf[HDBHEADSIZ];
tchdbdumpmeta(hdb, hbuf);
memcpy(hdb->map, hbuf, HDBOPAQUEOFF);
if(phys){
size_t xmsiz = (hdb->xmsiz > hdb->msiz) ? hdb->xmsiz :hdb->msiz;
//msync会将所有改变的内存映射到磁盘
if(msync(hdb->map, xmsiz, MS_SYNC) == -1){
tchdbsetecode(hdb, TCEMMAP, __FILE__, __LINE__, __func__);
err = true;
}
if(fsync(hdb->fd) == -1){
tchdbsetecode(hdb, TCESYNC, __FILE__, __LINE__, __func__);
err = true;
}
}
return !err;
}
分析:
根据作者分析, 如果msync函数未调用, 则不能保证数据和磁盘同步.
只有tchdbmemsync函数调用了msync, 而tchdbmemsync被以下方法调用:
tchdboptimize
tchdbsync
tchdbtranbegin
tchdbtrancommit
tchdbtranabort
tchdbcloseimpl
tchdbcopyimpl
即: 在优化, 同步, 关闭连接, 开启, 提交, 事务中断操作发生时才会同步数据.
然而, TC中的事务实际是一个全局事务, 所有写入操作都会被锁, 即同时只有一个写入.
作者查找了Tyrant对Cabinet的调用没有发现对该方法的自动调用.
解决方案: 为了可靠性, 就需要直接调用同步命令, 每次写入后进行同步.
DSC0000.jpg
问题: 同步带来了25倍左右的性能差
分析:
从改为同步后的性能问题可以看出TC的同步实现的是全局同步, 所有的改变被一次刷入数据库, 因此需要修改为记录级别的同步, 如果有32个线程, 则仅有1个线程在运行, 其他31个被锁定, 严重的降低了性能.
作者认为可以借鉴InnoDB的小技巧. 通过一个简单的脚本在后台单独的运行, 每秒同步一次, 作者在做了这种同步与非同步的测试, 性能差为0.
这个小的任务脚本, 可以通过TT提供的扩展接口自动进行调度.
提升同步: 通过一个简单的脚本在后台单独的运行, 交给TT扩展接口自动调度.
DSC0001.jpg
结果: 作者测试结果为同步后性能降低一半, 但是可以通过调整调度频率来调节性能.
DSC0002.jpg
数据增长带来的问题:
性能降低的一个显而易见的原因是数据量的增大导致内存操作的减少, 取而代之的是磁盘操作.
作者禁用了文件系统缓存后测试了同步与异步的性能, 性能差是20倍, IO速率分别为31M/s和3.2M/s
DSC0003.jpg
从数据库方向, 作者测试了不同内存分配下的性能比对, 当然是内存高的性能高, 但是和mysql的对比结果是, 256M内存分配时, TT的并发是964TPS, 而mysql是160TPS, 因此, 作者认为5倍的提升是可取的.
DSC0004.jpg
写入瓶颈
TT同时只允许一个writer
DSC0005.jpg
在作者对写入瓶颈的测试中,8线程是性能最佳的.
作者在文末表明一个观点: 通过memcached客户端将数据分发到多个后端的TT数据库, 但是, 还没有做这方面的测试.
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-288678-1-1.html 上篇帖子: mysql从服务器出现的错误解決方法:Slave_SQL_Running: No(主-从) 下篇帖子: XAMPP 是一个易于安装且包含 MySQL、PHP 和 Perl 的 Apache 发行版
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表