现象:

无线词条页访问失败

问题分析:

1、首先,查看日志

日志中非常显眼的是,从Redis读取词条的pv耗时很长,高达20多秒, 看样子是访问Redis速度很慢导致

2、查看Redis的慢日志

> SLOWLOG GET

可以得到如下结果:

25) 1) (integer) 160            #日志的唯一标识符(uid)2) (integer) 1543060013    #命令执行的时间点,UNIX时间戳3) (integer) 22679074      #命令执行的时长,单位是微妙4) 1) "ZREVRANGE"          #命令及其参数信息2) "baike_lemma_pv"3) "0"4) "20000000"5) "withscores"
26) 1) (integer) 1592) (integer) 15429736183) (integer) 228295214) 1) "ZREVRANGE"2) "baike_lemma_pv"3) "0"4) "20000000"5) "withscores"
27) 1) (integer) 1582) (integer) 15428886493) (integer) 223964264) 1) "ZREVRANGE"2) "baike_lemma_pv"3) "0"4) "20000000"5) "withscores"

可以看到有些请求耗时特别长,高达20s,这个时间似乎和日志中的时间比较吻合

3、再看下当前连接上Redis的连接数

> info

得到如下结果:

# Clients
connected_clients:626

目前有626个客户端和Redis服务端建立了连接,并排队等待被Redis的单线程处理, 这个数量说多也不多,说少也不少

4、解决问题

根据第二步中的慢日志, 可以定位到相关的命令详情如下:

./redis-cli -h 10.134.30.00 -p 12002 -a wen@sog.com ZREVRANGE baike_lemma_pv 0 20000000 withscores | awk '{if(NR % 2 == 1) a=$0; else {a=a"\t"$0; print a; a=""}}' >> ./topPvLemmaId.lst

这个命令是要一次性从ZSET结构中读取2000w的数据,这不耗时才怪呢?这一个命令耗时20s,我们知道Redis是单线程对外服务的,那么服务线程处理这个命令的时候,其他的命令都需要等待

对这个命令做了些改造,其实相关业务只需要score排序头部的十几万数据, 所以改造如下:

#!/bin/bashsave_file=$1
for (( start=1; start<=200000; start+=10000 ))
doend=$[$start+10000-1]./redis-cli -h 10.134.30.00 -p 12002 -a wen@sog.com ZREVRANGE baike_lemma_pv $start $end withscores | awk  '{if(NR % 2 == 1) a=$0; else {a=a"\t"$0; if($0 > 70000) print a; a=""}}' >> $save_file
done

当然如果仍然要读取全部的ZSET中的数据, 可以用ZSCAN命令来不停的扫描, 每次扫描读取一部分

其实redis的info信息是非常详细的:

# Server
redis_version:2.8.19
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:bcc7511e1a094fe9
redis_mode:standalone
os:Linux 2.6.32.43-tlinux-1.0.22-default x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.6
process_id:17351
run_id:61f2d7ca5a7507914252a0cc53ef7cb96c1f98fb
tcp_port:10002
uptime_in_seconds:66262857
uptime_in_days:766
hz:10
lru_clock:926904
config_file:/data/redis-server/baike_database_master_10002/redis_10002.conf# Clients
connected_clients:177
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0# Memory
used_memory:3870592296
used_memory_human:3.60G
used_memory_rss:4278693888
used_memory_peak:4569335968
used_memory_peak_human:4.26G
used_memory_lua:35840
mem_fragmentation_ratio:1.11
mem_allocator:jemalloc-3.6.0# Persistence
loading:0
rdb_changes_since_last_save:20833780660
rdb_bgsave_in_progress:0
rdb_last_save_time:1495853683
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:17
rdb_current_bgsave_time_sec:-1
aof_enabled:1
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:35
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_current_size:1445634916
aof_base_size:1165444727
aof_pending_rewrite:0
aof_buffer_length:0
aof_rewrite_buffer_length:0
aof_pending_bio_fsync:0
aof_delayed_fsync:0# Stats
total_connections_received:90906524
total_commands_processed:83533940789
instantaneous_ops_per_sec:1601
total_net_input_bytes:3031104314026
total_net_output_bytes:1957795787473
instantaneous_input_kbps:60.44
instantaneous_output_kbps:480.64
rejected_connections:0
sync_full:2
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:16227030786
keyspace_misses:995680173
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:79994# Replication
role:master
connected_slaves:1
slave0:ip=10.241.00.00,port=1022,state=online,offset=1272093723257,lag=1
master_repl_offset:1272093741351
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1272092692776
repl_backlog_histlen:1048576# CPU
used_cpu_sys:525197.25
used_cpu_user:548578.62
used_cpu_sys_children:2437.03
used_cpu_user_children:33747.64# Keyspace
db0:keys=19935578,expires=0,avg_ttl=0

具体的每个字段的含义可参考:

http://www.huangdc.com/337

Redis慢日志问题解决相关推荐

  1. 使用 monitor 命令查看 redis 请求日志

    monitor日志要实时拿 redis 是一个高性能.使用方便的非关系型数据库,我们在使用 redis 时,基本只需要关注存数据,取数据的功能,即 set,get,非常适合用作缓存服务器,降低后端数据 ...

  2. ELK下logstash通过redis收集日志

    (1)部署redis 1丶安装redis yum install epel-release -y yum install redis -y 2丶修改配置文件 #vim /etc/redis.conf ...

  3. Redis的日志级别

    redis日志级别分为debug,verbose,notice,warning.在redis.conf配置文件中,通过loglevel配置选项来配置redis的日志级别. 例如 loglevel de ...

  4. Redis AOF日志

    文章目录 为什么日志是后写入 AOF三种落盘机制 写后落盘 一秒一写 操作系统控制写回 AOF重写 AOF重写机制 AOF重写是会影响主线程的 为什么日志是后写入 因为日志没有语法检查,先写入日志,则 ...

  5. linux redis 设置日志,linux上redis怎么动态看日志

    异常一: make[2]: cc: Command not found 异常原因:没有安装gcc 解决方案:yum install gcc-c++ 异常二: zmalloc.h:51:31: erro ...

  6. redis 慢日志 slowlog

    1 slowlog是什么 redis的slowlog是redis用于记录记录慢查询执行时间的日志系统.由于slowlog只保存在内存中,因此slowlog的效率很高,完全不用担心会影响到redis的性 ...

  7. Linux 安装Redis全过程日志

    wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-stable make ...

  8. 【可观测之ELK】elk+logback+redis 搭建日志平台

    日志平台背景: 日志的分析和监控在系统开发中占非常重要的地位,系统越复杂,日志的分析和监控就越重要,常见的需求有: 根据关键字查询日志详情 监控系统的运行状况 统计分析,比如接口的调用次数.执行时间. ...

  9. linux redis 日志在哪里,Redis的日志系统

    今天中间件接口响应时间很长,经过大致排查,发现是访问Redis慢,并且Redis的cpu确实已经飙到了98%左右,现在需要定位问题.先打开redis的slowlog. 什么是 SLOWLOG Slow ...

最新文章

  1. 运算方法和运算部件二
  2. ubuntu/debian/centos/rhel使用镜像源一键安装gitlab-ce服务
  3. NSDateFormatter and NSDateComponents
  4. spring ResponseEntity
  5. NLTK的图形化语料文本下载器downloader
  6. 第10章-定位、层级关系
  7. Ecology 建模表单 数据库字段与页面字段对应关系显示
  8. 网络地址16777343是什么地址?
  9. 中国省市区三级联动带下拉美化带数据库
  10. 博弈论学习 | 第七章 Evolutionary Game Theory
  11. OSPF开销值、协议优先级及计时器的修改
  12. svm手写数字识别python_SVM之Mnist手写数字识别
  13. 华为FPGA设计高级技巧xilinx篇阅读笔记一
  14. Verilog自学:关于门级,数据流级,行为级建模
  15. 微信公众号回复消息换行符处理
  16. setResult(RESULT_OK, intent)回调不执行问题
  17. ISA防火墙策略配置
  18. Kibana server is not ready yet
  19. 不用梯子——每日领取5块钱的ChatGPT体验券
  20. 如何下载广东省卫星地图高清版大图

热门文章

  1. java8(2)--- Stream API
  2. JSTL 表达式与 EL 语言
  3. JavaScript-DOM(2)
  4. LeetCode : Word Pattern
  5. sqlserver中的分页sql语句,不同于mysql中的limit,相当于top+top
  6. 跟我一起创建一个简单的javascript ajax对象 ---献给Web开发初学者
  7. Linux中的特殊权限——粘滞位(Stickybit)
  8. 内网穿透工具_utools让你3步搭建一个内网穿透工具
  9. kesioncms ajax分页,改进KesionCMS V9.0x SQL标签分页支持嵌套
  10. python程序运行结果始终为0_Python:始终运行程序