Twemperf又名mcperf,是一款memcached的性能测试工具。Mcperf就像httperf,但它基于memcached的协议,它使用memcached的ASCII协议并且能够快速的产生大量memcached连接和请求。该工具主要用于memcached性能测试,模拟大并发set、get等的操作,mcperf只能运行在unix/linux环境下。

一、下载

Twemperf对应的github下载地址:https://github.com/twitter/twemperf

二、安装

下载后,传到任意一台服务器上(注:只能在linux上运行)解压安装。

tar zxvf mcperf-0.1.1.tar.gz
cd mcperf-0.1.1
sudo autoreconf -fvi  //然后就生成configure文件啦。。。。
CFLAGS="-ggdb3 -O0" ./configure --enable-debug
sudo make
sudo make install

三、运行

1、首先运行memcached(默认端口是11211,若运行memcached的时候自己指定了端口号,下面执行Twemperf工具命令时注意相应的指定IP和端口,因为Twemperf工具默认是11211端口哦)。

./memcached -d -m 256 -l 10.142.90.152 -u root -p 8718 -vv
参数名称	作用
-d	以守护进程方式启动。如果该参数没有指定,当按ctrl+c命令结束,memcache自动关闭
-m	分配给memcache使用的最大内存数 单位是m,默认是64m
-u	指定运行memcache的用户
-l:	指定监听的ip地址
-p	指定监听的tcp端口号,可以通过-u指定udp端口.默认是11211
-c	最大并发连接数 默认是1024(注意:所以启动memcached的时候不进行设置可能导致用twemperf工具测试时设置连接数过大导致工具崩溃哦。。。
-P	报错进程id的文件
-p, --port=<num>          TCP port to listen on (default: 11211)
-U, --udp-port=<num> UDP port to listen on (default: 0, off)
-s, --unix-socket=<file> UNIX socket to listen on (disables network support)
-A, --enable-shutdown enable ascii "shutdown" command
-a, --unix-mask=<mask> access mask for UNIX socket, in octal (default: 0700)
-l, --listen=<addr> interface to listen on (default: INADDR_ANY)
-d, --daemon run as a daemon
-r, --enable-coredumps maximize core file limit
-u, --user=<user> assume identity of <username> (only when run as root)
-m, --memory-limit=<num> item memory in megabytes (default: 64 MB)
-M, --disable-evictions return error on memory exhausted instead of evicting
-c, --conn-limit=<num> max simultaneous connections (default: 1024)
-k, --lock-memory lock down all paged memory
-v, --verbose verbose (print errors/warnings while in event loop)
-vv very verbose (also print client commands/responses)
-vvv extremely verbose (internal state transitions)
-h, --help print this help and exit
-i, --license print memcached and libevent license
-V, --version print version and exit
-P, --pidfile=<file> save PID in <file>, only used with -d option
-f, --slab-growth-factor=<num> chunk size growth factor (default: 1.25)
-n, --slab-min-size=<bytes> min space used for key+value+flags (default: 48)
-L, --enable-largepages try to use large memory pages (if available)
-D <char> Use <char> as the delimiter between key prefixes and IDs.
This is used for per-prefix stats reporting. The default is
":" (colon). If this option is specified, stats collection
is turned on automatically; if not, then it may be turned on
by sending the "stats detail on" command to the server.
-t, --threads=<num> number of threads to use (default: 4)
-R, --max-reqs-per-event maximum number of requests per event, limits the
requests processed per connection to prevent
starvation (default: 20)
-C, --disable-cas disable use of CAS
-b, --listen-backlog=<num> set the backlog queue limit (default: 1024)
-B, --protocol=<name> protocol - one of ascii, binary, or auto (default)
-I, --max-item-size=<num> adjusts max item size
(default: 1mb, min: 1k, max: 128m)
-F, --disable-flush-all disable flush_all command
-X, --disable-dumping disable stats cachedump and lru_crawler metadump
-o, --extended comma separated list of extended options
most options have a 'no_' prefix to disable

  

2、twemperf工具使用说明

安装完成后在$twemperf/src下面有mcperf命令,使用参数如下说明:

其中文解释大致如下:

Options:
-h, –help            : 显示帮助
-V, –version         : 显示版本
-v, –verbosity=N     : 设置日志级别(默认为5,最小0,最大11)
-o, –output=S        : 设置日志文件(默认输出标准错误)
-s, –server=S        : 设置需要测试的服务器(默认是本机)
-p, –port=N          : 设置需要测试的端口(默认是11211)
-H, –print-histogram :打印响应时间的柱状图

-t, –timeout=X       : 设置链接和响应的超时时间(默认是0秒)
-l, –linger=N        : 设置TCP连接的断开时间(默认不开启)
-b, –send-buffer=N   : 设置socket发送缓冲区大小(默认是4096字节)
-B, –recv-buffer=N   : 设置socket接收缓冲区大小(默认是16384字节)
-D, –disable-nodelay : 取消TCP延迟

-m, –method=M        : memcached的一些基本操作(例如set、get、add、delete等,默认是set)
-e, –expiry=N        : set the expiry value in sec for generated requests (default: 0 sec)
-q, –use-noreply     : set noreply for generated requests
-P, –prefix=S        : set the prefix of generated keys (default: mcp:)

-c, –client=I/N      : set mcperf instance to be I out of total N instances (default: 0/1)
-n, –num-conns=N     :设置连接数(默认是1)
-N, –num-calls=N     : 设置每一个连接发送的请求数(默认是1)
-r, –conn-rate=R     : 设置每秒建立多少个连接(默认是每秒0个连接,每一个连接在上一个连接断开后创建)
-R, –call-rate=R     : 设置每秒发送的请求数(默认是每秒0个请求,每一个请求在上一个请求响应后发送)
-z, –sizes=R         : 发送存储数据的大小(默认是1个字节)

3、用法示例

官网示例一:创建1000个并发连接,来连接本机的11211端口(此端口是该工具的默认端口),连接创建的速度是每秒1000个,每一个连接发送“set”请求10次(相当于迭代10次),这10次请求在每秒1000的请求的速度下发送,发送的数据大小在(也就是存入到memcached中的value的大小)1~16个字节中正态分布。

命令为:mcperf --linger=0 --timeout=5 --conn-rate=1000 --call-rate=1000 --num-calls=10 --num-conns=1000 --sizes=u1,16

官网示例二:创建100个连接,来连接本机的11211端口,每一个连接在上一个连接断开后创建,每一个连接发送100个“set”请求,每一个请求是在收到上一个请求的响应之后创建,发送的数据大小是1个字节。

命令为:mcperf --linger=0 --call-rate=0 --num-calls=100 --conn-rate=0 --num-conns=100 --sizes=d1

(IP和端口若需要变则通过以下参数设置 --server=10.142.90.152 --port=8718)

示例三:

src/mcperf -s 10.142.90.152 -p 8718 --linger=0 --timeout=5 --conn-rate=1000 --call-rate=1000 --num-calls=10000 --num-conns=100 --sizes=u1024,10240

(--num-conns=100是并发建立100个连接;--num-calls=10000是在一个连接上发1w个请求;--sizes是数据大小在1k和10k之间称正态分布;-conn-rate=1000是1秒钟建立1000个连接)

示例四:

mcperf --linger=0 --timeout=5 --conn-rate=1000 --call-rate=1000 --num-calls=10 --num-conns=1000 --sizes=u1,16 --server=10.142.90.152 --port=8718 --method=set

结果字段解释

Total:显示总的连接数,总的请求数,总的响应数以及测试所花费的时间。

Connection rate:实际每秒的连接数

Connection time:实际每个连接花费的时间(包括连接时间,set时间等)

Connect time:连接所花费的时间(仅仅是连接所用的时间)

Request rate:每秒的请求数

Request size:每个请求的字节大小

Response rate:每秒的响应数

Response size:响应的字节大小

Response time:响应的时间(单位毫秒)

Response type:stored表示存储的数量,not_stored表示没有存储的数量,exists表示已经存在的数量,not_found表示没有找到的数量

再后面的参数没有较大意义,故此不解释。

示例五:测试的脚本(主要是控制call-rate和num-calls两个参数值来对应不同并发):

#!/bin/bash
# 1M=1048576B
data_size=(d100 d102400 d307200 d512000 d1048500)
data_size_readable=(100B 100K 300K 500K 1M)
memory_size=(256 512 1024 2048 5120)
# call_data=(200 300 500 800 1000)
call_data=(10 30 50 80 100 200)
# call_data=(10 30 50 80 100 200 300 500 800 1000)
# call_data=(2000 3000 5000 8000 10000) #./memcached -d -m 256 -l 10.xx.xx.152 -u root -p 8718 -vv for((i=0;i<;i++));do
for((j=0;j<6;j++));do
echo "****************method=set conns=100 data_size=${data_size_readable[i]} call-rate=${call_data[j]} num-calls=${call_data[j]}****************"; ./../src/mcperf --linger=0 --timeout=5000 --conn-rate=100 --call-rate=${call_data[j]} --num-calls=${call_data[j]} --num-conns=100 --sizes=${data_size[i]} --server=10.xxx.xx.152 --port=8718 --method=set
if [ ${j} -ge 1 ]; then
sleep 1m
fi
if [ $? -ne 0 ]; then
echo "***************************failed***************************"
fi
done;
done;

四、结论

通过上面的介绍,可以看出,用mcperf测试memcache的方法就是调整不同的参数值来执行命令,经过多次采样后得出结果。

一般重点关注Total、Connection rate、Request rate、Response rate、Response time、Response type、Net I/O这几个指标。

通过多次测试采样,得到以上需要的数据之后可以用excel表格做出一个统计效果来观看。

五、实际测试结果示例

使用mcperf对memcached进行测试,对于平台架构部署以及客户端代码的优化有着重要意义。下面是网上一篇博客文章中使用mcperf对memcached进行性能测试所得的简要结果报告。

测试环境: 操作系统:centos-5.5-x86_64 内存:1G CPU:1核

结论一:

由以下图表可见,存储的数据越大,则随着并发数的上升memcached处理请求的速度下降越明显。因此,存储数据不宜过大,如果确实要存储较大数据,建议拆分成两个或多个key存储。

图1 单机部署,每线程迭代10000次,发送数据100字

图2 单机部署,每线程迭代10000次,发送数据1024字节

图3 集群部署,每线程迭代10000次,发送数据100字节

图4 集群部署,每线程迭代10000次,发送数据1024字节

结论二:

由以上图标显示,用户并发请求情况下,memcached集群部署能够提升请求效率,并且并发用户数越大,集群部署提升的性能越明显(平均耗时小,吞吐量大)。

图略。。。

结论三:

Memcached中key(键)最大允许250个英文字符或27个中文字,超过这些最大值,则数据无法存储。另外,官方文档指出,value(值)最大允许存储1M的数据,超过1M的数据无法存储(不会存储)。因此

建议,key不宜太大,value也不宜过大,如果value超过1M,建议存储到两个或多个key中。

结论四:

Memcached内存存储满数据之后,之后再存储的数据不会再消耗内存,最老的数据会被删除(LRU算法),memcached启动参数默认是开启LRU(近期最少使用算法)的。如果启动参数加上-M则不开启LRU算

法,此时如果内存已满再存放数据则会报错。 由上面的图标可得,当存放的数据大小变化不是很大时,尽量将growth_factor(增长因子)的值设小(最小为1,但是不能是1,默认为1.25),此参数在

memcached启动时指定:-f 1.25。该参数的设置根据存储数据大小决定。根据实际测试几百字节(<1K以内)的数据建议将此参数设置为1.2(而非默认的1.25),将明显提升memcached的内存使用率。

结论五:

两台服务器同时运行性能测试 每台5000并发,写入速度每秒10次,导致memcached服务器网卡瘫痪,待服务器自动恢复后,memcached进程崩溃。 每台1800并发,写入速度每秒10次,数据无法写入

memcached,运行一段时间后,出现大量阻塞进程,内存飙升,网络流量激增,最后网卡瘫痪 每台1500并发,写入速度每秒10次,数据写入OK,但系统资源占用严重 网卡瘫痪的原因是数据写入太大,net

I/O负担过重导致瘫痪,memcached进程崩溃原因尚不明确。因此建议并发量不宜超过3000。

结论六:

由上图可知,并发量在100左右时,存(set)和取(get)数据速度最快,速度大约在13000req/s。

结论七(memcached的BUG?):

图中所示,memcached实际存储的数据量超过memcached设定的内存大小(开启或关闭LRU的情况下都存在此问题)。此BUG必现步骤:

1、  将memcached内存大小设置为4M(或其他较小数值)
2、  重启memcached
3、 
使用java客户端运行测试,执行set操作,每次存储数据大小10K
4、 
待memcached无法再存数据后,停止测试,将存储数据大小改为1K,然后继续执行set操作
5、  运行几秒后此问题可必现

参考网址:

https://my.oschina.net/u/561917/blog/908414

http://blog.51cto.com/332532/1897359

https://yq.aliyun.com/articles/489374?spm=5176.10695662.1996646101.searchclickresult.3df5402f4HMIm0

http://maoyidao.iteye.com/blog/1757613

memcached性能测试之Twemperf的更多相关文章

  1. 性能测试之Windows常见性能计数器

    性能计数器(counter)是描述服务器或操作系统性能的一些数据指标.计数器在性能测试中发挥着“监控和分析”的关键作用,尤其是在分析系统的可扩展性.进行性能瓶颈的定位时,对计数器的取值的分析非常关键. ...

  2. 性能测试培训:Ajax接口级性能测试之jmeter版

    性能测试培训:Ajax接口级性能测试之jmeter版   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest认为工具 ...

  3. 老李分享知识:性能测试之TPS和吞吐率

    老李分享知识:性能测试之TPS和吞吐率        当增大系统的压力(或添加并发用户数)时,吞吐率和TPS的改变曲线呈大体一致,则系统基本稳定. 若压力增大时,吞吐率的曲线添加到一定程度后出现改变缓 ...

  4. Shell脚本 | 性能测试之启动流量

    安卓应用的流量统计有多种方式,点击「阅读原文」可以看到一篇别人写的文章,关于安卓流量数据的获取,写的挺全的,列举了几种不同方式的优劣.(见文末参考链接) 今天我要分享的是通过脚本一键获取应用的启动流量 ...

  5. 公司HBase基准性能测试之结果篇

    上一篇文章<公司HBase基准性能测试之准备篇>中详细介绍了本次性能测试的基本准备情况,包括测试集群架构.单台机器软硬件配置.测试工具以及测试方法等,在此基础上本篇文章主要介绍HBase在 ...

  6. 性能测试之JMeter远程模式

    性能测试之JMeter远程模式 事实上,你的JMeter客户端机器是不能表现出完美的压力请求,来模拟足够多的用户或由于网络限制去向服务施加压力,一种解决方法是通过一个JMeter去控制多个/远程JMe ...

  7. memcached性能监控

    在上文“在Windows .NET平台下使用Memcached”中,我给大家介绍了如何在Windows平台上部署Memecached服务端,如何在.NET平台中应用Memcached,详细介绍了两种流 ...

  8. 网页性能测试之WebPageTest

    想知道您的网站,性能怎么样? 很自然,首先得找一个广被认可的测试工具.我们推荐WebPageTest: WebPageTest 它是google 开源项目”make the web faster “的 ...

  9. 性能测试之-wrk(转)

    转载地址:http://zjumty.iteye.com/blog/2221040 测试先行是软件系统质量保证的有效手段. 在单元测试方面, 我们有非常成熟的 xUnit 方案. 在集成测试方面, 我 ...

随机推荐

  1. Abp vNext 切换MySql数据库

    Abp vNext是Abp的下一代版本,目前还在经一步完善,代码已经全部重写了,好的东西保留了下来,去除了很多笨重的东西,从官宣来看,Abp vNext主要是为了以后微服务架构而诞生的. 从源码来看, ...

  2. 随心测试_软测基础_002_<测试工程师_核心技能体系>

    测试工程师核心技能体系构成 测试基础体系:[对象——>方法——>流程].[测试活动类型——>质量] 测试分析体系:[测试对象分析]——>[测试设计(计划.数据.用例.文档)] ...

  3. easyui-tab标签

    一. 加载方式 //class 加载方式<div id="box" class="easyui-tabs" style="width:500px ...

  4. 控制结构(11): Continuation passing style(CPS)

    // 上一篇:控制结构(10)指令序列(opcode) [注释]: 这个笔记系列需要告一个段落了,收尾部分整理下几个时髦(The New Old Things)结构. 后面打算开一个算法方面的,重新学 ...

  5. 记录下mainfest.json 原生标题的按钮监听

    首先在mainfest.json中 plus下添加以下代码 "launchwebview": {"titleNView": {"backgroundc ...

  6. 简单实现计算机上多个jdk环境切换

    实现多个jdk环境切换,大致有两种方式 安装两个jdk,并配置相应的环境变量,在java的控制面板中修改设置 非主要的jdk仅仅是用来测试,并不常用,故只要让ide配置对应的jdk位置就可以了,属于懒 ...

  7. ORM之自关联、add、set方法、聚合函数、F、Q查询和事务

    一.外键自关联(一对多) 1.建表 # 评论表 class Comment(models.Model): id = models.AutoField(primary_key=True) content ...

  8. C/C++ const

    一 含义 const修饰的变量在C和C++中的含义是什么?一样吗? 在C中用const修饰的变量仅仅表示这个符合表示的变量不能被赋值,是只读的,那么它与常量有啥区别呢?区别就是一个是常量,一个是变量. ...

  9. 图论(最短路&最小生成树)

    图论 图的定义与概念 图的分类 图,根据点数和边数可分为三种:完全图,稠密图与稀疏图. 完全图,即\(m=n^2\)的图\((m\)为边数,\(n\)为点数\()\).如: 1 1 0 1 2 1 1 ...

  10. Zabbix通过Orabbix监控Oracle数据库

    一.背景 公司业务使用的是一直Oracle数据库,因为多次出现表空间满的时候不能及时发现,每次都是业务组的人员通知处理,这样下来DBA这边就比较被动,所以老大要求监控表空间剩余大小并且当剩余过小时能够 ...