Redis响应严重延迟,如何解决?

文章来源:linux性能优化实战
 
redis 是最常用的键值存储系统之一 , 常用作数据库、高速缓存和消息队列代理等 。Redis 基于内存来存储数据 , 不过 , 为了保证在服务器异常时数据不丢失 , 很多情况下 , 我们要为它配置持久化 , 而这就可能会引发磁盘 I/O 的性能问题 。
今天 , 我就带你一起来分析一个利用 Redis 作为缓存的案例 。
这同样是一个基于 Python Flask 的应用程序 , 它提供了一个 查询缓存的接口 , 但接口的响应时间比较长 , 并不能满足线上系统的要求 。
非常感谢携程系统研发部资深后端工程师董国星 , 帮助提供了今天的案例 。
案例准备本次案例还是基于 Ubuntu 18.04 , 同样适用于其他的 Linux 系统 。我使用的案例环境如下所示:
机器配置:2 CPU , 8GB 内存
预先安装 Docker、sysstat 、git、make 等工具 , 如 apt install docker.io sysstat
今天的案例由 Python 应用 +Redis 两部分组成 。其中 , Python 应用是一个基于 Flask 的应用 , 它会利用 Redis  , 来管理应用程序的缓存 , 并对外提供三个 HTTP 接口:
/:返回 hello redis;
/init/:插入指定数量的缓存数据 , 如果不指定数量 , 默认的是 5000 条;
缓存的键格式为 uuid:
缓存的值为 good、bad 或 normal 三者之一
/get_cache/<type_name>:查询指定值的缓存数据 , 并返回处理时间 。其中 , type_name 参数只支持 good, bad 和 normal(也就是找出具有相同 value 的 key 列表) 。
由于应用比较多 , 为了方便你运行 , 我把它们打包成了两个 Docker 镜像 , 并推送到了 Github 上 。这样你就只需要运行几条命令 , 就可以启动了 。
 
今天的案例需要两台虚拟机 , 其中一台用作案例分析的目标机器 , 运行 Flask 应用 , 它的 IP 地址是 192.168.0.10;而另一台作为客户端 , 请求缓存查询接口 。我画了一张图来表示它们的关系 。
Redis响应严重延迟,如何解决?

文章插图
 
接下来 , 打开两个终端 , 分别 SSH 登录到这两台虚拟机中 , 并在第一台虚拟机中安装上述工具 。
跟以前一样 , 案例中所有命令都默认以 root 用户运行 , 如果你是用普通用户身份登陆系统 , 请运行 sudo su root 命令切换到 root 用户 。
到这里 , 准备工作就完成了 。接下来 , 我们正式进入操作环节 。
 
案例分析首先 , 我们在第一个终端中 , 执行下面的命令 , 运行本次案例要分析的目标应用 。正常情况下 , 你应该可以看到下面的输出:
$ docker runec41cb9e4dd5cb7079e1d9f72b7cee7de67278dbd3bd0956b4c0846bff211803 
然后 , 再运行 docker ps 命令 , 确认两个容器都处于运行(Up)状态:
$ docker psCONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                             NAMES2c54eb252d05        feisky/redis-App      "python /app.py"         48 seconds ago      Up 47 seconds                                         appec41cb9e4dd5        feisky/redis-server   "docker-entrypoint.s…"   49 seconds ago      Up 48 seconds       6379/tcp, 0.0.0.0:10000->80/tcp   redis比如 , 我们切换到第二个终端 , 使用 curl 工具 , 访问应用首页 。如果你看到 hello redis 的输出 , 说明应用正常启动:
接下来 , 继续在终端二中 , 执行下面的 curl 命令 , 来调用应用的 /init 接口 , 初始化 Redis 缓存 , 并且插入 5000 条缓存信息 。这个过程比较慢 , 比如我的机器就花了十几分钟时间 。耐心等一会儿后 , 你会看到下面这行输出:


推荐阅读