漫漫长路,其修远兮!
分类: Mysql/postgreSQL
2013-05-20 13:37:02
mysql集成的memcache有三种策略:innodb_only数据只插入表,cache_only只缓存数据,caching即缓存数据又插入表,每次修改策略,都要重启mysql才能生效。所以,理论是哪个cache_only策略是性能最快的,它只把数据缓存起来,缓存到内存里,并没有和innodb交互,但这样,这个插件也失去了意义。
测试机器
IP:192.168.3.64
Cpu:4*Intel(R) Core(TM) i3-2130 CPU @ 3.40GHz
Memory:3G
测试工具:memslap与memaslap
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 |
|
|
|
|
|
u 测试Mysql5.6 memcached API
1. 在cache_only策略下
测试命令
测试说明:测试时间2min,4个线程,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. 原生的memcached和cache_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:版本信息