首页 > 数据库 >一次线上redis慢的排查过程,发现redis根本不慢

一次线上redis慢的排查过程,发现redis根本不慢

时间:2024-03-02 21:14:04浏览次数:37  
标签:redis 排查 session 线上 llm time 日志 id

缓存应用场景:

对话系统中,用redis来存储用户对话的上下文,用户每次说话将用户对话的上下文带给大模型进行推理,然后返回给用户回答

该对话系统用在电话场景,对响应速度要求较高。

代码中自己对redis的耗时进行了记录 超过50毫秒报警

start_time = time.time()
dialogueSession = dialogueStorage.get_dialogue_session(session_id, workspace_id)
end_time = time.time()
if ((end_time - start_time) * 1000) > 50:
这里发送报警信息 并且打印session_id

首先查看redis 没有任何慢日志,怀疑网络有问题

发现网络也没什么问题,决定在服务所在服务器上进行抓包,系统出现报警后停止抓包,日志记录如下:

开始 2024年2月28日 14点26分05秒818毫秒

结束 2024年2月28日 14点26分05秒924毫秒

日志可以看出来 耗时是 > 50ms的 定位到具体的包 但是抓包记录 redis是在1ms响应的

此时基本排除redis出现的问题 此时猜测 ,问题可能出现在操作系统 或者服务本身

查看读取redis代码 发现读取redis后有进行json解析操作

    def get_dialogue_llm(self, session_id, workspace_id):
        if session_id is None or workspace_id is None:
            return None
        session = None
        try:
            redisKey = self.get_redis_llm(session_id, workspace_id)
            llm_result = self.conn_redis.get(redisKey)
            if llm_result is None:
                return None
            session = json.loads(llm_result)
            log.info("[get_dialogue_llm] session_id:{}, workspace_id:{}".format(session_id, workspace_id))
        except Exception as e:
            log.error("[get_dialogue_llm] get dialogue llm result Error: %s" % str(e))
        return session

于是对实际读取redis 和 json解析 都进行记时 此时奇怪的问题发生了 整个方法依然超过50ms 但是 读取redis和解析json 都不耗时 1ms以内。剩下的就是打印日志了,发现这个项目是用的python自带的log包打印日志 默认配置。这个默认的配置是同步写的,并且每次都落盘才会返回。问题基本可以确定是在这里。接下来加上日志进行验证,验证结果如下。

可以看到总共耗时36毫秒 写日志用了35毫秒 ,接下来解决问题就是把写日志改成异步带缓存的写,避免阻塞和占用IO.

标签:redis,排查,session,线上,llm,time,日志,id
From: https://www.cnblogs.com/wangshixiang/p/18049236

相关文章

  • Redis快速入门
    1、什么是Redis远程字典服务器:一个开源的基于内存的数据库,常用作键值存储,缓存和消息队列等Redis通常将全部数据存储在内存中,也可以不时的将数据写入硬盘实现持久化,但仅用于重新启动后将数据加载回内存(内存的速度比硬盘快一个数量级)基于key-value键值对的非关系型数据库......
  • Redis文档
    SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis。技术支持提供了对不同Redis客户端的整合(Lettuce和Jedis)提供了RedisTemplate统一API来操作Redis支持Redis的发布订阅模型支持Redis哨兵和Redis集群支持基于......
  • Redis基本知识
    一、什么是RedisRedis是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,用于存储键值对、缓存、消息队列、分布式锁等。二、Redis和mencached的区别相同:都是基于内存的数据库,读写都很快不同:1.Redis支持的数据类型更丰富(string、list、hash、set、zs......
  • Redis Docekr WARNING Memory overcommit must be enabled! Without it, a background
    Docker容器ssr-redis|1:C01Mar202422:00:46.869#oO0OoO0OoO0OoRedisisstartingoO0OoO0OoO0Oossr-redis|1:C01Mar202422:00:46.869#Redisversion=7.0.10,bits=64,commit=00000000,modified=0,pid=1,juststartedssr-redis|1:C01Mar......
  • redis自学(9)List
    ListRedis的List类型可以从首、尾操作列表中的元素:  哪一个数据结构能满足上述特征? LinkedList:普通链表,可以从双端访问,内存占用较高,内存碎片较多 ZipList:压缩列表,可以从双端访问,内存占用低,存储上限低 QuickList:LinkedList+ZipList,可以从双端访问,内存占用较低,......
  • 在K8S中,Pod请求另一个pod偶尔出现超时或延迟,如何排查?
    在Kubernetes(K8S)中,当Pod请求另一个Pod时偶尔出现超时或延迟,可能是由于多种原因造成的。以下是一些建议的排查步骤:检查网络配置和插件:确认你的Kubernetes集群使用了合适的网络插件(如Calico、Flannel等),并且这些插件已经正确配置和部署。检查网络插件的状态和日志,确保它们正常运......
  • ubuntu22.04安装配置redis
    本操作在虚拟机上安装Redis1)更新系统sudoaptupdatesudoaptupgrade2)安装Redissudoaptinstallredis-server3)测试Redis是否工作redis-cli--versionsystemctlstatusredis#注意:如果你的服务器上仅用了ipv6,将会启动失败。4)登入redis-cliredis-cli配置Redis......
  • 在K8S中,节点状态notReady如何排查?
    在Kubernetes(K8s)集群中,当一个节点(Node)的状态变为NotReady时,意味着该节点可能无法运行Pod或不能正确响应Kubernetes控制平面。排查NotReady节点通常涉及以下步骤:1.获取基本信息使用kubectl命令行工具获取节点状态:kubectlgetnodes检查具体出现问题的节点详情:k......
  • 频繁GC导致CPU飙高,排查笔记实战
     一、问题场景测试环境突然报警CPU飙高,查看日志发现不停的在做GC操作,8个GC线程把CPU打爆。二、问题排查首先就是保留现场,打印堆栈信息。1.打印线程运行信息jstack85090>code-api.log2.打印堆信息jmap-dump:format=b,file=heapdump1.hprof850903.......
  • 【转发】JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!
    线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top三连,然后依次jstack、jmap伺候,具体问题具体分析即可......