一.介紹
慢查詢只記錄redis執行時間,並不記錄redis服務到客戶端之間的網絡問題。
超過多少毫秒的才被記錄
slowlog-log-slower-than=10000 毫秒(1秒=1000毫秒=1000000微秒)
=0 則記錄所有 <0 則都不記錄
redis使用一個列表來記錄慢查詢條目,設置后最多記錄1000條,第1001條會將第1條擠出去。
[root@linkops ~]# vi /usr/local/redis/redis.conf
slowlog-max-len=1000
日志有4部分組成
- 慢查詢日志的標識id
- 發生時間戳
- 命令耗時
- 執行命令和參數
查詢實例:
1) 1) (integer) 666
2) (integer) 1456786500
3) (integer) 11615
4) 1) "BGREWRITEAOF"
2)
1) (integer) 667
2) (integer) 1456786534
3) (integer) 116150
4) 1) "KEYS *"
二.參數配置
sql動態配置
#超過20000毫秒開始記錄
127.0.0.1:6379> config set slowlog-log-slower-than 20000
#最大允許超過1000毫秒開始記錄
127.0.0.1:6379> config set slowlog-max-len 1000
#保存參數
127.0.0.1:6379> config rewrite
配置文件設置
#修改文件
[root@linkops ~]# vim /usr/local/redis/redis.conf
slowlog-log-slower-than=10000
slowlog-max-len=1000
#重啟redis
[root@linkops ~]# redis-cli shutdown
[root@linkops ~]# nohup redis-server /usr/local/redis/redis.conf &>/dev/null &
[root@linkops ~]# redis-server /usr/local/redis/redis.conf
三.sql操作
#查詢所有條目
slowlog get
#查詢指定條目,最后的參數指定條目數
slowlog get 34
#條目總數
slowlog len
#清理所有條目
slowlog reset
四.優化
1.slowlog-max-len配置建議:線上建議調大慢查詢列表,記錄慢查詢時Redis會對長命令做截斷操作,並不會占用大量內存。增大慢查詢列表可以減緩慢查詢被剔除的可能,例如線上可設置為1000以上。
2.slowlog-log-slower-than配置建議:默認值超過10毫秒判定為慢查詢,需要根據Redis並發量調整該值。由於Redis采用單線程響應命令,對於高流量的場景,如果命令執行時間在1毫秒以上,那么Redis最多可支撐OPS不到1000。因此對於高OPS場景的Redis建議設置為1毫秒。
3.慢查詢只記錄命令執行時間,並不包括命令排隊和網絡傳輸時間。因此客戶端執行命令的時間會大於命令實際執行時間。因為命令執行排隊機制,慢查詢會導致其他命令級聯阻塞,因此當客戶端出現請求超時,需要檢查該時間點是否有對應的慢查詢,從而分析出是否為慢查詢導致的命令級聯阻塞。
4.由於慢查詢日志是一個先進先出的隊列,也就是說如果慢查詢比較多的情況下,可能會丟失部分慢查詢命令,為了防止這種情況發生,可以定期執行slow get命令將慢查詢日志持久化到其他存儲中(例如MySQL),然后可以制作可視化界面進行查詢,
