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

28 | 案例篇:一个SQL查询要15秒,这是怎么回事?

发现查询语句没有利用索引
发现案例应用正在读写大量的临时文件,导致性能瓶颈
增加索引解决性能问题
通过 MySQL 命令行界面验证慢查询问题
通过 strace、lsof 找出 mysqld 正在读的文件
通过 pidstat 发现瓶颈是由 mysqld 导致的
发现磁盘 I/O 瓶颈
解决磁盘 I/O 的性能问题
使用 filetop 和 opensnoop 追踪系统调用 write() 和 open()
使用 strace 却没有发现问题
系统出现了磁盘的 I/O 瓶颈
这个操作的作用是清空缓存
在读取文件前,它会先把 /proc/sys/vm/drop_caches 改成 1
DataService 实际上是在读写一个仅包括 "data" 字符串的小文件
分析系统的 CPU、内存和磁盘 I/O 使用情况
通过 MySQL 接口,根据客户端提供的商品名称,去数据库表中查询商品信息
商品信息存在 MySQL 中
使用 top、iostat 分析系统的 CPU 和磁盘 I/O 使用情况
停止 DataService 后,商品搜索应用的处理时间从 15 秒缩短到了 0.1 秒
分析一个基于 Python Flask 的商品搜索应用
分析单词热度应用响应过慢的案例
思考
性能问题案例分析
一个SQL查询要15秒,这是怎么回事?

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

你好,我是倪朋飞。
上一节,我们分析了一个单词热度应用响应过慢的案例。当用 top、iostat 分析了系统的 CPU 和磁盘 I/O 使用情况后,我们发现系统出现了磁盘的 I/O 瓶颈,而且正是案例应用导致的。
接着,在使用 strace 却没有任何发现后,我又给你介绍了两个新的工具 filetop 和 opensnoop,分析它们对系统调用 write() 和 open() 的追踪结果。
我们发现,案例应用正在读写大量的临时文件,因此产生了性能瓶颈。找出瓶颈后,我们又用把文件数据都放在内存的方法,解决了磁盘 I/O 的性能问题。
当然,你可能会说,在实际应用中,大量数据肯定是要存入数据库的,而不会直接用文本文件的方式存储。不过,数据库也不是万能的。当数据库出现性能问题时,又该如何分析和定位它的瓶颈呢?
今天我们就来一起分析一个数据库的案例。这是一个基于 Python Flask 的商品搜索应用,商品信息存在 MySQL 中。这个应用可以通过 MySQL 接口,根据客户端提供的商品名称,去数据库表中查询商品信息。
非常感谢唯品会资深运维工程师阳祥义,帮助提供了今天的案例。

案例准备

本次案例还是基于 Ubuntu 18.04,同样适用于其他的 Linux 系统。我使用的案例环境如下所示:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文通过两个案例分析了数据库性能问题的解决方法。首先描述了一个单词热度应用响应过慢的案例,通过分析系统的 CPU 和磁盘 I/O 使用情况,发现了磁盘 I/O 瓶颈,并使用工具解决了性能问题。接着,介绍了一个基于 Python Flask 的商品搜索应用,商品信息存在 MySQL 中,然后提供了案例准备和分析的细节。文章通过实际案例展示了如何分析和定位数据库性能问题,以及解决方法。整体来说,对于读者了解数据库性能问题的分析和解决方法具有一定的参考价值。文章通过详细的案例分析和技术细节,帮助读者了解了如何利用工具分析数据库性能问题,定位瓶颈并解决问题。文章还提到了停止 DataService 应用对性能的影响,展示了对系统整体性能的影响。文章内容丰富,技术性强,对读者进行了全面的数据库性能问题分析和解决方法的介绍。

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

全部留言(45)

  • 最新
  • 精选
  • ninuxer
    打卡day29 echo 1>/proc/sys/vm/drop_caches表示释放pagecache,也就是文件缓存,而mysql读书的数据就是文件缓存,dataservice不停的释放文件缓存,就导致MySQL都无法利用磁盘缓存,也就慢了~

    作者回复: 赞,正解

    2019-01-23
    2
    110
  • 大坏狐狸
    这个地方因为之前了解过,所以来打个卡,这个算法在高性能mysql里有介绍,叫最优前缀. 有时候需要索引很长的字符列,这会让索引变得大且慢。通常可以索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率。但这样也会降低索引的选择性。索引的选择性是指不重复的索引值(也称为基数,cardinality)和数据表的记录总数的比值,范围从1/#T到1之间。索引的选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行。唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。 一般情况下某个前缀的选择性也是足够高的,足以满足查询性能。对于BLOB,TEXT,或者很长的VARCHAR类型的列,必须使用前缀索引,因为MySQL不允许索引这些列的完整长度。 诀窍在于要选择足够长的前缀以保证较高的选择性,同时又不能太长(以便节约空间)。前缀应该足够长,以使得前缀索引的选择性接近于索引的整个列。换句话说,前缀的”基数“应该接近于完整的列的”基数“。 select count(distinct city)/count(*) from city_demo; 根据这个算出一个比例,然后 count(distinct left(city,3)) 把这个3逐渐的加大,一直到算出来的数值接近上面的比例,这样算出来的前缀索引是性能最好的。

    作者回复: 赞,谢谢分享详细的前缀选择算法

    2019-02-11
    58
  • 王星旗
    老师,请教一个问题啊,既然只是iowait占比高,cpu占比不高,为什么执行其它命令会感觉卡呢?在等待io的时候,CPU不应该去执行其它进程吗?

    作者回复: 执行命令也需要IO操作(比如读目录找到binary,加载命令和依赖的库等等)

    2019-08-20
    34
  • rm -rf 😊ི
    有个疑问,老师之前不是说过数据库有自己一套缓存机制吗?为何删除cached也会影响到mysql的读写呢

    作者回复: 数据库的缓存还要看选择了存储引擎,MyISAM不会缓存数据

    2019-04-04
    2
    23
  • hua168
    老师,问3个很重要的题外问题: 1. 大专学历,想直接自学考本科或研究生,自考学历中大型公司承认的吗? 2. 大公司对年龄有限制的吗? 3. 30多岁,运维(编程自学java一年,没项目经验),只有几年小公司运维经验,技术一般,发展方向是什么?很多IT公司好像都不要年龄大点的~~人生80,那不是40岁就没得工作了?

    作者回复: 不用考虑那么多,我觉得打好基础,持续提升自身的能力,开放的心态接收新东西,工作不会那么容易丢的(即使丢了也很容易找到新的)

    2019-01-23
    3
    6
  • 李逍遥
    mysql打开慢查询日志,排查SQL性能问题更方便

    作者回复: 嗯嗯,慢查询推荐总是开启

    2019-01-23
    5
  • 小老鼠
    即停止DataService ,又增加索3引是不是性能会更好?

    作者回复: 是的,利用缓存后性能会更好

    2019-01-26
    3
  • 安小依
    老师好,上次留言说 Java 无法 strace 打日志的问题解决了,原来 strace 必须跟上 -f 选项才可以,最终定位到当疯狂 System.out.println 的时候,原来是写到 pipe 管道里边去了: java 2794 zk 1w FIFO 0,12 0t0 3626492 pipe 到这个地方还是理解不了,这个 pipe 最终是存放在哪里了呢?为什么疯狂打日志,会把磁盘打满呢?谢谢

    作者回复: pipe 是一个管道,而不是文件,可以用 lsof 找一下 pipe 的对端进程

    2019-01-24
    2
  • Geek_33409b
    打卡day29 ,之前在工作中遇到过 释放缓存的情况,但是也会发现echo 1在某些情况下没有办法有效地释放缓存,这会是什么原因引起的呢?

    作者回复: 试试 echo 3

    2019-02-06
    1
  • 我来也
    [D28打卡] 居然漏打卡了,回来补上。 平常偶尔手动释放缓存还有可能,但把这个操作放在需要频繁执行的代码中就有点不科学了。

    作者回复: 嗯嗯,要看场景的。比如,对一个定期评估系统性能的工具,为了获得准确的指标,就有可能这么做(不过这种应用跟其他业务一般都是分开部署)

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