memlink性能测试、与redis,mysql的性能测试对比

红薯 发布于 2011/04/12 08:37
阅读 6K+
收藏 3

这是来自 memlink 官方上的一份测试报告,首先得发表一下个人意见,nosql 拿来跟 mysql 做性能比较是不厚道的。

Introduction

Memlink用于存储Key=>List数据,下面对比了不同数据存储引擎存储存储Key=>List数据的性能和内存开销。压力测试分为:客户端有长连接和短链接、N个并发数执行M个查询、在不同数据规模下等多种组合测试。

Details

硬件

OS:CentOS release 4.6 (Final) 内核:2.6.9-67.0.22.ELsmp 32位

内存:4G

CPU:Intel(R) Xeon(R) CPU E5405 @ 2.00GHz (四核)

硬盘:250G SATA

数据模型

CREATE TABLE `ThreadList` (
 
`forumid` int(11) NOT NULL,
 
`threadid` char(12) NOT NULL,
 
`status` bit(1) DEFAULT 0,
 
`reply_time` datetime NOT NULL,
  KEY
`threadlist` (`forumid`,`reply_time`,`status`)
) ENGINE=Innodb DEFAULT CHARSET=utf8;

memlink

c:表示c客户端每秒操作成功条数,py:表示python客户端每秒操作成功条数,php:为php客户端每秒操作成功条数。mem:表示 memlink server消耗内存。 insert为插入操作,range为获取列表某个范围的操作。插入的列表中的数据每条为12字节。

redis

redis测试一样每条数据是12字节。redis只测试c客户端。这里有两组测试,一组使用hiredis客户端,另一组使用redis自带的redis-benchmark。用LRANGE命令获取列表,用LPUSH向队列插入数据。redis是默认配置。

mysql

mysql使用上面的数据库表结构。插入语句为:insert into ThreadList values (1, 'xxxx', 0, now()) 查询列表的语句为:select threadid from ThreadList where forumid=1 order by reply_time limit frompos,len

下面的测试结果中,红色为memlink绿色为redis蓝色为mysql

内存消耗测试

  初始内存 1w 10w 100w 1000w
memlink 4764K 5032K 6628K 18M 139M
redis 1060K 1920K 9044K 78M 771M

访问性能测试

1. 一个客户端,长连接

  1w 10w 100w 1000w
insert memlink c:16296

py:12558

php:12153

c:14125

py:12565

php:12144

c:13868

py: 13096

php: 12521

c:13187

py:12611

php:12124

hiredis 15183

14997

14828

14788

redis 15673 15743 15594 15304
mysql 10891 10297 10022 9718
range first100 memlink c:10874

py:8275

php:9185
c:11429

py:8273

php:9171
c:10994

py:8068

php:9136
c:11663

py:8256

php:10071
hiredis 1328 1329 1324 1332
redis 4237 4587 4310 4347
mysql 1550 1563 1559 1307
range first200 memlink c:8045

py:6015

php:6544
c:8041

py:6017

php:6545
c:7863

py:5941

php:6542
c:7970

py:6024

php:7010
hiredis 708 709 705 709
redis 2631 2777 2666 2631
mysql 956 954 956 941
range first1000 memlink c:1362

py:1446

php:1466
c:1362

py:1448

php:1468
c:1354

py:1440

php:1462
c:1362

py:1444

php:1492
hiredis 147 148 148 147
redis 646 666 652 636
mysql 230 230 230 235
range last100 memlink c:11153

py:8137

php:8996
c:10318

py:7526

php:8263
c:5519

py:4410

php:4691
c:112

py:97

php:97
hiredis 1221 212 19 2
redis 3289 197 19 1.97
mysql 31 3 0.3 0.04
range last200 memlink c:7938

py:5956

php:6461
c:7515

py:5629

php:6078
c:4615

py:3688

php:3899
c:111

py:96

php:97
hiredis 675 184 19 2
redis 2237 188 19 1.97
mysql 31 3 0.3 0.04
range last1000 memlink c:1358

py:1442

php:1458
c:1345

py:1421

php:1440
c:1209

py:1251

php:1272
c:103

py:91

php:91
hiredis 147 92 17 2
redis 615 143 19 1.97
mysql 30 3 0.3 0.03

2. 一个客户端, 全部是短连接。一次请求一个连接。

  1w 10w 100w 1000w
insert memlink c:6560

py:6138

php:6064

c:6466

py:5990

php:5986

c:6675

py:6092

php:6010

c:6719

py:6012

php:6003

hiredis 10891 10297 10233 10135
redis 6134 5855 6072 5995
mysql 3313 3251 3108 3001
range first100 memlink c:5467

py:4535

php:5064
c:5472

py:4450

php:4944
c:5662

py:4495

php:4712
c:5484

py:4475

php:4779
hiredis 1058 1172 1166 1163
redis 3058 3058 3125 3333
mysql 923 1158 1031 885
range first200 memlink c:4533

py:3746

php:4124
c:4563

py:3693

php:4049
c:4709

py:3724

php:3893
c:4567

py:3708

php:3931
hiredis 654 651 669 667
redis 2150 2159 2222 2272
mysql 815 823 783 743
range first1000 memlink c:1206

py:1254

php:1291
c:1200

py:1249

php:1285
c:1215

py:1253

php:1263
c:1202

py:1250

php:1266
hiredis 146 145 145 144
redis 626 627 636 641
mysql 227 230 226 212
range last100 memlink c:5468

py:4451

php:4970
c:5229

py:4233

php:4692
c:3763

py:3055

php:3155
c:110

py:96

php:96
hiredis 994 271 32 3
redis 2531 189 19 1.97
mysql 20 3 0.21 0.02
range last200 memlink c:4558

py:3692

php:4053
c:4355

py:3545

php:3886
c:3323

py:2680

php:2790
c:110

py:95

php:96
hiredis 630 233 32 3
redis 1879 182 19 1.97
mysql 30 3 0.3 0.04
range last1000 memlink c:1198

py:1247

php:1284
c:1191

py:1226

php:1267
c:1096

py:1093

php:1125
c:102

py:91

php:91
hiredis 144 104 27 3
redis 602 141 19 1.96
mysql 30 3 0.3 0.03

3. 10个客户端,并发长连接。

memlink内部开启4个处理线程。仅c客户端测试。

  1w 10w 100w 1000w
insert memlink 23021 22210 22200 22242
hiredis 29401 30929 29109 30278
redis 32571 33692 33665 32945
mysql 13704 12786 12087 11023
range first100 memlink 45451 53463 55645 48283
hiredis 1443 1384 1396 1339
redis 7042 7142 7092 6666
mysql 2011 2059 2015 2387
range first200 memlink 23768 33966 35045 35417
hiredis 667 641 636 655
redis 3816 3816 3846 3571
mysql 1637 1768 1854 1614
range first1000 memlink 4269 4305 4281 4271
hiredis 114 115 114 115
redis 811 812 815 781
mysql 654 641 648 631
range last100 memlink 53719 48948 24086 295
hiredis 1584 229 19 2
redis 4694 197 19 1.82
mysql 91 8 1 -
range last200 memlink 35593 34264 21830 292
hiredis 696 220 19 2
redis 3039 188 19 1.75
mysql 96 9 1 -
range last1000 memlink 4285 4270 4336 277
hiredis 114 142 19 2
redis 772 149 18 1.75
mysql 91 8 1 -

上面的 - 表示时间太长,数百秒也没有结果。

4. 10个客户端,并发短连接

Memlink内部开启4个处理线程。仅c客户端测试。

操作   1w 10w 100w 1000w
insert memlink 9665 9650 10078 10183
hiredis 9381 9489 8993 8976
redis 9285 9290 9287 8835
mysql 5623 5621 5468 5306
range first100 memlink 17400 17504 16614 17292
hiredis 1695 1637 1696 1586
redis 4629 4587 4504 4545
mysql 2210 2286 1955 1611
range first200 memlink 15786 15772 15964 16180
hiredis 711 711 719 692
redis 2941 2949 2941 2857
mysql 1444 1791 1870 1402
range first1000 memlink 3795 3918 3703 3250
hiredis 118 115 116 114
redis 761 739 761 735
mysql 550 692 620 686
range last100 memlink 16989 16502 13118 319
hiredis 2132 240 20 2
redis 4385 191 19 2
mysql 80 8 1 -
range last200 memlink 15915 15596 12203 316
hiredis 743 229 20 2
redis 2941 182 19 2
mysql 94 9 1 -
range last1000 memlink 3893 3641 3332 299
hiredis 120 174 19 2
redis 756 149 18 2
mysql 94 9 1 -

FAQ

  1. 为什么memlink的读速度会比redis快?
  2. 这个是内部存储数据结构决定的。redis内部是一个链表。memlink内部同样是链表,不同的是memlink把100个value组织到了一个链表数据块内,这样循环查找位置的时候,memlink理论上最好情况,循环次数比redis少100倍。
  3. 为什么在多线程并发的情况下memlink比redis读速度快很多?
  4. 因为memlink读数据是完全多线程的,并且没有同步锁,可以利用到多核。而redis在读取数据上是单线程的。
加载中
0
老盖
老盖

memlink内部同样是链表,不同的是memlink把100个value组织到了一个链表数据块内,这样循环查找位置的时候,memlink理论上最好情况,循环次数比redis少100倍。

链表数据块 是个什么东西?难道放在这个数据块里就不用查找了吗?



s
sunnyailon
如果对疑惑可以自己看源码啊
0
幻影浪子
幻影浪子
这些数据我没明白,怎么是MySQL时间最短?
0
幻影浪子
幻影浪子

引用来自“幻影浪子”的答案

这些数据我没明白,怎么是MySQL时间最短?

擦.. 这是相同时间内做的操作数啊.. NND

顶红薯,拿NoSQL跟MySQL比性能有意思么..

0
g
gsnumen

引用来自“戏水”的答案

memlink内部同样是链表,不同的是memlink把100个value组织到了一个链表数据块内,这样循环查找位置的时候,memlink理论上最好情况,循环次数比redis少100倍。

链表数据块 是个什么东西?难道放在这个数据块里就不用查找了吗?



我的理解是链表数组, 类似与nignx中的 ngx_list_t : 链表的元素是数组, 数组的元素是真实数据, 内存访问中,数组寻址速度更快.

g
gsnumen
回复 @sunnyailon : 正解!!
s
sunnyailon
看源码得正解,猜测意义不大。
返回顶部
顶部