blktrace

一次解决磁盘IO读取慢全过程实战

馋奶兔 提交于 2021-01-27 22:28:10
在两台型号相同的机器上(snap1 和snap3)测试磁盘的读取速度,发现两台机器的读取速度差的很大: #dd if=/dev/dm-93 of=/dev/null bs=4M count=1024 711MB/s on snap1. 178MB/s on snap3. 接下来比较snap1和snap3两台机器上关于dm-93磁盘(raid)的以下字段输出都是一样 /sys/block/<device>/queue/max_sectors_kb /sys/block/<device>/queue/nomerges /sys/block/<device>/queue/rq_affinity /sys/block/<device>/queue/scheduler 字段解释可以参考: https://www.kernel.org/doc/Documentation/block/queue-sysfs.txt 然后用blktrace监控一下磁盘IO处理过程: #blktrace /dev/dm-93 使用blkparse查看blktrace收集的日志: 253,108 1 1 7.263881407 21072 Q R 128 + 128 [dd] 在snap3上请求读取一页(64k每页) 253,108 1 2 7.263883907 21072 G R 128 + 128 [dd]

记一次TCP全队列溢出问题排查过程

女生的网名这么多〃 提交于 2021-01-13 18:54:33
1. 前言 本文排查的问题是经典的TCP队列溢出问题,因TCP队列问题在操作系统层面没有明显的指标异常,容易被忽略,故把排查过程分享给大家。 2. 问题描述 A服务调用B服务接口超时,B服务主机IOWAIT高,具体超时情况分为两种: A服务的请求在B服务日志中可查到,但B服务的响应时间超过了A服务的等待超时时间3S。 A服务的请求在B服务日志中无法查到。 3. 问题分析 此种超时请求集中在很短的一段时间(通常在2分钟之内),过后便恢复正常,所以很难抓到问题现场分析原因,只能搭建测试环境,A服务持续请求B服务,在B服务主机上通过DD命令写入大量数据造成主机IOWAIT高,同时通过TCPDUMP在两端抓包分析。 部分服务超时日志: 服务A:Get http://xxx&id=593930: net/http: request canceled (Client.Timeout exceeded while awaiting headers) 服务B: "GET xxx&id=593930 HTTP/1.1" 200 64 "-" "Go-http-client/1.1" "-" "-" 165000(单位微秒) 服务A发起请求3S后没有收到服务B响应,断开连接,服务B日志显示处理时长为0.165S,远低于3S,服务A侧看服务B的响应时间为网络传输时间

记一次 TCP 全队列溢出问题排查过程

半腔热情 提交于 2020-12-28 16:01:35
1. 前言 本文排查的问题是经典的TCP队列溢出问题,因TCP队列问题在操作系统层面没有明显的指标异常,容易被忽略,故把排查过程分享给大家。 2. 问题描述 A服务调用B服务接口超时,B服务主机IOWAIT高,具体超时情况分为两种: A服务的请求在B服务日志中可查到,但B服务的响应时间超过了A服务的等待超时时间3S。 A服务的请求在B服务日志中无法查到。 3. 问题分析 此种超时请求集中在很短的一段时间(通常在2分钟之内),过后便恢复正常,所以很难抓到问题现场分析原因,只能搭建测试环境,A服务持续请求B服务,在B服务主机上通过DD命令写入大量数据造成主机IOWAIT高,同时通过TCPDUMP在两端抓包分析。 部分服务超时日志: 服务A:Get http:// xxx &id=593930: net/http: request canceled (Client.Timeout exceeded while awaiting headers) 服务B: "GET xxx&id=593930 HTTP/1.1" 200 64 "-" "Go-http-client/1.1" "-" "-" 165000(单位微秒) 服务A发起请求3S后没有收到服务B响应,断开连接,服务B日志显示处理时长为0.165S,远低于3S,服务A侧看服务B的响应时间为网络传输时间

磁盘I/O性能优化的几个思路

被刻印的时光 ゝ 提交于 2020-10-07 07:21:11
本文已收录 GitHub ,更有互联网大厂面试真题,面试攻略,高效学习资料等 虽然 I/O 的性能指标很多,相应的性能分析工具也有好几个,但理解了各种指标的含义后,你就会发现它们其实都有一定的关联。 顺着这些关系往下理解,你就会发现,掌握这些常用的瓶颈分析思路,其实并不难。 找出了 I/O 的性能瓶颈后,下一步要做的就是优化了,也就是如何以最快的速度完成 I/O操作,或者换个思路,减少甚至避免磁盘的 I/O 操作。 本文,我就来说说,优化 I/O 性能问题的思路和注意事项。 I/O基准测试 按照我的习惯,优化之前,我会先问自己, I/O 性能优化的目标是什么?换句话说,我们观察的这些 I/O 性能指标(比如 IOPS、吞吐量、延迟等),要达到多少才合适呢? 事实上,I/O 性能指标的具体标准,每个人估计会有不同的答案,因为我们每个人的应用场景、使用的文件系统和物理磁盘等,都有可能不一样。 为了更客观合理地评估优化效果,我们首先应该对磁盘和文件系统进行基准测试,得到文件系统或者磁盘 I/O 的极限性能。 fio(Flexible I/O Tester)正是最常用的文件系统和磁盘 I/O 性能基准测试工具。它提供了大量的可定制化选项,可以用来测试,裸盘或者文件系统在各种场景下的 I/O 性能,包括了不同块大小、不同 I/O 引擎以及是否使用缓存等场景。 fio 的安装比较简单

性能优化 = 改改代码?

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-10 10:52:28
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 这里是Z哥的个人公众号 每周五11:45 按时送达 当然了,也会时不时加个餐~ 我的第「124」篇原创敬上 大家好,我是Z哥。 好久没写技术文章了,最近正好有进行一些思考,顺手写出来分享给大家。 上了一定规模的系统,特别是To C的系统,性能优化或多或少都会被逼着去做一下。否则,系统便无法支撑业务的发展,技术成了拖后腿,不是引领业务了。 一旦线上出现了性能问题,就会很棘手。因为它和业务功能上的Bug不同,后者的分析和解决思路更清晰,只要日志记录到位,沿着一条已知的业务逻辑线,很容易就能找到问题根源。 而性能问题就会复杂的多,导致的因素有很多,甚至会是多种因素共同作用下的结果。比如,代码质量低下、业务发展太快、架构设计不合理等等。 而且一般情况下,性能问题处理起来比较耗时,涉及到的分析链路可能会很长,特别是自己小组之外的上下游系统,很多人不愿意干,或者说有心无力。最多采用一些临时性的补救手段,碰碰运气。比如,扩容增加机器、重启大招、……。 有些临时性的补救措施,有时候不但不能解决问题,还会埋下新的隐患。 比如,从表象上看到某个程序因为给的资源不足导致产生性能问题。临时增加更多资源给它,可能从表面上看,问题是解决了。但是实则可能是因为程序内部对资源的使用上存在不合理的地方,增加资源只是延缓问题发作的时间