zoukankan      html  css  js  c++  java
  • redis-慢查询日志

    慢查询日志是 Redis 提供的一个用于观察系统性能的功能
     
    相关数据结构
    每条慢查询日志都以一个 slowlog.h/slowlogEntry 结构定义:
     
    typedef struct slowlogEntry {
         // 命令参数
         robj **argv;
        
         // 命令参数数量
         int argc;
        
         // 唯一标识符
         long long id; /* Unique entry identifier. */
        
         // 执行命令消耗的时间,以纳秒( 1 / 1,000,000,000 秒)为单位
         long long duration; /* Time spent by the query, in nanoseconds. */
        
         // 命令执行时的时间
         time_t time; /* Unix time at which the query was executed. */
    } slowlogEntry;
     
    记录服务器状态的 redis.h/redisServer 结构里保存了几个和慢查询有关的属性:
    struct redisServer {
         // ... other fields
     
         // 保存慢查询日志的链表
         list *slowlog; /* SLOWLOG list of commands */
     
         // 慢查询日志的当前 id 值
         long long slowlog_entry_id; /* SLOWLOG current entry ID */
     
         // 慢查询时间限制
         long long slowlog_log_slower_than; /* SLOWLOG time limit (to get logged) */
     
         // 慢查询日志的最大条目数量
         unsigned long slowlog_max_len; /* SLOWLOG max number of items logged */
     
         // ... other fields
    };
     
    • slowlog
      • 属性是一个链表,链表里的每个节点保存了一个慢查询日志结构,
      • 所有日志按添加时间从新到旧排序,新的日志在链表的左端,旧的日志在链表的右端。
    • slowlog_entry_id 在创建每条新的慢查询日志时增一,
      • 用于产生慢查询日志的ID(这个ID在执行 SLOWLOG RESET 之后会被重置)。
    • slowlog_log_slower_than 是用户指定的命令执行时间上限,
      • 执行时间大于等于这个值的命令会被慢查询日志记录。
    • slowlog_max_len 慢查询日志的最大数量,
      • 当日志数量等于这个值时,添加一条新日志会造成最旧的一条日志被删除。
     

     
     
    慢查询日志的记录
    伪代码
    def execute_redis_command_with_slowlog():
         # 命令执行前的时间
         start = ustime()
        
         # 执行命令
         execute_command(argv, argc)
     
         # 计算命令执行所耗费的时间
         duration = ustime() - start
     
         if slowlog_is_enabled:
              slowlogPushEntryIfNeed(argv, argc, duration)
     
    def slowlogPushEntryIfNeed(argv, argc, duration)
         # 如果执行命令耗费的时间超过服务器设置命令执行时间上限
         # 那么创建一条新的 slowlog
         if duration > server.slowlog_log_slower_than:
     
              # 创建新 slowlog
              log = new slowlogEntry()
     
              # 设置各个域
              log.argv = argv
              log.argc = argc
              log.duration = duration
              log.id = server.slowlog_entry_id
              log.time = now()
     
              # 将新 slowlog 追加到日志链表末尾
              server.slowlog.append(log)
         
              # 更新服务器 slowlog
              server.slowlog_entry_id += 1
     
    慢查询日志的操作
    • 针对慢查询日志有三种操作
      • 查看
        • 查看日志:在日志链表中遍历指定数量的日志节点,复杂度为O(N)。
      • 清空
        • 清空日志:释放日志链表中的所有日志节点,复杂度为O(N)
      • 获取日志数量:
        • 获取日志数量:获取日志的数量等同于获取server.slowlog链表的数量,复杂度为O(1)
     
    小结
    •  Redis 用一个链表以 FIFO 的顺序保存着所有慢查询日志。
    •  每条慢查询日志以一个慢查询节点表示,节点中记录着执行超时的命令、命令的参数、命令执行时的时间,以及执行命令所消耗的时间等信息。
     
  • 相关阅读:
    如何解决使用webpack打包之后,font-awsome路径不对的问题,终极解决方法
    vue-route+webpack部署单页路由项目,访问刷新出现404问题
    vue2.0打包webpack出错
    Coding Pages jekyll 404无法找到静态文件(css,js )
    git常用命令及分支简介
    【git常见问题】fatal: Not a valid object name: 'master'.
    jekyll下载了模版运行出现问题cannot load such file -- jekyll-paginate (LoadError)
    Jekyll解决Deprecation: but you haven't included the `jekyll-paginate` gem
    06四则运算3
    09NABCD需求分析
  • 原文地址:https://www.cnblogs.com/Aiapple/p/7255625.html
Copyright © 2011-2022 走看看