在实际使用Redis中,有时会碰到客户端timeout异常,或者没有可用链接异常等等异常,总结大概有以下缘由:redis
内部阻塞缘由:网络
1)大对象存取。并发
2)Fork阻塞。tcp
3)Aof刷盘阻塞(距离上次刷盘大于2s时主线程会阻塞,直到当前刷盘完成)。分布式
4)HugePage写操做阻塞(对于开启Transparent HugePages的操做系统,每次写命令引发的复制内存页单位由4K变为2MB,放大了512倍,会拖慢写操做的执行时间,致使大量写操做慢查询)。高并发
外部阻塞缘由:工具
1)与其余cpu密集型应用一块儿部署,出现cpu竞争。性能
2)启用持久化时将redis进程与cpu绑定,子进程与父进程公用一个cpu,子进程进行持久化时会大幅度占用cpu资源(一般90%),形成父进程cpu资源不足。测试
3)内存交换(太小的最大内存设置,会发生内存交换,将内存数据写到磁盘上,性能杀手)。优化
4)客户端链接过多。当Redis用于大量分布式节点访问且生命周期比较短的场景时,如比较典型的在Map/Reduce中使用Redis。由于客户端服务存在频繁启动和销毁的状况且默认Redis不会主动关闭长时间闲置链接或检查关闭无效的TCP链接,所以会致使Redis链接数快速消耗且没法释放的问题。这种场景下建议设置tcp-keepalive和timeout参数让Redis主动检查和关闭无效链接(客户端使用单例或者链接池方式)。
5)半链接队列太小。系统对于特定端口的TCP链接使用backlog队列保存。Redis默认的长度为511,经过tcp-backlog参数设置。若是Redis用于高并发场景为了防止缓慢链接占用,可适当增大这个设置,但必须大于操做系统容许值才能生效。当Redis启动时若是tcp-backlog设置大于系统容许值将以系统值为准。使用echo511>/proc/sys/net/core/somaxconn命令进行修改。能够经过netstat-s命令获取因backlog队列溢出形成的链接拒绝统计。
6)网络延迟。Redis提供了测量机器之间网络延迟的工具,在redis-cli-h{host}-p{port}命令后面加入以下参:
数进行延迟测试:
--latency:持续进行延迟测试,分别统计:最小值、最大值、平均值、采样次数。
--latency-history:统计结果同--latency,但默认每15秒完成一行统计,可经过-i参数控制采样时间。
--latency-dist:使用统计图的形式展现延迟统计,每1秒采样一次。
排查并明确缘由后能够针对性的对Redis进行优化,增长服务吞吐量。
下一篇会介绍Redis内存分配相关。