Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1366714
  • 博文数量: 243
  • 博客积分: 888
  • 博客等级: 准尉
  • 技术积分: 2955
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-05 14:33
个人简介

漫漫长路,其修远兮!

文章分类

全部博文(243)

文章存档

2017年(2)

2016年(22)

2015年(32)

2014年(57)

2013年(107)

2012年(23)

分类: Mysql/postgreSQL

2013-05-20 13:37:02

mysql集成的memcache有三种策略:innodb_only数据只插入表,cache_only只缓存数据,caching即缓存数据又插入表,每次修改策略,都要重启mysql才能生效。所以,理论是哪个cache_only策略是性能最快的,它只把数据缓存起来,缓存到内存里,并没有和innodb交互,但这样,这个插件也失去了意义。

 

 

测试机器

IP192.168.3.64

Cpu4*Intel(R) Core(TM) i3-2130 CPU @ 3.40GHz

Memory3G

测试工具:memslapmemaslap

一.使用memslap测试

u  测试Mysql5.6 memcached API

1.       cache_only策略下

测试命令

./memslap --servers=127.0.0.1:11211  --concurrency 32 --execute-number 10000 --test set

./memslap --servers=127.0.0.1:11211  --concurrency 32 --execute-number 10000 --test get

测试说明:32个并发,每个连接10000,总共32万笔数据

测试结果

set

Took 2.612 seconds to load data

get

Took 1.856 seconds to read data

2.       caching策略下

测试命令

./memslap --servers=127.0.0.1:11211  --concurrency 32 --execute-number 10000 --test set

./memslap --servers=127.0.0.1:11211  --concurrency 32 --execute-number 10000 --test get

测试结果

set

Took 140.201 seconds to load data

get

Took 1.940 seconds to read data

3.       innodb_only策略下

测试命令

./memslap --servers=127.0.0.1:11211  --concurrency 32 --execute-number 10000 --test set

./memslap --servers=127.0.0.1:11211  --concurrency 32 --execute-number 10000 --test get

测试结果

set

Took 155.202 seconds to load data

get

Took 4.586 seconds to read data

u  原生memcached测试

测试命令

启动memcached./memcached -d -u nobody -l 127.0.0.1 -m 2048 -p 11311

./memslap --servers=127.0.0.1:11311  --concurrency 32 --execute-number 10000 --test set

./memslap --servers=127.0.0.1:11311  --concurrency 32 --execute-number 10000 --test get

测试结果

set

Took 2.075 seconds to load data

get

Took 1.645 seconds to read data

 

    测试对比表:并发32,每个并发10000,单位s()

类型|策略

cache_only

caching

innodb_only

原生memcached

set

2.612

140.201

155.202

2.075

get

1.856

1.940

4.586

1.645

 

 

 

 

 

 

二.使用memaslap测试

u  测试Mysql5.6 memcached API

1.       cache_only策略下

测试命令

测试说明:测试时间2min4个线程,32个并发,数据为1000000

./memaslap -s 127.0.0.1:11211 -t 2m -T 4 -c 32 -S 20s  -o 0.2

测试结果

Total Statistics (28311232 events)

   Min:         8

   Max:     20121

   Avg:       134

   Geo:     86.43

   Std:    220.26

   Log2 Dist:

       0:        0        0        0        7

       4:   304921   2661995   9050457   7774543

       8:   5061780   2564362   746598   108944

      12:    26701     8717     2156       51

cmd_get: 25480123

cmd_set: 2831141

get_misses: 19950104

written_bytes: 4912013035

read_bytes: 6260689626

object_bytes: 3080281408

 

Run time: 120.1s Ops: 28311264 TPS: 235807 Net_rate: 88.7M/s

2.       caching策略下

测试命令

./memaslap -s 127.0.0.1:11211 -t 2m -T 4 -c 32  -S 20s  -o 0.2

测试结果

Total Statistics (1046001 events)

   Min:        10

   Max:    907873

   Avg:      3676

   Geo:    194.04

   Std:  29171.55

   Log2 Dist:

       4:     1213    15362   123893   249805

       8:   322504   213241    76582    16634

      12:     3807     1451      867     1765

      16:     2696     3123     9121     3748

      20:      189

cmd_get: 941416

cmd_set: 104617

get_misses: 23

written_bytes: 181498665

read_bytes: 1045747761

object_bytes: 113823296

 

Run time: 120.0s Ops: 1046033 TPS: 8716 Net_rate: 9.8M/s

 

3.       innodb_only策略下

测试命令

./memaslap -s 127.0.0.1:11211 -t 2m -T 4 -c 32  -S 20s  -o 0.2

测试结果

         Total Statistics (858158 events)

         Min:        23

         Max:    867291

         Avg:      4478

         Geo:    302.45

         Std:  31281.07

         Log2 Dist:

            4:        0      160    28240    95066

            8:   322519   263787    83832    27657

            12:    12120     3435     1001     1450

            16:     2080     3648     9742     3220

            20:      201

cmd_get: 772356

cmd_set: 85834

get_misses: 487

written_bytes: 148906145

read_bytes: 857431483

object_bytes: 93387392

Run time: 120.0s Ops: 858190 TPS: 7151 Net_rate: 8.0M/s

 

u  原生memcached测试

测试命令

./memaslap -s 127.0.0.1:11211 -t 2m -T 4 -c 32  -S 20s  -o 0.2

测试结果:

Total Statistics (28578145 events)

   Min:        11

   Max:    278687

   Avg:       132

   Geo:     61.23

   Std:    610.87

   Log2 Dist:

       4:   715757   5172436   11897234   5005972

       8:   4406944   714282   250783   170807

      12:   136736    65753    39662     1699

      16:       40       32        0        8

cmd_get: 25720345

cmd_set: 2857832

get_misses: 0

written_bytes: 4958322130

read_bytes: 28572414494

object_bytes: 3109321216

 

Run time: 120.1s Ops: 28578177 TPS: 237937 Net_rate: 266.2M/s

 

  

类型|策略

cache_only

caching

innodb_only

原生memcached

Std返回时间标准差

220.26

29171.55

31281.07

610.87

get_misse获取失败数

19950104(比较奇怪)

23

487

0

TPS每秒的操作数

 235807

8716

7151

237937

 

三.测试结论

1.       原生的memcachedcache_only策略性能差不多,但是采用这种策略的话,也就不能和innodb表进行同步数据,也就失去了该插件的意义。一般情况下采用caching策略,这种策略下get操作性能相差不大,但是set性能相差很大。

2.       Memcached API 返回时间的std标准差比较大,表现不是很稳定,get_missess也比较大,

TPS差距也很大。

3.       有阿里的同学反映,Memcached API内存泄漏很严重,get key都能把内存搞完。具体的bug见链接

 

 

 

 

附链接

1.       InnoDB Memcached Plugin源码实现调研

2.       官方介绍文档

http://dev.mysql.com/doc/refman/5.6/en/innodb-memcached-setup.html

3.       Memaslap工具使用

 


Memslap/memaslap选项

-s, --servers=:列出一个或多个所要连接的memcached服务器端。服务器的数量一定要小于线程的数量e.g.: --

servers=localhost:1234,localhost:11211

-T, --threads=:线程数量,最好等于cpu数量。默认值为8

-c, --concurrency=:负载需要虚拟的并发数量,默认值是128

-n, --conn_sock=:一个并发的tcp连接数量,默认值是1

-x, --execute_number=set/get数量,默认值100w

-t, --time=:运行时间,其格式为: s-seconds, m-minutes, h-hours, d-days e.g.: --time=2h.

-F, --cfg_cmd=:加载配置文件

-w, --win_size=:任务窗口大小,e.g.: --win_size=10k. 默认值为10k

-X, --fixed_size=value的大小

-v, --verify=:所要确认的数据比例, e.g.: --verify=0.01

-d, --division=:多重get的数量,默认值为1即单个get

-S, --stat_freq=:定期清理静态数据的间隔时间, e.g.: --resp_freq=10s.

-e, --exp_verify=:失效时间的比例, e.g.: --exp_verify=0.01。默认情况是不设置该选项

-o, --overwrite=:对象需要覆盖的比例, e.g.: --overwrite=0.01.默认情况是不进行覆盖。

-R, --reconnect:支持重新连接

-U, --udp:使用UDP协议,默认是TCP协议

-a, --facebook:启动faceb检测

-B, --binary:使用二进制协议,默认值是ascii协议

-P, --tps=:吞吐量, e.g.: --tps=10k.

-p, --rep_write=:前n个服务端可以写数据, e.g.: --rep_write=2.

-b, --verbose:错误信息

-h, --help:帮助文档

-V, --version:版本信息

阅读(3654) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~