美文网首页PHP经验分享Go
【轻知识】记录一次,排查redis内存告警,分析出要删除的key

【轻知识】记录一次,排查redis内存告警,分析出要删除的key

作者: 言十年 | 来源:发表于2019-09-16 12:36 被阅读0次

    分析的过程都是小伙伴做的,我只是记录下。

    现象

    12号钉钉群告警,某个实例有内存使用率的问题。

    分析

    实例内存增长,从11号开始的。

    那就看 10号跟12号的rdb。看看期间的增长情况(期间每个实例都增长了1个G)。

    处理过程

    1. 下载 rdb文件
    rdb文件下载的地方

    wget -O 9100.rdb http://rdsbakxxx. _data_201909100xxx.rdb

    1. 下载 redis-rdb-toolshttps://github.com/sripathikrishnan/redis-rdb-tools

    rdb -c memory 9120.rdb > 9120.csv

    rdb -c memory 9100.rdb > 9100.csv

    1. 分析哪些key出现的频次比较高。

    cat 9120.csv |awk -F':' '{if($2!="") print $2}' | sort | uniq -c| sort -n -r | head -n 10

    找出来type这个关键词出现次数最多。紧接着看包含type的key是否为必要删除的key。

    1. 找到业务程序中的包含type的key ‘user:type:user:info:’,看10号跟12号,的内存情况。

    cat 9100.csv| grep 'user:type:user:info:' | awk -F' ' 'BEGIN{a=0}{if($2!="") a+=$2}END{print a/1024/1024/1024}'

    cat 9120.csv| grep 'user:type:user:info:' | awk -F' ' 'BEGIN{a=0}{if($2!="") a+=$2}END{print a/1024/1024/1024}'

    经对比,12号比10号多了0.8G。于是找到了增长元凶(每个实例增长了1个G)

    1. 删除这些key。

    经分析,该key是可以删除的(缓存用户信息)。另外看到程序中缓存时间为100天,后改成了1个小时。

    把12号的rdb中要删除的key放到一个文件中。

    rdb -c justkeys --db 0 --key "user:type:device:info:*" 912.rdb > deviceKey.txt

    5.写删除脚本

    脚本内容参考。

        public function run()
        {
            global $argv;
            $fileName         = $argv[1] ?? 0;
            if (empty($fileName)) {
                var_dump('没有文件');
                return ;
            }
            $redeis = Redis::getInstance('xxxxx');
            $count = 0;
            $handle  = fopen ($fileName, "r");
            $successCount = 0;
            while (!feof ($handle))
            {
                $buffer  = fgets($handle, 4096);
                $key = trim($buffer);
                if (empty($key)) {
                    continue;
                }
                $result = $redeis->del($key);
                $count++;
                if ($result) {
                    var_dump('success:'.$key);
                    $successCount++;
                } else {
                    var_dump('error:'. $key);
                }
                if ($count % 100000 === 0) {
                    var_dump('10万个,睡眠5秒钟');
                    sleep(5);
                }
    
    
            }
            if ($successCount == $count) {
                var_dump('删除完毕');
            }
            fclose ($handle);
        }
    

    找台线上环境的机器执行。(最好rdb文件下载到那台机器,不然还要用其他方式挪过去,scp或者ftp什么的)

    php /xxxxx/clear-redis-deviceid-cache.php /xxxxxx/deviceKey.txt >> result.txt

    ps.原本的思路是找大key 的(也是同样的类似的思路)。但是找到的都是必要的key,都不能删。后来的思路改成了哪些特征的key出现的次数高。

    相关文章

      网友评论

        本文标题:【轻知识】记录一次,排查redis内存告警,分析出要删除的key

        本文链接:https://www.haomeiwen.com/subject/vgbxuctx.html