zoukankan      html  css  js  c++  java
  • 【redis故障处理】redis omm问题

    【1】常规问题

    【1.1】omm问题 

    OOM command not allowed when used memory > 'maxmemory'.

    分析

    (1)查看服务器内存是否满了

    (2)查看 redis内存是否爆满/溢出

    (3)大key排查 / 客户端输入、输出区缓冲排查

    实践查看:

    (1)free

      

    (2)查看 redis内存是否爆满/溢出

    登录后:info memory

    查找 used_memory 和 maxmemory
    human 后缀表示已转换成适合人类阅读的文本
    used_memory:270098024
    used_memory_human:257.59M
    ...
    maxmemory:200000000
    maxmemory_human:190.73M
    我们看到此时内存最大使用限制为 190M,而已使用了 257M

    (3.1)大KEY排查
    redis-cli --bigkeys -h xxx.xxx.xxx.xxx -p 6379

    转换成 human可读:237535676 /1024 /1024 = 226MB

    由此可见,是大key 引起的

    (3.2)客户端缓冲区排查

    相关参考:https://www.cnblogs.com/gered/p/13280709.html

    登录后:info clients

    127.0.0.1:6379> info clients
    # Clients
    connected_clients:1891
    client_recent_max_input_buffer:225698 #最大输入缓冲区队列
    client_recent_max_output_buffer:0
    blocked_clients:0

    这里 最大输入缓冲区队列已经到了22W多,很明显不正常

      我们通过 client list 命令找到对应的详细信息,这里我们从上面的 connected_clients 可以发现连接有近1900个。

      所以我们要筛选排除正常的,比如 omem 不为0的(为什么用这个过滤条件?因为大部分客户端处理速度都很快基本 omem为0 )

    于是我们执行  redis-cli -a 123456 client list |grep -v "omem=0"    把=0 的正常的链接给过滤掉,显示不正常的链接

    id=7 addr=10.20.50.34:44139 fd=10 name= age=11482883 idle=1 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=224869 omem=2129300608 events=r cmd=monitor
    id=267861 addr=127.0.0.1:44140 fd=8 name= age=120 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client

    最终我们可以看到,第一行操作,正在进行 monitor 所以占用了大量输入缓冲队列。

    client kill 10.20.50.34:44139 

  • 相关阅读:
    mysql环境搭建
    php基础:查看上次插入的主键和影响的行数及关闭mysql连接
    php基础:文件包含与引用 require和include的区别
    php基础:echo和print_r和var_dump的区别
    php基础:变量检测
    php基础:动态变量名
    php基础:代码的短路特性和运算符优先级
    php基础:三元运算符及比较3个数的大小
    php基础:字符串基本函数
    php基础:数组的定义和遍历
  • 原文地址:https://www.cnblogs.com/gered/p/13291666.html
Copyright © 2011-2022 走看看