设为首页 加入收藏

TOP

redis 系列20 服务器下(一)
2019-09-17 16:58:13 】 浏览:37
Tags:redis 系列 服务器

二. serverCron函数

  2.3 更新服务器每秒执行命令次数

    serverCron函数中的trackOperationsPerSecond函数会以每100毫秒一次的频率执行,这个函数以抽样计算的方式,估算并记录服务器在最近一秒钟处理的命令请求数量,这个值可以通过info status命令的instantaneous_ops_sec域查看:

        127.0.0.1:6379> info stats
        # Stats
        total_connections_received:5
        total_commands_processed:67
        //服务器在最近一秒钟处理的命令请求数量
        instantaneous_ops_per_sec:0

  关于trackOperationsPerSecond函数的内部实现就不再介绍,大致是当客户端执行INFO命令时,服务器就会调用getOperationsPerSecond函数,根据ops_sec_samples环形数组中的抽样结果,计算出instantaneous_ops_per_sec属性的值。

  

  2.4 更新服务器内存

    服务器状态redisServer结构的stat_peak_memory属性记录了服务器的内存峰值大小,每次serverCron函数执行时,程序都会查看服务器当前使用的内存数量,并与stat_peak_memory保存的数值进行比较,如果当前的内存数量比stat_peak_memory属性记录的值要大,那么程序就将当前使用的内存数量记录到stat_peak_memory属性记录中。INFO memory命令的used_memory_peak和used_memory_peak_human两个域分别以两种格式记录了服务器的内存峰值。

    127.0.0.1:6379> info memory
    # Memory
    used_memory_peak:858952
    used_memory_peak_human:838.82K

    这两个是域是指过去Redis内存使用的峰值,是反映了内存过去最高峰值,而不是当前使用内存的值。

 

  2.5 处理sigterm信号

    在启动服务器时,redis会为服务器进程的singterm信号关联处理器singtermHandler函数,这个信息处理器负责在服务器接收到singterm信号时,打开服务器状态的shutdown_asap标识。 每次serverCron函数运行时,程序都会对服务器状态redisServer结构函数的shutdown_asap属性进行检查,并根据属性的值决定是否关闭服务器。

        static void  sigtermHandler(int sig){
                //打印日志
                redisLogFromHandler(reids_warning,"received sigterm, scheduling shutdown...");
            //打开关闭标识
                server.shutdown_asap=1;
            }
      //下面先打开日志功能,在redis.conf文件中设置日志文件路径,保存配置文件,重启服务。
         171 logfile /usr/local/redis/redis.log
         [root@xuegod64 redis]# redis-server redis.conf
            
     //当在客户端执行shutdown关闭服务器时,服务器在接到sigterm信号之后,关闭服务器并打印相关日志。
        127.0.0.1:6379> shutdown
        not connected>  

    日志显示可以看到,服务器在关闭自身之前会进行RDB持久化操作,这也是服务器拦截sigterm信号的原因,日志信息如下:

          43:M 06 Dec 11:07:42.562 # User requested shutdown...

          42343:M 06 Dec 11:07:42.562 * Saving the final RDB snapshot before exiting.

          42343:M 06 Dec 11:07:42.565 * DB saved on disk

          42343:M 06 Dec 11:07:42.565 * Removing the pid file.

          42343:M 06 Dec 11:07:42.565 # Redis is now ready to exit, bye bye...

  

  2.6 管理客户端资源

    serverCron函数每次执行都会调用clinetsCron函数,该函数会对一定数量的客户端进行检查,包括1.如果客户端与服务器的连接已经超时(如很长时间没有互动),那么程序会释放这个客户端。2.如果客户端在上一次执行命令请求之后,输入缓冲区的大小超过了一定的长度,那么程序会释放客户端当前的输入缓冲区。

 

  2.7 执行被延迟的bgrewriteaof

    说到bgsave和bgrewriteaof二个客户端命令,前者针对RDB持久化,后者针对AOF 持久化。在服务器执行bgsave命令的期间,如果客户端向服务器发送了bgrewriteaof命令,那么服务器会将bgrewriteaof命令的执行时间延迟到bgsave命令执行完毕之后。每次serverCron函数执行时,都会检查bgsave命令或者bgrewriteaof命令是否正在执行,如果这两个命令都没在执行,并且aof_rewrite_scheduled属性的值为1,那么服务器就会执行之前被推延的bgrewriteaof命令。

        struct redisServer {
                    //如果值为1, 那么表示有bgrewriteaof命令被延迟了
                int aof_rewrite_scheduled;
            }

  

  2.8 检查持久化操作的运作状态

    服务器状态使用redisServer结构的rdb_child_pid属性和aof_child_pid属性记录执行bgsave命令和bgrewriteaof命令的子进程的ID,这两个属性也可以用于检查bgsave命令或者bgrewriteaof命令是否正在执行。

    struct redisServer {

            //记录执行bgsave命令的子进程的ID
            //如果服务器没有在执行bgsave,那么这个属性的值为-1.
            pid_t rdb_chlid_pid;

            //记录执行bgrewriteaof命令的子进程的ID
            //如果服务器没有在执行bgrewriteaof,那么这个属性的值为-1.
            pid_t aof_chlid_pid;
        }

    每次serverCron函数执行时,程序都会检查rdb_chlid_pid和aof_child_pid两个属性值,只要其中一个属性的值不为-1, 代表正在执行,程序就会执行一次wait3函数,检查子进程是否有信号发给服务器主进程。如果有信号到达:那么对于bgsave命令来说,新的rdb文件已经生成; 对于bbgrewriteaof命令来说,AOF文件已经重写完成; 服务器需要进行相应命令的后续操作,比如用新的RDB文件替换现有RDB文件,或者用重写后的AOF文件替换现有的AOF文件。如果没有信号到达,那么表示持久化操作未完成,程序不做动作

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇学习笔记—MapReduce 下一篇linux配置MySql表名不区分大小写

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目