Linux性能优化实战
倪朋飞
微软资深工程师,Kubernetes项目维护者
立即订阅
23395 人已学习
课程目录
已完结 64 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (2讲)
开篇词 | 别再让Linux性能问题成为你的绊脚石
免费
01 | 如何学习Linux性能优化?
CPU 性能篇 (13讲)
02 | 基础篇:到底应该怎么理解“平均负载”?
03 | 基础篇:经常说的 CPU 上下文切换是什么意思?(上)
04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)
05 | 基础篇:某个应用的CPU使用率居然达到100%,我该怎么办?
06 | 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
07 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(上)
08 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(下)
09 | 基础篇:怎么理解Linux软中断?
10 | 案例篇:系统的软中断CPU使用率升高,我该怎么办?
11 | 套路篇:如何迅速分析出系统CPU的瓶颈在哪里?
12 | 套路篇:CPU 性能优化的几个思路
13 | 答疑(一):无法模拟出 RES 中断的问题,怎么办?
14 | 答疑(二):如何用perf工具分析Java程序?
内存性能篇 (8讲)
15 | 基础篇:Linux内存是怎么工作的?
16 | 基础篇:怎么理解内存中的Buffer和Cache?
17 | 案例篇:如何利用系统缓存优化程序的运行效率?
18 | 案例篇:内存泄漏了,我该如何定位和处理?
19 | 案例篇:为什么系统的Swap变高了(上)
20 | 案例篇:为什么系统的Swap变高了?(下)
21 | 套路篇:如何“快准狠”找到系统内存的问题?
22 | 答疑(三):文件系统与磁盘的区别是什么?
I/O 性能篇 (10讲)
23 | 基础篇:Linux 文件系统是怎么工作的?
24 | 基础篇:Linux 磁盘I/O是怎么工作的(上)
25 | 基础篇:Linux 磁盘I/O是怎么工作的(下)
26 | 案例篇:如何找出狂打日志的“内鬼”?
27 | 案例篇:为什么我的磁盘I/O延迟很高?
28 | 案例篇:一个SQL查询要15秒,这是怎么回事?
29 | 案例篇:Redis响应严重延迟,如何解决?
30 | 套路篇:如何迅速分析出系统I/O的瓶颈在哪里?
31 | 套路篇:磁盘 I/O 性能优化的几个思路
32 | 答疑(四):阻塞、非阻塞 I/O 与同步、异步 I/O 的区别和联系
网络性能篇 (13讲)
33 | 关于 Linux 网络,你必须知道这些(上)
34 | 关于 Linux 网络,你必须知道这些(下)
35 | 基础篇:C10K 和 C1000K 回顾
36 | 套路篇:怎么评估系统的网络性能?
37 | 案例篇:DNS 解析时快时慢,我该怎么办?
38 | 案例篇:怎么使用 tcpdump 和 Wireshark 分析网络流量?
39 | 案例篇:怎么缓解 DDoS 攻击带来的性能下降问题?
40 | 案例篇:网络请求延迟变大了,我该怎么办?
41 | 案例篇:如何优化 NAT 性能?(上)
42 | 案例篇:如何优化 NAT 性能?(下)
43 | 套路篇:网络性能优化的几个思路(上)
44 | 套路篇:网络性能优化的几个思路(下)
45 | 答疑(五):网络收发过程中,缓冲区位置在哪里?
综合实战篇 (13讲)
46 | 案例篇:为什么应用容器化后,启动慢了很多?
47 | 案例篇:服务器总是时不时丢包,我该怎么办?(上)
48 | 案例篇:服务器总是时不时丢包,我该怎么办?(下)
49 | 案例篇:内核线程 CPU 利用率太高,我该怎么办?
50 | 案例篇:动态追踪怎么用?(上)
51 | 案例篇:动态追踪怎么用?(下)
52 | 案例篇:服务吞吐量下降很厉害,怎么分析?
53 | 套路篇:系统监控的综合思路
54 | 套路篇:应用监控的一般思路
55 | 套路篇:分析性能问题的一般步骤
56 | 套路篇:优化性能问题的一般方法
57 | 套路篇:Linux 性能工具速查
58 | 答疑(六):容器冷启动如何性能分析?
加餐篇 (4讲)
加餐(一) | 书单推荐:性能优化和Linux 系统原理
加餐(二) | 书单推荐:网络原理和 Linux 内核实现
用户故事 | “半路出家 ”,也要顺利拿下性能优化!
用户故事 | 运维和开发工程师们怎么说?
结束语 (1讲)
结束语 | 愿你攻克性能难关
Linux性能优化实战
登录|注册

09 | 基础篇:怎么理解Linux软中断?

倪朋飞 2018-12-10
你好,我是倪朋飞。
上一期,我用一个不可中断进程的案例,带你学习了 iowait(也就是等待 I/O 的 CPU 使用率)升高时的分析方法。这里你要记住,进程的不可中断状态是系统的一种保护机制,可以保证硬件的交互过程不被意外打断。所以,短时间的不可中断状态是很正常的。
但是,当进程长时间都处于不可中断状态时,你就得当心了。这时,你可以使用 dstat、pidstat 等工具,确认是不是磁盘 I/O 的问题,进而排查相关的进程和磁盘设备。关于磁盘 I/O 的性能问题,你暂且不用专门去背,我会在后续的 I/O 部分详细介绍,到时候理解了也就记住了。
其实除了 iowait,软中断(softirq)CPU 使用率升高也是最常见的一种性能问题。接下来的两节课,我们就来学习软中断的内容,我还会以最常见的反向代理服务器 Nginx 的案例,带你分析这种情况。

从“取外卖”看中断

说到中断,我在前面关于“上下文切换”的文章,简单说过中断的含义,先来回顾一下。中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求。
你可能要问了,为什么要有中断呢?我可以举个生活中的例子,让你感受一下中断的魅力。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Linux性能优化实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(76)

  • 我来也
    [D9打卡]
    ======================================
    问题:怎么理解软中断?
    我的理解比较简单粗暴, 硬中断是硬件产生的,比如键盘、鼠标的输入,硬盘的写入读取、网卡有数据了;软中断是软件产生的,比如程序内的定时器、[文中提到的RCU锁]。
    再加上今天的上半部下半部,更好的理解了网卡的处理实际是有硬中断和软中断的。
    ======================================
    问题:有没有碰到过因为软中断出现的性能问题?
    有,且是血淋淋的教训。
    之前的c程序用到了别人写的动态库[如:lib.a],在物理机上,进程的cpu利用率在0%;而切换到了云服务器,即使空载,单进程的cpu利用率都有30%+。
    以前没经验嘛,各种自查,无结果,但是自己的进程cpu利用率又那么高,总是不安心.
    后来才通过vmstat 检测到系统的软中断每秒有100W+次.
    最后各自百度,找人,才发现是那个动态库在处理网络收发消息时,使用了usleep(1)来休息,每次休息1纳秒,单次中断的耗时都不止1纳秒.
    --------------------------------------
    如果是现在,我会如下分析:
    1.检测是哪个线程占用了cpu: top -H -p XX 1 / pidstat -wut -p XX 1
    2.在进程中打印各线程号. 找到是哪个线程.[ 此过程也可以省略 但可以快速定位线程]
    3.第一步应该可以判断出来中断数过高. 再使用 cat /proc/softirqs 查看是哪种类型的中断数过高.
    4.不知道perf report -g -p XX 是否可以定位到具体的系统调用函数.
    5.最终还是要查看源码,定位具体的位置,并加以验证.
    --------------------------------------
    感觉现在随便怎么分析都可以快速定位到是动态库的锅.
    想当初可是好几个月都无能为力啊, 最后还是几个人各种查,搞了一周多才定位到原因.
    最后再吐槽下,没有root权限的普通账户真是不方便啊,有些工具只能安装在自己的目录下, 还有些好用的工具根本无权限运行,哎...

    作者回复: 嗯嗯,已经是很有经验的老手了😊

    大多数情况下 root 权限都是必须的,还是准备个root权限的环境实践吧

    2018-12-10
    2
    57
  • Linuxer
    经常听同事说大量的网络小包会导致性能问题,一直不太理解,从今天的课程来看,是不是大量的小网络包会导致频繁的硬中断和软中断呢?希望老师给予指点,谢谢

    作者回复: 正解

    2018-12-10
    34
  • ninuxer
    打卡,day10
    用外卖的例子,延伸到网卡的例子,非常形象,👍

    作者回复: 👍

    2018-12-10
    10
  • 每天晒白牙
    【D9打卡】
    主题:软中断
    中断:系统用来响应硬件设备请求的一种机制,会打断进程的正常调度和执行,通过调用内核中的中断处理程序来响应设备的请求。
    1.中断是一种异步的事件处理机制,能提高系统的并发处理能力
    2.为了减少对正常进程运行进行影响,中断处理程序需要尽快运行。
    3.中断分为上下两个部分
    (1)上部分用来快速处理中断,在中断禁止模式下,主要处理跟硬件紧密相关的或时间敏感的工作
    (2)下部分用来延迟处理上半部分未完成的工作,通常以内核线程的方式运行。
    小结:
    上半部分直接处理硬件请求,即硬中断,特点是快速执行
    下部分由内核触发,即软中断,特点是延迟执行
    软中断除了上面的下部分,还包括一些内核自定义的事件,如:内核调度 RCU锁 网络收发 定时等
    软中断内核线程的名字:ksoftirq/cpu编号
    4.proc文件系统是一种内核空间和用户空间进行通信的机制,可以同时用来查看内核的数据结构又能用了动态修改内核的配置,如:
    /proc/softirqs 提供软中断的运行情况
    /proc/interrupts 提供硬中断的运行情况

    作者回复: 👍

    2018-12-10
    9
  • Eric
    中断不是可以嵌套的吗?在中断处理程序中可以开中断以响应更高优先级的中断,为什么第二次中断会丢失?是指中断隐指令过程吗???
    2018-12-10
    8
  • 冷静
    中断不会丢失的,因为有中断控制器,它会pending住所有外部中断。除非pending住的那个中断,CPU还没来得及处理,这时又来了一个同样的中断,这个中断才会丢失。还有就是自linux-2.6.3x开始就完全不支持中断嵌套了。
    2019-01-13
    6
  • 好好学习
    期待第二篇,我有个业务48核心,怎么调整都是只用了前面24核心的软中断,期待更新
    2018-12-10
    3
  • 明明只有两个cpu ,请问老师为何会出现多个CPU呢?百度无果
    [root@master ~]# grep processor /proc/cpuinfo |wc -l
    2
    [root@master ~]# head -1 /proc/softirqs
                        CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11 CPU12 CPU13 CPU14 CPU15 CPU16 CPU17 CPU18 CPU19 CPU20 CPU21 CPU22 CPU23 CPU24 CPU25 CPU26 CPU27 CPU28 CPU29 CPU30 CPU31 CPU32 CPU33 CPU34 CPU35 CPU36 CPU37 CPU38 CPU39 CPU40 CPU41 CPU42 CPU43 CPU44 CPU45 CPU46 CPU47 CPU48 CPU49 CPU50 CPU51 CPU52 CPU53 CPU54 CPU55 CPU56 CPU57 CPU58 CPU59 CPU60 CPU61 CPU62 CPU63 CPU64 CPU65 CPU66 CPU67 CPU68 CPU69 CPU70 CPU71 CPU72 CPU73 CPU74 CPU75 CPU76 CPU77 CPU78 CPU79 CPU80 CPU81 CPU82 CPU83 CPU84 CPU85 CPU86 CPU87 CPU88 CPU89 CPU90 CPU91 CPU92 CPU93 CPU94 CPU95 CPU96 CPU97 CPU98 CPU99 CPU100 CPU101 CPU102 CPU103 CPU104 CPU105 CPU106 CPU107 CPU108 CPU109 CPU110 CPU111 CPU112 CPU113 CPU114 CPU115 CPU116 CPU117 CPU118 CPU119 CPU120 CPU121 CPU122 CPU123 CPU124 CPU125 CPU126 CPU127

    作者回复: 这是发行版的问题,忽略多余的就可以了

    2019-05-03
    1
    2
  • Glen
    留言里也有很多资深的同学啊

    作者回复: 😊

    2018-12-17
    2
  • Days
    而下半部以内核线程的方式执行,并且每个 CPU 都对应一个软中断内核线程,
    这里我觉得不是所有软中断直接被ksoftirqd处理,只有大量软中断产生,或者处理软终端超时才唤醒ksoftirqd线程
    2018-12-10
    2
  • Dym
    CPU软中断


    1、什么是中断

    中断表示我们请求操作硬件操作准备就绪了,例如从磁盘读取数据,我们知道CPU执行速度比磁盘执行速度快几个数量级,因此如果CPU每次check磁盘是否准备就绪了,那么系统的并发能力和性能会大大下降,但是采用中断方式,异步事件驱动方式来提升系统效率,首先会在驱动程序中嵌入中断程序,一旦磁盘准备就绪就会通过驱动程序发生一个中断请求操作,CPU立马停下手里的活来执行中断程序,该中断程序会从磁盘中读取数据到内存中。

    2、如何避免丢失其他中断请求


    一定要保证中断程序快速能处理,因为当CPU在处理中断时,是不能响应其他中断请求的,那么就会导致其他中断请求丢失


    举个取外卖的例子:我们在app上点外卖,但是这个外卖不知道什么时候到,因为送外卖小哥一旦到了目的地就会放下外卖就走,这个时候你就会一次又一次的check外卖是否到了,然而你什么时候也干不了,仅仅在来来回回看外卖是否到了,导致浪费你的时间。

    改进方式:如果换一种方式,你和外卖小哥约定一个通知方式,例如当外卖到了家门口小哥就打电话通知我,我就出去取外卖。 打电话就是一次中断请求,你就安心的干其他事情,静静等电话。 如果你点了两份外卖,当第一份外卖到了,小哥电话通知你,但是你在电话中沟通发票问题,这个时候第二份外卖到了另外一个小哥给你打电话发现占线,几次尝试后还是失败,这个时候外卖小哥就走了,导致丢失了这次外卖。

    解决:在电话中只回答好,然后沟通发票问题当面说,这个时候就可以接到另外小哥的电话。 所以中断请求分为两个阶段:

    第一阶段(上半部请求):接受硬件中断请求(从硬件中取完数据后发送一次软断请求,复杂逻辑交给下半部分请求,),称为硬中断,特点是处理速度快

    第二阶段(下半部请求): 内核线程接受到上半部分软中断请求,就会异步的继续执行上半部未完成的请求, 称为软中断,特点延迟执行

    举个网络接受数据例子:

    当网卡接收到数据时,首先会发送一个硬中断请求,这个时候CPU就会执行中断处理程序,快速将网卡中数据读取到内存中,完成后会发送一个软中断请求,下半部被软中断信号唤醒后就会按照网络协议栈将内存数据进行解析处理,最终递给应用程序。(处理期间还是可以响应其他硬中断请求的)

    3、查看硬中断和软中断运行情况



    可以查看 /proc/interrupts 和 /proc/softirq 文件




    2019-10-26
    1
  • 强子
    这才是工程派的
    2019-05-18
    1
  • MJ
    根据我的经验,网络包最小是64字节,加上20字节的帧头和帧尾,最小数据帧是84字节。文中出现的54字节,应该是网络包,但最小不是64字节吗?
    2019-03-26
    1
    1
  • hola
    我想问个问题,缺页中断有统计信息吗

    作者回复: ps 或者 pidstat 都可以

    2019-03-25
    1
  • 沙皮狗
    老师,有一点很疑惑。在《Linux内核设计与实现》一书中提到"在2.6以后的内核中提到,目前有三种方式实现中断下半部:工作队列,tasklet和软中断,软中断机制并不完全等同于中断下半部,很多人把所有下半部当成是软中断。"请问这部分怎么理解?麻烦老师解答一下

    作者回复: 这儿区分的更细了,tasklet 也是基于软中断的,而工作队列则是用于可以睡眠的下半部处理过程

    2019-03-08
    1
  • 涛涛
    倪老师是不是总吃外卖。

    作者回复: 吃外卖露馅了😊

    2018-12-26
    1
  • 如果
    DAY9,打卡
    2018-12-16
    1
  • 小老鼠
    软中断时间太长会不会影响性能

    作者回复: 会的

    2018-12-12
    1
  • 西果果树
    # cat /proc/softirqs
                        CPU0
              HI: 1
           TIMER: 52670170
          NET_TX: 9
          NET_RX: 4737439
           BLOCK: 557149
    BLOCK_IOPOLL: 0
         TASKLET: 16
           SCHED: 0
         HRTIMER: 0
             RCU: 32239865
    这样的情况,是存在问题吗?

    作者回复: 没问题,这是只有一个CPU

    2018-12-11
    1
  • Leon📷
    老师,我开发了一个日志搜集系统,上面需要压测,但是我不知道要测试哪些性能指标,这个应用的性能指标和优化和压测后面的课程会讲吗

    作者回复: 可以从两个方面考虑,一个是应用的指标,比如吞吐量、响应时间等等,另外一个是系统的资源使用情况,比如CPU、I/O等等。

    性能的优化方法和基准测试会讲的。

    2018-12-11
    1
收起评论
76
返回
顶部