如何用muduo实现memcached协议

最近花了两天时间用 muduo 部分实现了 memcached 服务器协议,代码位于

examples/memcached/server,能通过 memcached 的大部分测试用例(incr/decr 还没有实现)。

这不是 memcached 的替代品(它没有实现LRU和超时功能,也没有实现二进制协议,更没有自己管理内

存),而是一个网络编程的示例(代码只有 1000 行,比 memcached 小很多),展示 muduo 风格的事

件驱动编程,以及将来性能优化的试验品(换句话说,现在这个版本完全没有在性能上做出任何努力)

。读过 memcached 代码的人可以对比这两种编程风格的区别,memcached 的 read/write 操作穿插于

正常逻辑处理,而 muduo 的网络数据读写是由库完成,应用程序只关心消息收发,目前二者的基本

get/set 操作的性能相当。

现在 muduo 的 inspector 内置了 gperftools 的远程 profiling

功能,memcached-debug 展示了其用法。

为什么不必优化 set 操作(含

set/add/update/append/prepend/cas 等)的性能?

1. 比例。既然是 memcache,那么

get:set 的比例很高,10:1 甚至更高,因此优化的重心应该是 get 而非 set。

假设

memcached 能处理 100k QPS,再假设这些操作都是 set(其实应该不到 10% 是 set),再假设所有的

set 都是串行执行的(没有并发),那么每次 set 的 CPU 时间不应该超过 10 us(含服务器本地的网

络代码运行时间,但不含网络延迟)。而实际上一次 set 的 CPU 时间最多是 2~3 us (用

memcached-footprint 程序测得),根本不值得优化。

2. 网络带宽。假设一次 set 操作的

key + value 的长度是 1k bytes,TCP 的有效载荷带宽按110MB/s估算,那么1kB数据在千兆网上的惯

性延迟是 9us(传输延迟是几十上百微秒,与此无关),也就是说服务器的网卡收到这 1kB 数据需要

花 9us 时间(从第一个字节到达到服务器到收完最后一个字节),那么在 set 耗时 2~3 us 的情况下

再去优化它是做无用功。

3. 产生“需要更新的数据”的成本远大于 memcached set 的开销。

memcached 需要更新,往往是将已写入数据库的新数据放到 memcached 中,那么写数据库的开销远远

大于 memcached set 的开销,优化 set 对提升系统整体性能没意义。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

时间: 2024-10-22 15:37:18

如何用muduo实现memcached协议的相关文章

Mcrouter —— memcached 协议路由每秒50亿请求

Mcrouter 是一个 memcached 协议路由器,用于对 memcached 的部署进行扩展.这是 Facebook 缓存架构的核心组件,峰值的时候每秒可处理 50 亿请求.详细介绍请看这里. 文章转载自 开源中国社区 [http://www.oschina.net]

memcached协议

在memcache协议中发送的数据分两种:文本行 和 自由数据. 文本行被用于来自客户端的命令和服务器的回应.自由数据用于客户端从服务器端存取数据时.存储在memcached中的数据通过键值来标识.键值是一个文本字符串,对于需要存取这项数据的客户端而言,它必须是唯一的. 协议 Protocol memcached 的客户端使用TCP链接 与 服务器通讯.(UDP接口也同样有效,参考后文的 "UDP协议" )一个运行中的memcached服务器监视一些(可设置)端口.客户端连接这些端口,

Memcached 二进制协议(BinaryProtocol) incr指令泄露内存数据的bug

缘起 最近有个分布式限速的需求.支付宝的接口双11只允许每秒调用10次. 单机的限速,自然是用google guava的RateLimiter. http://docs.guava-libraries.googlecode.com/git-history/master/javadoc/com/google/common/util/concurrent/RateLimiter.html 分布式的ReteLimiter,貌似没有现在的实现方案.不过用memcached或者Redis来实现一个简单的也

php模块memcache和memcached区别分析

1.目前大多数php环境里使用的都是不带d的memcache版本,这个版本出的比较早,是一个原生版本,完全在php框架内开发的.与之对应的带d的memcached是建立在libmemcached的基础上,所以相对来说,memcached版本的功能更全一些. memcache:http://cn2.php.net/manual/en/book.memcache.php memcached:http://cn2.php.net/manual/en/book.memcached.php 2.Memca

Muduo 网络编程示例(四)Twisted Finger

Python Twisted 是一款非常好的网络库,它也采用 Reactor 作为网络编程的基本模型,所以从使 用上与 muduo 颇有相似之处.(当然,muduo 没有 deferreds)Finger 是 twisted 文档的一个经典 例子,本文展示如何用 muduo 来实现最简单的 finger 服务端.限于篇幅,只实现 finger01~07.代 码位于 examples/twisted/finger . 1 拒绝连接 什么都不做,程序空等. finger01.cc 1: #inclu

Memcached的安装及管理

一 Memcache概述 memcached是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多 网站使用.这是一套开放源代码,以BSD license授权释出.软件是一个高性能的分布式的内存对象缓存系统.通过在内存里维 护一个巨大的hash表,用于动态Web应用以减轻数据库负载.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程

redhat as 6.2下安装memcached

Memcached是什么? emcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信.但是它并不提供冗余(例如,复制其hashmap条目):当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失.

看看mina和memcached的联姻(适合不同语言客户端,高并发?)

[size=medium]/** * 作者:张荣华 * 日期:2008-07-21 **/ 看看mina和memcached的联姻 先来解释一下这两个东东的身世 Mina,是什么? Minan是一个network 应用框架,她能很方便的帮助用户开发出高性能和高可扩展性的网络应用程序.官方地址请看:http://mina.apache.org/ Memcached是什么? memcached一个remote cache,它只提供数据存储服务,不过它得java客户端比较不错,还有很多其他语言的客户端

PHP MemCached win安装

1.目前大多数php环境里使用的都是不带d的memcache版本,这个版本出的比较早,是一个原生版本,完全在php框架内开发的.与之对应的带d的memcached是建立在libmemcached的基础上,所以相对来说,memcached版本的功能更全一些,目前只有Linux版本 . memcache:http://cn2.php.net/manual/en/book.memcache.php memcached:http://cn2.php.net/manual/en/book.memcache