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

26 | 案例篇:如何找出狂打日志的“内鬼”?

调整日志级别解决I/O性能问题
查看案例应用的源代码
使用lsof查看进程打开的文件列表
使用strace观察系统调用
使用pidstat观察每个进程的I/O情况
观察磁盘I/O使用情况
定位CPU使用率和iowait
使用iostat观察磁盘I/O
使用top观察CPU和内存
安装docker、sysstat等工具
机器配置
缓冲区缓存块设备的数据
页缓存、索引节点缓存、目录项缓存
包括块设备的驱动程序和物理存储设备
对I/O请求进行排队和优化
提供访问块设备的标准接口
统一接口与应用程序和内核交互
确认分析结果的方法
内存被Buffer还是Cache占用
解决狂打日志问题的方法
日志的重要性
源码分析
分析进程写入情况
观察进程I/O情况
分析性能问题
观察系统性能指标
环境配置
采用多种缓存机制
包括文件系统、通用块层和设备层
设备层
通用块层
Linux抽象了虚拟文件系统VFS
存储设备上的文件组织管理机制
思考
小结
案例分析
案例准备
性能优化
存储I/O栈
文件系统
如何找出狂打日志的“内鬼”?

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

你好,我是倪朋飞。
前两节,我们学了文件系统和磁盘的 I/O 原理,我先带你复习一下。
文件系统,是对存储设备上的文件进行组织管理的一种机制。为了支持各类不同的文件系统,Linux 在各种文件系统上,抽象了一层虚拟文件系统 VFS。
它定义了一组所有文件系统都支持的数据结构和标准接口。这样,应用程序和内核中的其他子系统,就只需要跟 VFS 提供的统一接口进行交互。
在文件系统的下层,为了支持各种不同类型的存储设备,Linux 又在各种存储设备的基础上,抽象了一个通用块层。
通用块层,为文件系统和应用程序提供了访问块设备的标准接口;同时,为各种块设备的驱动程序提供了统一的框架。此外,通用块层还会对文件系统和应用程序发送过来的 I/O 请求进行排队,并通过重新排序、请求合并等方式,提高磁盘读写的效率。
通用块层的下一层,自然就是设备层了,包括各种块设备的驱动程序以及物理存储设备。
文件系统、通用块层以及设备层,就构成了 Linux 的存储 I/O 栈。存储系统的 I/O ,通常是整个系统中最慢的一环。所以,Linux 采用多种缓存机制,来优化 I/O 的效率,比方说,
为了优化文件访问的性能,采用页缓存、索引节点缓存、目录项缓存等多种缓存机制,减少对下层块设备的直接调用。
同样的,为了优化块设备的访问效率,使用缓冲区来缓存块设备的数据。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文通过一个案例详细介绍了如何通过分析系统资源使用情况,定位和分析文件系统和磁盘的I/O问题。作者首先复习了Linux文件系统和磁盘I/O原理,引出了一个应用程序记录大量日志的案例。通过观察CPU、内存和磁盘I/O等系统资源的使用情况,使用top和iostat等工具来定位性能问题,并指出了潜在瓶颈。通过iostat命令观察了I/O的使用情况,发现磁盘sda的I/O使用率已经高达99%,可能已经接近I/O饱和。作者使用pidstat工具观察进程的I/O情况,发现python进程导致了I/O瓶颈。通过strace和lsof命令进一步分析了python进程的写入情况和打开文件列表,最终发现了问题的根源。文章最后通过分析源代码,提出了解决问题的方法。整篇文章以案例为引导,结合具体操作步骤,帮助读者了解如何从系统资源使用问题出发,分析出瓶颈所在的应用,以及瓶颈在应用中大概的位置。文章内容丰富,操作性强,适合读者快速了解如何定位和分析文件系统和磁盘的I/O问题。

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

全部留言(48)

  • 最新
  • 精选
  • hua168
    大神,能问一个题外话吗,关于自己人生规划,水平和眼界所限,想不通, 都说大神级见识很广也多,能给我这个35岁只维护过四五十台linux服务器的运维指条路吗? 现在很迷茫和压力大~~ 能力如下: 一.网络:CCNA水平,自过了CCNP忘记了,当过2年网管 二、维护过asp.net电商网站,3年,只有简单的,兼职网管 三、linux运维,只在一家电商做了3年多,会 1.web:nginx、tomcat配置(少用)+php:nignx的rewirte和反代 2.数据库:mysql、mongoDB、redis 配置及主从,不会mycat、Cetus之类 3.反代:会nginx、haproxy简单配置 4.存储:NFS、fastDFS、hadoop简单看了一下 5.版本控制:只会git及搭建gitlab+jenkins(简单的CI/CD) 6.监控:简单配置zabbix+shell脚本 7.虚拟化:kvm安装及配置、docker(k8s还没学) 8.云计算:openstack只会安装做过实验 9.测试:只会ab工具 10.日志:ELK安装配置,还没结合java(在学中) 11.大数据:没使用过(不会flume、storm、spark、flink、kafka) 12.脚本:主要是shell为主、会点python 四、编程能力:自学,没项目经验 1.前端: 1)HTML(HTML5不怎看) 2)css(laiui、学了一下vue) 3) js、jquery框架、ES6简单看了一下 2.PHP:语法简单的thinkphp5框架 3.java:考虑要维护java web在学 只看了java、jsp及servet、spring、springMVC、spring Boot(这个为主) 4.python:考虑运维用到 python:会简单的脚本 django:只会官网简单的 问题是:现在已35岁了,失业,怎办?年龄摆在那里,能力好像不强,学历大专。 能给个建议吗?非常感谢~~

    作者回复: 看前面的经历,技术面还是挺广的,但可能很多地方都不太深入。 建议还是先找份工作吧,长期待业可能会加重焦虑。然后可以根据实际工作需要,先把工作需要的知识技能加深掌握。等到可以从容应对工作的时候,再考虑在某个领域加强深入。

    2019-01-19
    14
    91
  • Christmas
    pcstat(page cache stat)这个可以查看目标log文件在cache中的大小

    作者回复: 嗯嗯 是的,并且这个工具需要知道哪个文件

    2019-01-18
    2
    37
  • 划时代
    指出老师的一个问题,“日志回滚文件”,打印日志的过程中从直觉来看很容易误认为日志是在“回滚”,我也犯过这样的错误;rotating英文直译为“旋转”或“轮流”,实际的日志打印过程中,日志名称是“旋转”的,例如log.1(当前打印的日志文件并且一直会打印这个文件),log.2(较早日志),log.3(更早日志),当触发“旋转”条件时,日志名称会发生变更,假如log.3是上限数,那么log.3发生“旋转”就被remove,log.2被rename为log.3。更形象一点的描述是,日志名称发生了滚动,log.1=>log.2=>log.3不断的更新。

    作者回复: 谢谢指出,确实只是文件名称的旋转,内容并没有回滚

    2019-01-18
    3
    29
  • J
    logger.info(message)的情况下,还可以使用logger.setLevel修改日志级别吗?

    作者回复: 可以的,比如调高到警告级别,那么 info() 实际上就不写了

    2019-01-20
    4
  • Geek_41dcba
    在回答今天的思考题前,我想需要明确两个前提,一个是Buffer到底在整个系统结构的哪一层,会不会是不是在IO调度器的下一层,我想应该会,理由是Buffer缓存磁盘内容调度器合并后再去写磁盘效率更好;另一个是之前有看到留言对于文件系统使用带Cache的IO操作底层为了性能Buffer和Cache是合并的,如果是这样那我就从逻辑上认为它们是分开的,这样好回答问题(声明我没看过底层代码都是没有代码依据的)。 我认为增长的地方都在Buffer里面,Cache里面的内容可以经过IO调度器整理后放Buffer,没有理由说磁盘阻塞,Cache就不能移动到Buffer 查看数据的地方在/proc/meminfo。 上面的都想法今天没有时间验证,要明天了!

    作者回复: 嗯 可以实际操作验证一下

    2019-01-18
    3
  • 小肥皂酱
    老师,我运行docker run -v /tmp:/tmp --name=app -itd feisky/logapp 这个命令几秒后这个进程就不在了。怎么回事呢

    作者回复: 应该是退出了,docker logs app看看是什么错误信息

    2019-04-12
    5
    2
  • Hinimix
    老师,代码里怎么写能接受sigusr这个参数呢,现在每次改级别我都是改配置文件然后重启

    作者回复: 不同编程语言都有相应的库函数可以调用。案例中Python的使用方法可以参考https://github.com/feiskyer/linux-perf-examples/blob/master/logging-app/app.py#L47

    2019-07-19
    2
    1
  • 渡渡鸟_linux
    我这边使用centos7 2c 8g 实验结果与文章中有些区别: 1. 在运行容器后,使用top命令发现sys与iowait各占单个CPU的10-50% 2. 针对iowait,使用dstat发现磁盘每秒写入约为300M; vmstat中bo也验证了写请求较大 3. 使用pidstat -d 分析发现是Python写入请求大,根据 iostat分析到当前磁盘使用率90%,写队列1000 4. 使用strace跟踪,发现写入fd为3,观察ls -l /proc/$pid/fd/,发现fd:3 --> /tmp/logtest.txt 5. 再通过 watch -n 1 ls -lh /tmp/logtest.txt 观察日志大小,发现日志在轮转 ---- 有个疑惑,针对 sys 较高,无论是上下文切换,还是中断,都非常少,只有一个io写入。难道io密集型应用也能大幅度拉高sys?我也没发现man手册中提到io等待时间包含在sys中啊 [root@centos-80 ~]# dstat 2 ----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system-- usr sys idl wai hiq siq| read writ| recv send| in out | int csw 6 13 68 12 0 0| 146k 312M| 0 0 | 0 0 | 854 333 13 26 27 34 0 1| 0 598M| 60B 626B| 0 0 |1506 312 10 22 42 25 0 0| 0 587M| 60B 354B| 0 0 |1385 270

    作者回复: sys使用高是正常的,任何IO都要经过系统调用完成,自然要占用sys。

    2019-01-21
    1
  • 仲鬼
    “每秒写的数据超过 45 MB,比上面 iostat 发现的 32MB 的结果还要大” 老师好,没明白这里的比较要说明什么问题?

    作者回复: 这儿是要说 IO 的来源,肯定是 I/O 大的进程

    2019-01-18
    1
  • 安小依
    Ubuntu 16.04, 使用 strace 应该需要先临时修改系统一个配置:echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope。另外用 java 模拟写文件,strace 发现还是不行,一直卡在这个地方: zk@zk-pc:~/Documents$ strace -p 6526 strace: Process 6526 attached futex(0x7f934a93a9d0, FUTEX_WAIT, 6527, NULL 老师帮忙看一下,Java 源代码如下。注释掉的部分 System.out 是疯狂打日志 (标准输出),线上环境出现过,疯狂 println 结果磁盘打满的问题,想模拟一下,结果发现不行。然后换成了写文件,结果 strace 还是看不出来,卡在那个地方一直不动: public static void main(String...args) throws Exception { File file = new File("/tmp/aaa"); PrintWriter printWriter = new PrintWriter(file); while (true) { printWriter.write(UUID.randomUUID().toString()); // System.out.println("------------------------------NULL-------------------"); LockSupport.parkNanos(1); } } 另外问一下老师,一直向标准输出打印的话,最终的那个文件是放在哪里呢了?怎么就把磁盘打满了呢?

    作者回复: 你这个例子是向文件 /tmp/aaa 写,不是标准输出

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