博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
memcachedb单线程访问bdb的阻塞问题
阅读量:6487 次
发布时间:2019-06-24

本文共 3409 字,大约阅读时间需要 11 分钟。

memcacheq一个国内开发的message queue之性能研究
2008-05-07 14:40
XMPP中的presence适合用Message Queue的方式来实现,所以一直对快速的message queue实现比较关心。刚好在 memcachedb 上看到了一个   的项目,从字面上看就是一个mq的实现。因为它也采用memcache的协议,所以将以前做的 程序稍微修改看了下结果,环境和前面一样,测试数据不承担任何责任,仅供参考:)
1. 仅写入队列, 100万条
Thread: 2
Time elpased: 427s
Avg: 2,349 puts / sec
bdb data dir size: 945M
2. 仅队列读出, 100万条,使用上一步构建的队列数据。
Thread: 2
Time elpased: 569s
Avg: 1,763 gets / sec
bdb data dir size: 1.7G (这个地方有问题,可能还没完成?)
3. 同时出入队列,这个是符合应用的真实的情况,写入10万行后才开始启动读出队列程序。
Thread: 2
Time elpased: 569s
Avg: 1,049 puts / sec
Avg: 979 gets / sec
bdb data dir size: 1.6G 
测试总结:
  • 测试3中入队去除刚开始单独放10万条记录的速度,实际上出队和入队的速度是一样的,即同时操作平均速度在每秒1,000条(100 byte message)。
  • 速度趋于相同可参考我以前的分析 
  • 测试2中数据库相关实现可能有问题,数据越跑越大。
  • 因为以前用的是Apache  ,所以下一步打算在同环境比较一下。参看后文:
2008/5/8:看了一下memcacheq的代码,补充一下几个新看法:
  • memcacheq 是基于  的 memcache 协议包装
  • memcacheq 本身没有mq相关算法实现,所以上面实际测试的是单线程下berkeley db的效率。
  • 空间变大的问题是由于berkeley db算法延后删除,不是问题。
  • 有朋友问测试代码,其实比较简单,如下。
import java.util.concurrent.atomic.AtomicInteger; /**  * Test client for memcache protocol servers  * We use java memcached client, download from http://www.whalin.com/memcached/  * run: java MQTest [threads] [type], e.g. java MQTest 2 1  * @author Tim  */ public class MQTest implements Runnable {
CacheClient cc; public static AtomicInteger count = new AtomicInteger(); public static final String DATA100 = "TIM'S DATA AND CODE WITHOUT WARRANTY OF ANY KIND.#################" + "##################################"; // type: 0 - get, 1 - put private static int testType = 1; public static void main(String[] args) {
int thread = 1; if (args.length > 1) {
thread = Integer.parseInt(args[0]); testType = Integer.parseInt(args[1]); } System.out.println("Thread: " + thread); System.out.println("Test Type: " + (testType == 0 ? "get queue" : "put queue")); long time1 = System.currentTimeMillis(); for (int i = 0; i < thread; i++) {
MQTest test = new MQTest(); Thread t = new Thread(test); t.start(); } printStat(time1); } public MQTest() {
cc = new CacheClient(); cc.setServerPort("server:11211"); } public void run() {
while (true) {
if (testType != 0) set(); else get(); } } public void get() {
cc.get("q"); count.incrementAndGet(); } public void set() {
cc.set("q", DATA100); count.incrementAndGet(); } private static void printStat(long time1) {
while (true) {
long time2 = System.currentTimeMillis(); if (time2 == time1) continue; int cnt = count.get(); System.out.println("---------------------------"); System.out.println("Total: " + cnt); System.out.print("Time elapsed: "); System.out.println((time2 - time1) / 1000); System.out.print("AVG: "); System.out.println(cnt * 1000l / (time2 - time1)); try {
Thread.sleep(3000); } catch (InterruptedException e) {
e.printStackTrace(); } } } }

转载于:https://www.cnblogs.com/balaamwe/archive/2011/12/22/2297729.html

你可能感兴趣的文章
WPF整理-使用ResourceDictionary管理Logical Resources
查看>>
广告banner:手动滑动切换,自动切换,点击跳转,异步加载网络图片
查看>>
2018-05-17 第十一天
查看>>
linux 下实现ssh免密钥登录
查看>>
MySQL 5.7 LOGICAL_CLOCK 并行复制原理及实现分析
查看>>
apache访问日志
查看>>
shell后台执行命令-crontab
查看>>
jQuery |添加标签元素/内容
查看>>
oracle 动态注册和静态注册
查看>>
linux 压缩以及归档
查看>>
将VMware Workstation 12 Pro的虚拟网卡修改为自己希望的IP网段
查看>>
Java文件读取 中文乱码
查看>>
【极品手机推荐】安卓3G运存16G内存,相机1300+500,三星高画质显示J7109|J7108
查看>>
《乐在C语言》一2.2 数据类型
查看>>
《科学+ 预见人工智能》——物理学家的管理方式
查看>>
Ceph分布式存储学习指南1.10 iRODS
查看>>
Linux有问必答:怎么用CheckInstall从源码创建一个RPM或DEB包
查看>>
《51单片机应用开发从入门到精通》——2.6 中断控制功能的作用
查看>>
《 Python树莓派编程》——第1章 树莓派简介 第1.1 树莓派的历史
查看>>
Sed&awk笔记之awk篇:快速了解Awk(三)
查看>>