`
shaojiashuai123456
  • 浏览: 262745 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

redis 性能问题查找

 
阅读更多

        使用redis出现性能问题,可以使用redis的slowlog命令 来查看哪些命令阻塞了redis。

 

        使用redis作为数据库时,系统出现少量超时,通过日志信息发现,超时发生在bgsave时。bgsave命令会fork一个子进程,子进程会将redis数据库信息dump到rdb文件中。因此不能确定使用bgsave命令时,是fork一个子进程引起超时,还是dump文件时与主进程的sync同步同时写磁盘引起的超时。

         这时就可以使用redis自带的slowlog命令了,但是需要在redis 配置文件中加入slowlog使用的参数。

################################## SLOW LOG ###################################

# The Redis Slow Log is a system to log queries that exceeded a specified
# execution time. The execution time does not include the I/O operations
# like talking with the client, sending the reply and so forth,
# but just the time needed to actually execute the command (this is the only
# stage of command execution where the thread is blocked and can not serve
# other requests in the meantime).
# 
# You can configure the slow log with two parameters: one tells Redis
# what is the execution time, in microseconds, to exceed in order for the
# command to get logged, and the other parameter is the length of the
# slow log. When a new command is logged the oldest one is removed from the
# queue of logged commands.

# The following time is expressed in microseconds, so 1000000 is equivalent
# to one second. Note that a negative number disables the slow log, while
# a value of zero forces the logging of every command.
#如果一个命令执行操作10ms,需要记录下这个命令和执行时间
slowlog-log-slower-than 10000

# There is no limit to this length. Just be aware that it will consume memory.
# You can reclaim memory used by the slow log with SLOWLOG RESET.
#保留最近的1024个超时的命令
slowlog-max-len 1024

             下面开始使用slowlog查看超时的命令有哪些,先使用redis-cli连接服务器,在使用slowlog命令查看超时的命令有哪些。

  

redis 127.0.0.1:7771> SLOWLOG GET 3
1) 1) (integer) 174            //编号
   2) (integer) 1413914462     //发生日期,UnixTime类型,需要使用工具转换成日期
   3) (integer) 724446         //命令次持续时间,单位是微妙
   4) 1) "bgSave"              //执行的命令和参数
2) 1) (integer) 173
   2) (integer) 1413828062
   3) (integer) 740908
   4) 1) "bgSave"
3) 1) (integer) 172
   2) (integer) 1413741662
   3) (integer) 737333
   4) 1) "bgSave"

            问题发现了,bgsave命令执行时间用了700多ms,原来是fork时使用了太长时间,从而阻塞了主进程。

 

 

-------------------------------------------------showlog命令实现细节------------------------------------------------------

 

           执行时间的记录。所有redis命令都会调用call函数来执行,而call函数就在执行前后记录下时间,并放在slowlog时间队列中,队列的最大长度就是配置文件定义的长度。

 

/* Call() is the core of Redis execution of a command */
void call(redisClient *c, int flags) {
    long long dirty, start, duration;
    int client_old_flags = c->flags;

   。。。
    /* Call the command. */
    c->flags &= ~(REDIS_FORCE_AOF|REDIS_FORCE_REPL);
    redisOpArrayInit(&server.also_propagate);
    dirty = server.dirty;
    start = ustime();   //记录命令执行开始时间
    c->cmd->proc(c);    //执行命令
    duration = ustime()-start;   //记录命令执行时间
    dirty = server.dirty-dirty;

    /* When EVAL is called loading the AOF we don't want commands called
     * from Lua to go into the slowlog or to populate statistics. */
    if (server.loading && c->flags & REDIS_LUA_CLIENT)
        flags &= ~(REDIS_CALL_SLOWLOG | REDIS_CALL_STATS);

    /* If the caller is Lua, we want to force the EVAL caller to propagate
     * the script if the command flag or client flag are forcing the
     * propagation. */
    if (c->flags & REDIS_LUA_CLIENT && server.lua_caller) {
        if (c->flags & REDIS_FORCE_REPL)
            server.lua_caller->flags |= REDIS_FORCE_REPL;
        if (c->flags & REDIS_FORCE_AOF)
            server.lua_caller->flags |= REDIS_FORCE_AOF;
    }

    /* Log the command into the Slow log if needed, and populate the
     * per-command statistics that we show in INFO commandstats. */
    if (flags & REDIS_CALL_SLOWLOG && c->cmd->proc != execCommand)
        slowlogPushEntryIfNeeded(c->argv,c->argc,duration);   //保存命令执行时间
     。。。
}

 

          执行时间的查看。slowlogCommand 函数对应slowlog命令。

  

/* The SLOWLOG command. Implements all the subcommands needed to handle the
 * Redis slow log. */
void slowlogCommand(redisClient *c) {
    if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"reset")) {
        slowlogReset();
        addReply(c,shared.ok);
    } else if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"len")) {
        addReplyLongLong(c,listLength(server.slowlog));
    } else if ((c->argc == 2 || c->argc == 3) &&
               !strcasecmp(c->argv[1]->ptr,"get"))
    {
        long count = 10, sent = 0;
        listIter li;
        void *totentries;
        listNode *ln;
        slowlogEntry *se;

        if (c->argc == 3 &&
            getLongFromObjectOrReply(c,c->argv[2],&count,NULL) != REDIS_OK)
            return;

        listRewind(server.slowlog,&li);
        totentries = addDeferredMultiBulkLength(c);
        //打印count数量的超时命令
        while(count-- && (ln = listNext(&li))) {
            int j;

            se = ln->value;
            addReplyMultiBulkLen(c,4);
            addReplyLongLong(c,se->id);
            addReplyLongLong(c,se->time);
            addReplyLongLong(c,se->duration);
            addReplyMultiBulkLen(c,se->argc);
            for (j = 0; j < se->argc; j++)
                addReplyBulk(c,se->argv[j]);
            sent++;
        }
        setDeferredMultiBulkLength(c,totentries,sent);
    } else {
        addReplyError(c,
            "Unknown SLOWLOG subcommand or wrong # of args. Try GET, RESET, LEN.");
    }
}

 

 

分享到:
评论

相关推荐

    Redis性能问题排查解决手册.rar

    本手册将详细探讨Redis性能问题的排查与解决方法。 一、Redis性能瓶颈分析 1. 内存管理:Redis的数据全部存储在内存中,因此内存使用效率是关键。当内存不足时,Redis可能会启用LRU(最近最少使用)或LFU(最不...

    redis 性能测试(读写)

    Redis 是一个高性能的键值数据存储系统,常用于缓存、数据库和消息中间件等场景。Jedis 是 Java 开发者常用的 Redis 客户端库,它提供了丰富的 Redis 操作接口,使得在 Java 应用中与 Redis 交互变得简单。 在进行 ...

    StackExchange.Redis .NET4.0

    10. **异常处理**:StackExchange.Redis会抛出适当的异常来表示操作失败,例如`RedisConnectionException`表示网络问题,`RedisServerException`表示服务器返回的错误。 综上所述,StackExchange.Redis是.NET开发...

    memcached-redis性能测试.docx

    Memcached 和 Redis 性能测试 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态 Web 应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。...

    redis-windows-redis7.0.5.zip

    作为键值数据库,Redis通过键(key)来唯一标识每个数据项,并允许快速查找和操作对应的值(value)。其高性能主要来源于以下几点: 1. **内存存储**:Redis默认将所有数据存储在内存中,内存的访问速度远超磁盘,...

    redis校验工具redis-full-check

    1. **键空间一致性检查**:工具会比较不同 Redis 实例间的键空间,查找并报告任何不一致的键或值,确保数据的一致性。 2. **键过期检查**:检查已过期但仍在内存中的键,这可能是由于 Redis 的过期策略未正确执行...

    redis有序集合性能 列表、集合、有序集合1

    跳跃列表用于快速查找元素,字典则用于根据成员查找分数。 1.3.3 使用场景 - 排行榜:例如用户得分排行榜,可以根据分数进行排序。 - 时间戳索引:存储带有时间戳的事件,按时间顺序查询。 - 范围查询:需要根据...

    redis 可视化工具

    Redis 是一款高性能的键值数据库,广泛应用于缓存、消息队列、实时分析等领域。为了更方便地管理和操作 Redis 数据库,出现了许多可视化工具。这些工具提供了图形化的界面,使得用户无需通过命令行就能直观地查看和...

    redis视图化工具

    4. 实时监控:显示Redis服务器的性能指标,如内存使用、CPU占用、网络流量等,及时发现并解决问题。 5. 操作日志:记录每次对数据库的操作,便于追踪和回溯。 6. 事务管理:支持Redis事务的执行和查看,确保操作的...

    redis最新windows版本redis-6.2.6.7z

    Redis是一款高性能的键值对数据库,它在内存中存储数据,提供快速的读写操作,广泛应用于缓存、消息中间件、实时统计等多种场景。在Windows操作系统上部署Redis,可以利用其高效的数据处理能力,为应用程序提供快速...

    Redis学习指南 Redis学习手册

    三、Redis性能优化 1. 内存管理:理解Redis的数据结构和内存分配策略有助于优化内存使用,例如合理设置最大内存限制,避免内存碎片。 2. 配置调整:根据实际场景调整Redis配置,如适当增加客户端连接数,优化网络...

    redis-desktop-manager

    3. **键值查看**:以清晰的树形结构展示Redis中的键值对,便于浏览和查找数据。 4. **数据编辑**:支持添加、修改和删除键值,还可以进行批量操作。 5. **数据类型支持**:全面支持Redis的数据类型,如字符串...

    redismanger连接redis工具

    虽然Redis Manager以图形界面为主,但它通常也包含一个命令行界面(CLI),让用户能够直接输入Redis命令,执行更复杂的操作,如执行脚本或监控性能指标。 6. **备份与恢复**: 支持导出Redis数据到本地文件,以便...

    redis6.2.5安装包Windows版

    Redis是一款高性能的键值对数据库,常用于缓存、消息队列等场景。在Windows操作系统上安装Redis 6.2.5,可以帮助开发者在本地环境中快速进行开发和测试。以下是对Redis 6.2.5在Windows上的安装及使用进行的详细说明...

    redis安装包和redis图形化工具

    4. 探索和操作Redis的数据,如查找特定键、查看键的类型、更新键值、删除键等。 5. 使用客户端的监控功能,查看Redis的性能指标,如内存占用、CPU使用率等。 总结来说,这个资源提供了Redis数据库的最新安装包,...

    redis windows各版本下载

    Redis是一款开源、高性能的键值对存储数据库,广泛应用于缓存、消息中间件、数据库等多个场景。在Windows操作系统上部署Redis,可以方便开发者在非Linux环境下进行开发和测试。本篇将详细介绍Redis在Windows各版本的...

    linux下的redis安装包含配置文件

    在Linux系统中,Redis是一个广泛使用的高性能键值存储系统,常用于数据库、缓存和消息代理等场景。本文将详细讲解如何在Linux环境下安装Redis,以及如何配置主服务器和从服务器。 首先,让我们从安装Redis开始。在...

    redis3.0.1加RedisDesktopManager

    8. **性能优化**:Redis 3.0.1 在性能方面做了很多工作,例如更快的命令处理速度、更低的延迟以及更高效的网络IO。这使得 Redis 能够处理更大规模的数据和更高的并发请求。 9. **命令和模块支持**:3.0.1 版本可能...

    idea连接redis可视化工具插件

    Redis是一款高性能的键值对数据库,常用于缓存和消息队列等场景。在开发过程中,为了方便管理和调试Redis数据库,IntelliJ IDEA(简称Idea)提供了多种连接Redis的可视化工具插件,如"Iedis"。这些插件极大地提高了...

    redis连接工具 windows下

    Redis是一款高性能的键值数据库,常用于数据缓存、消息队列等场景。在Windows操作系统中,虽然Redis本身是跨平台的,但直接使用命令行工具进行操作可能会对初学者不太友好,这时就需要借助图形化的Redis连接工具。...

Global site tag (gtag.js) - Google Analytics