REDIS的几个测试结果
场景一:对单一键大并发量增加(INC)操作,模拟对热点产品的库存修改
测试点:
原子性,保证最后的键值等于所有键值增加操作的总和性能,
保证在大并发量下写操作的性能没有大的降低
线程数 | 100次INC操作的平均时间 | 服务端数据 |
10 | 140 | instantaneous_ops_per_sec(每秒处理指令数):342 instantaneous_input_kbps(每秒读字节数):10.70 instantaneous_output_kbps(每秒写字节数):1.90 used_cpu_sys(系统CPU使用量):0.05 used_cpu_user(用户CPU使用量):0.03 |
50 | 560 | instantaneous_ops_per_sec(每秒处理指令数):2780 instantaneous_input_kbps(每秒读字节数):86.89 instantaneous_output_kbps(每秒写字节数):18.20 used_cpu_sys(系统CPU使用量):0.48 used_cpu_user(用户CPU使用量):0.37 |
100 | 1050 | instantaneous_ops_per_sec(每秒处理指令数):5766 instantaneous_input_kbps(每秒读字节数):180.22 instantaneous_output_kbps(每秒写字节数):38.60 used_cpu_sys(系统CPU使用量):1.31 used_cpu_user(用户CPU使用量):0.52 |
120 | 1400 | instantaneous_ops_per_sec(每秒处理指令数):6857 instantaneous_input_kbps(每秒读字节数):214.29 instantaneous_output_kbps(每秒写字节数):46.87 used_cpu_sys(系统CPU使用量):2.51 used_cpu_user(用户CPU使用量):0.81 |
150 | 1570 | instantaneous_ops_per_sec(每秒处理指令数):8350 instantaneous_input_kbps(每秒读字节数):260.95 instantaneous_output_kbps(每秒写字节数):58.74 used_cpu_sys(系统CPU使用量):4.04 used_cpu_user(用户CPU使用量):1.13 |
结论:
客户端100次操作的时间随着线程数增加而增加,但是服务端的处理量并没有达到极限,CPU的使用量也不高,可见REDIS处理高并发请求没有问题.
Jvisualvm 分析结果:客户端处理时间长主要是由于线程切换的代价和网络开销
场景二:数据持久化测试
数据占用内存大小:
400000条数据,键长度20,数据长度1. 总共占用 28.90M
2000000条数据,键长度20,数据长度1. 总共占用138.55M
持久化模式 | 数据量 | 客户端时间 | 服务端数据 |
RDB模式,数据快照定期写入磁盘
规则:每900秒如果数据改变超过1次则写入磁盘
每300秒如果数据改变超过10次则写入磁盘
每60秒如果数据改变超过10000次则写入磁盘 | 400000次写 | 148397 ms | instantaneous_ops_per_sec(每秒处理指令数):2538 instantaneous_input_kbps(每秒读字节数):116.52 instantaneous_output_kbps(每秒写字节数):12.40 latest_fork_usec:614 |
2000000次写 | 750721ms | instantaneous_ops_per_sec(每秒处理指令数):2705 instantaneous_input_kbps(每秒读字节数):126.80 instantaneous_output_kbps(每秒写字节数):13.21 latest_fork_usec:889 | |
数据不持久化 | 400000次写 | 145062 ms | instantaneous_ops_per_sec(每秒处理指令数):2840 instantaneous_input_kbps(每秒读字节数):130.38 instantaneous_output_kbps(每秒写字节数):13.87 |
2000000次写 | 746384ms | instantaneous_ops_per_sec(每秒处理指令数):2723 instantaneous_input_kbps(每秒读字节数):127.68 instantaneous_output_kbps(每秒写字节数):13.30 | |
数据复制到一个节点 | 400000次写 | 210540ms | instantaneous_ops_per_sec(每秒处理指令数):2222 instantaneous_input_kbps(每秒读字节数):102.00 instantaneous_output_kbps(每秒写字节数):112.83 |
2000000次写 | 9249390ms | instantaneous_ops_per_sec(每秒处理指令数):2126 instantaneous_input_kbps(每秒读字节数):99.69 instantaneous_output_kbps(每秒写字节数):110.05 | |
AOF 模式 Fysnc per second
操作以日志方式写入磁盘,每秒将日志从磁盘缓冲区刷入硬盘 | 400000次写 | 158809ms | instantaneous_ops_per_sec(每秒处理指令数):2169 instantaneous_input_kbps(每秒读字节数):99.59 instantaneous_output_kbps(每秒写字节数):10.59 |
2000000次写 | 765037ms | instantaneous_ops_per_sec(每秒处理指令数):2656 instantaneous_input_kbps(每秒读字节数):124.54 instantaneous_output_kbps(每秒写字节数):12.97 | |
AOF 模式: Fsync always 操作以日志方式写入磁盘,每次操作将日志从磁盘缓冲刷入硬盘 | 400000次写 | 583053ms | instantaneous_ops_per_sec(每秒处理指令数):642 instantaneous_input_kbps(每秒读字节数):29.49 instantaneous_output_kbps(每秒写字节数):3.14 |
2000000次写 | 3154548ms | instantaneous_ops_per_sec(每秒处理指令数):613 instantaneous_input_kbps(每秒读字节数):28.77 instantaneous_output_kbps(每秒写字节数):2.99 | |
AOF 模式: Fsync never 操作以日志方式写入磁盘,由操作系统决定何时将日志从磁盘缓冲刷入硬盘 | 400000次写 | 152612ms | instantaneous_ops_per_sec(每秒处理指令数):2725 instantaneous_input_kbps(每秒读字节数):125.07 instantaneous_output_kbps(每秒写字节数):13.30 |
2000000次写 | 769203ms | instantaneous_ops_per_sec(每秒处理指令数):2710 instantaneous_input_kbps(每秒读字节数):127.03 instantaneous_output_kbps(每秒写字节数):13.23 | |
RDB模式,数据快照定期写入磁盘
规则:每900秒如果数据改变超过1次则写入磁盘
每300秒如果数据改变超过10次则写入磁盘
每60秒如果数据改变超过10000次则写入磁盘 使用PIPELINE 批量操作,每10000条COMMIT 一次 | 400000次写 | 1429ms | instantaneous_ops_per_sec(每秒处理指令数):131611 instantaneous_input_kbps(每秒读字节数):6040.77 instantaneous_output_kbps(每秒写字节数):641.57 |
2000000次写 | 6740ms | instantaneous_ops_per_sec(每秒处理指令数):161782 instantaneous_input_kbps(每秒读字节数):7583.55 instantaneous_output_kbps(每秒写字节数):791.00 |
结论:
RDB模式和不持久化性能差别并非很大,主要是RDB通过FORK的方式来复制数据,对主进程的读写没有影响.但是单次FORK的开销较大,而且FORK时会消耗两倍的内存
AOF模式每秒FSYNC和操作系统FSYNC的差别并不大,但是总是FSYNC的性能急剧下降,每秒FSYNC是一个比较合适的选择,最多丢失1秒钟的数据,性能也不错
数据量大对写操作的性能并没有太多影响
实测中日志主从复制对于性能有不小的影响,但由于是单机模拟集群测试,硬件和网络都是共享的,数据可能不准,建议在实际环境中再测试
4百万数据读性能仍然在5到7毫秒/条
数据恢复: 4百万数据,RDB模式初始化需要大约4.12秒时间 (可从redis.log中查到), AOF模式初始化需要大约6.216秒时间
PIPELINE批量处理模式对于写性能的提升是巨大的,但是使用场景比较有限,一般可以用于初始REDIS数据