Linux 性能优化实战
倪朋飞
资深 Linux 专家,Kubernetes 项目维护者
87256 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
结束语 (1讲)
Linux 性能优化实战
15
15
1.0x
00:00/00:00
登录|注册

29 | 案例篇:Redis响应严重延迟,如何解决?

确认写操作的进程
磁盘写操作
磁盘I/O情况
内存使用情况
CPU使用情况
欢迎讨论和分享
实际工作中的I/O性能问题
分析规律
优化应用程序
优化配置
确认Redis配置
确认TCP连接信息
确认I/O性能问题
分析系统资源使用情况
启动目标应用
Docker镜像
Python应用+Redis
机器配置
推荐使用Redis等第三方缓存应用
不建议完全依赖系统缓存
利用索引解决问题
磁盘I/O瓶颈
MySQL的慢查询问题
小结
案例分析
案例准备
总结
Redis响应严重延迟,如何解决?

该思维导图由 AI 生成,仅供参考

你好,我是倪朋飞。
上一节,我们一起分析了一个基于 MySQL 的商品搜索案例,先来回顾一下。
在访问商品搜索接口时,我们发现接口的响应特别慢。通过对系统 CPU、内存和磁盘 I/O 等资源使用情况的分析,我们发现这时出现了磁盘的 I/O 瓶颈,并且正是案例应用导致的。
接着,我们借助 pidstat,发现罪魁祸首是 mysqld 进程。我们又通过 strace、lsof,找出了 mysqld 正在读的文件。根据文件的名字和路径,我们找出了 mysqld 正在操作的数据库和数据表。综合这些信息,我们猜测这是一个没利用索引导致的慢查询问题。
为了验证猜测,我们到 MySQL 命令行终端,使用数据库分析工具发现,案例应用访问的字段果然没有索引。既然猜测是正确的,那增加索引后,问题就自然解决了。
从这个案例你会发现,MySQL 的 MyISAM 引擎,主要依赖系统缓存加速磁盘 I/O 的访问。可如果系统中还有其他应用同时运行, MyISAM 引擎很难充分利用系统缓存。缓存可能会被其他应用程序占用,甚至被清理掉。
所以,一般我并不建议,把应用程序的性能优化完全建立在系统缓存上。最好能在应用程序的内部分配内存,构建完全自主控制的缓存;或者使用第三方的缓存应用,比如 Memcached、Redis 等。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了基于Redis缓存的案例分析,重点讨论了MySQL和Redis的性能问题及解决方法。作者首先回顾了一个基于MySQL的商品搜索案例,发现磁盘I/O瓶颈导致的慢查询问题,并通过增加索引解决了问题。接着,作者引出了Redis作为缓存的情况,指出Redis基于内存存储数据,但配置持久化可能引发磁盘I/O性能问题。随后,作者介绍了一个基于Python Flask的应用程序,利用Redis管理缓存并提供HTTP接口。文章通过实际案例和性能工具分析,帮助读者深入理解系统资源使用情况和性能瓶颈,为读者提供了一种系统性能分析的方法。整体而言,本文适合读者了解基于Redis的缓存应用和性能优化,对于系统性能分析有一定的参考价值。文章通过实际案例和性能工具分析,帮助读者深入理解系统资源使用情况和性能瓶颈,为读者提供了一种系统性能分析的方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 性能优化实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(32)

  • 最新
  • 精选
  • 李博
    老师,有个问题咨询下,为什么top显示 iowait比较高,但是使用iostat却发现io的使用率并不高那?

    作者回复: iowait不代表磁盘I/O存在瓶颈,只是代表CPU上I/O操作的时间占用的百分比。假如这时候没有其他进程在运行,那么很小的I/O就会导致iowait升高

    2019-01-25
    4
    53
  • Geek_33409b
    打卡day30 IO性能问题首先可以通过top 查看机器的整体负载情况,一般会出现CPU 的iowait 较高的现象 然后使用 pidstat -d 1 找到读写磁盘较高的进程 然后通过 strace -f -TT 进行跟踪,查看系统读写调用的频率和时间 通过lsof 找到 strace 中的文件描述符对应的文件 opensnoop可以找到对应的问题位置 推测 对应的问题,mysql 案例中的大量读,可能是因为没有建立索引导致的全表查询,从而形成了慢查询的现象。redis 中则是因为 备份文件设置的不合理导致的每次查询都会写磁盘。当然不同的问题还需要结合对应的情况进行分析

    作者回复: 👍

    2019-02-06
    5
    27
  • ____的我
    前段时间刚找到一个由于内存数据被交换到swap文件中导致内存数据遍历效率变低的问题 问题定位过程是使用pidstat命令发现进程cpu使用率变低 mpstat命令观察到系统iowait升高 由此怀疑跟io有什么关系 perf命令观察发现内存数据遍历过程中swap相关调用时间占比有点异常 然后使用pidstat命令+r参数 也观察到进程在那段时间主缺页中断升高 由此确定问题 老师的课程非常有用 多多向您学习 希望老师能多分享一些定位网络延迟问题的方法 不仅仅局限在ping探测

    作者回复: 谢谢分享性能排查的经验👍

    2019-02-11
    2
    12
  • yungoo
    nsenter报了loadlocale.c assertion设置 export LC_ALL=C 即可

    作者回复: 谢谢分享

    2019-03-17
    11
  • 武文文武
    老师您好,一直在听您的视频,发现您用了很多的小工具来检查系统性能指标,而我们公司使用nmon工具,就能一次性将几乎所有常用的指标全部获取到了,而且还能拿到历史数据,请问我们用nmon是否就能在大部分情况下取到了您说的top pidstat等工具呢,如果不可以那您能说说原因吗?非常感谢

    作者回复: 嗯,实际使用中,使用类似nmon这种监控系统是更推荐的做法。不过,在监控系统的间隔时间不够小,或者指标不够全的时候,还是需要到系统上去抓取更多的细节

    2019-02-28
    3
    11
  • 从远方过来
    老师,你这几篇文章大量使用了strace,它的负载不是很高么?在生产上可以使用么?

    作者回复: 是的,strace会影响性能,所以一般不使用它来做监控。但是在已经出现严重性能问题的时候,使用它来排查问题还是可以接受的。

    2020-07-08
    6
  • 利俊杰
    nsenter --target $PID -- lsof -i 执行失败,提示:loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_COLLATE) / sizeof (_nl_value_type_LC_COLLATE[0]))' failed 可以参考下https://stackoverflow.com/questions/37121895/yocto-build-loadlocale-c-130 配置 LANG=/usr/lib/locale/en_US

    作者回复: 谢谢分享

    2019-01-26
    5
  • 开始懂了
    curl http://10.39.25.7:10000/init/get_cache <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <title>500 Internal Server Error</title> <h1>Internal Server Error</h1> <p>The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.</p>

    作者回复: /init/ 后面需要一个数字

    2019-01-25
    3
  • 往事随风,顺其自然
    git clone https://github.com/feiskyer/linux-perf-examples/tree/master/redis-slow Initialized empty Git repository in /root/redis-slow/.git/ error: The requested URL returned error: 403 Forbidden while accessing https://github.com/feiskyer/linux-perf-examples/tree/master/redis-slow/info/refs 代码怎么克隆不下来

    作者回复: clone要指定代码仓库的路径,而不是子目录: git clone https://github.com/feiskyer/linux-perf-examples

    2019-01-25
    2
  • Chn.K
    请教个问题:我用iotop观测IO使用情况,发现某进程的DISK READ 和DISK WRITE都是0,但是IO已经到99.99%了,通过top/iostat对cpu/磁盘的使用情况进行观测,均未发现什么异常,这个是什么原因呢? Total DISK READ : 18.14 M/s | Total DISK WRITE : 31.59 M/s Actual DISK READ: 18.02 M/s | Actual DISK WRITE: 15.60 M/s PID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND 148 be/4 root 0.00 B/s 0.00 B/s 0.00 % 99.99 % [ksoftirqd/17] 23655 be/4 root 0.00 B/s 988.19 K/s 0.00 % 0.00 % ./xxxx ../etc/base.conf 17535 be/4 root 18.14 M/s 30.63 M/s 0.00 % 0.00 % xxxx

    作者回复: 这个IO 99%跟你想的磁盘IO使用99%是不一样的,具体含义你可以去查一下iotop的文档

    2019-02-20
    2
    1
收起评论
显示
设置
留言
32
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部