Redis cpu 100%和连接数多分析
2015-09-09 09:56
1861 查看
1 现象:
1.1 Redis连接数1千多个(redis在美国AWS、客户端在中国AWS),状态一直是ESTABLISHED,没有释放。在中国AWS上没有发现到美国Redis上的连接.
1.2 Redis占用单核CPU 100%
2 分析方式
2.1 在Redis server上采用netstat 命令查看连接。在客户端上采用netstat 命令查看连接. 确定Redis server上的连接是僵尸连接。
2.2 查看Redis 的配置,发现没有配置timeout参数,使用的默认是为0(表示redis server不进行超时处理)。
采用redis-cli登录上redis,采用config get timeout 参数可以查看该参数设置值确实是0。
当跨区网络不稳定,客户端断连的包发出去后,redis server没有接受到,则会出现redis server以为连接正常的情况。因为需要在redis server 需要启动超时设置,如果在一定的时间内,客户端没有消息过来,则redis server主动断开连接。
2.2 采用ltrace -p PID(redis server的进程号),发现进程当前状态在accept后,会一直循环打印“too many open files”。
因此,当外部新连接过来时,由于循环执行,cpu会100%。
查看该redis server 进程的文件数限制。 cat /proc/PID/limits 查看打开的文件数限制,发现为
Max open files 1024 1024 files
在前面的分析中,发现redis 僵尸连接已经为1千多个,说明确实是文件数限制导致的。
3 解决措施
由于是生产环境,需要做到redis不停止恢复。
2.1 关闭僵尸连接
采用redi-cli登录,采用client kill ip:port(redis远程连接的ip和端口)。
需要采用脚本批量删除多个连接
2.2 修改redis timeout参数
采用redis-cli登录,采用config set timeout xx 设置redis的keepalive时间
2.3 修改redis进程的文件数限制
echo -n "Max open files 3000:3000" > /proc/PID/limits
2.4 修改系统参数的最大文件数限制
/etc/security/limits.conf
1.1 Redis连接数1千多个(redis在美国AWS、客户端在中国AWS),状态一直是ESTABLISHED,没有释放。在中国AWS上没有发现到美国Redis上的连接.
1.2 Redis占用单核CPU 100%
2 分析方式
2.1 在Redis server上采用netstat 命令查看连接。在客户端上采用netstat 命令查看连接. 确定Redis server上的连接是僵尸连接。
2.2 查看Redis 的配置,发现没有配置timeout参数,使用的默认是为0(表示redis server不进行超时处理)。
采用redis-cli登录上redis,采用config get timeout 参数可以查看该参数设置值确实是0。
当跨区网络不稳定,客户端断连的包发出去后,redis server没有接受到,则会出现redis server以为连接正常的情况。因为需要在redis server 需要启动超时设置,如果在一定的时间内,客户端没有消息过来,则redis server主动断开连接。
2.2 采用ltrace -p PID(redis server的进程号),发现进程当前状态在accept后,会一直循环打印“too many open files”。
因此,当外部新连接过来时,由于循环执行,cpu会100%。
查看该redis server 进程的文件数限制。 cat /proc/PID/limits 查看打开的文件数限制,发现为
Max open files 1024 1024 files
在前面的分析中,发现redis 僵尸连接已经为1千多个,说明确实是文件数限制导致的。
3 解决措施
由于是生产环境,需要做到redis不停止恢复。
2.1 关闭僵尸连接
采用redi-cli登录,采用client kill ip:port(redis远程连接的ip和端口)。
需要采用脚本批量删除多个连接
2.2 修改redis timeout参数
采用redis-cli登录,采用config set timeout xx 设置redis的keepalive时间
2.3 修改redis进程的文件数限制
echo -n "Max open files 3000:3000" > /proc/PID/limits
2.4 修改系统参数的最大文件数限制
/etc/security/limits.conf
相关文章推荐
- redis安装问题小结
- Java 6 JVM参数选项大全(中文版)
- Redis偶发连接失败案例实战记录
- autoit 命令行参数说明
- 给IE加个参数 永远不怕IE主页被修改
- Redis中实现查找某个值的范围
- Redis和Memcached的区别详解
- 分割超大Redis数据库例子
- Redis总结笔记(一):安装和常用命令
- Redis sort 排序命令详解
- redis中修改配置文件中的端口号 密码方法
- 写批处理必备的一些命令参数使用技巧
- 在Ruby on Rails上使用Redis Store的方法
- 我的服务器SQL2000的sqlserver占用了90%的cpu,怎么查是那个库?
- MySQL服务器进程CPU占用100%的解决方法
- ASP 调用带参数输出的COM接口
- Redis和Memcache的区别总结
- PowerShell实现参数互斥示例
- C#从命令行读取参数的方法
- C#获取CPU编号的方法