Linux性能优化实战
倪朋飞
微软资深工程师,Kubernetes项目维护者
立即订阅
23066 人已学习
课程目录
已完结 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性能优化实战
登录|注册

33 | 关于 Linux 网络,你必须知道这些(上)

倪朋飞 2019-02-06
你好,我是倪朋飞。
前几节,我们一起学习了文件系统和磁盘 I/O 的工作原理,以及相应的性能分析和优化方法。接下来,我们将进入下一个重要模块—— Linux 的网络子系统。
由于网络处理的流程最复杂,跟我们前面讲到的进程调度、中断处理、内存管理以及 I/O 等都密不可分,所以,我把网络模块作为最后一个资源模块来讲解。
同 CPU、内存以及 I/O 一样,网络也是 Linux 系统最核心的功能。网络是一种把不同计算机或网络设备连接到一起的技术,它本质上是一种进程间通信方式,特别是跨系统的进程间通信,必须要通过网络才能进行。随着高并发、分布式、云计算、微服务等技术的普及,网络的性能也变得越来越重要。
那么,Linux 网络又是怎么工作的呢?又有哪些指标衡量网络的性能呢?接下来的两篇文章,我将带你一起学习 Linux 网络的工作原理和性能指标。

网络模型

说到网络,我想你肯定经常提起七层负载均衡、四层负载均衡,或者三层设备、二层设备等等。那么,这里说的二层、三层、四层、七层又都是什么意思呢?
实际上,这些层都来自国际标准化组织制定的开放式系统互联通信参考模型(Open System Interconnection Reference Model),简称为 OSI 网络模型。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Linux性能优化实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(30)

  • 渡渡鸟_linux
    我结合网络上查阅的资料和文章中的内容,总结了下网卡收发报文的过程,不知道是否正确:
    1. 内核分配一个主内存地址段(DMA缓冲区),网卡设备可以在DMA缓冲区中读写数据
    2. 当来了一个网络包,网卡将网络包写入DMA缓冲区,写完后通知CPU产生硬中断
    3. 硬中断处理程序锁定当前DMA缓冲区,然后将网络包拷贝到另一块内存区,清空并解锁当前DMA缓冲区,然后通知软中断去处理网络包。
    -----
    当发送数据包时,与上述相反。链路层将数据包封装完毕后,放入网卡的DMA缓冲区,并调用系统硬中断,通知网卡从缓冲区读取并发送数据。

    作者回复: 对的

    2019-03-07
    1
    18
  • 安排
    当一个网络帧到达网卡后,网卡会通过 DMA 方式,把这个网络包放到收包队列中;然后通过硬中断,告诉中断处理程序已经收到了网络包。

    接着,网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中;然后再通过软中断,通知内核收到了新的网络帧。

    接下来,内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处理这个网络帧。



    老师你好,上面的一段话有些疑问想请教一下。

    收包队列是属于哪里的存储空间,是属于物理内存吗,还是网卡中的存储空间,通过dma方式把数据放到收包队列,我猜这个收包队列是物理内存中的空间。这个收包队列是由内核管理的吧,也就是跟某一个进程的用户空间地址没关系?

    那sk_buf缓冲区又是哪里的存储空间,为什么还要把收包队列拷贝到这个缓冲区呢,这个缓冲区是协议栈维护的吗?也属于内核,跟进程的用户空间地址有关系吗?


    socket的接收发送缓冲区是映射到进程的用户空间地址的吗?还是由协议栈为每个socket在内核中维护的缓冲区?

    还有上面说到的这些缓冲区跟cache和buf有什么关系?会被回收吗?


    内核协议栈的运行是通过一个内核线程的方式来运行的吗?是否可以看到这个线程的名字?

    作者回复: 问题比较多,放到答疑篇里面统一回复吧

    2019-02-26
    12
  • Dale
    网络报文传需要在用户态和内核态来回切换,导致性能下降。业界使用零拷贝或intel的dpdk来提高性能。
    2019-02-12
    1
    9
  • Geek_00d753
    收数据的时候,从网卡到应用层socket。需要一次硬中断+一次软中断。
    发数据的时候只需要一次软中断。
    是这样吗?老师
    2019-03-22
    1
    2
  • ninuxer
    打卡day35
    有一次业务反馈有些请求无法正常响应,后来花了两天时间才发现ifconfig看网卡的drop的包不断增长,后来发现是跟开启了内核的timestamp参数有关
    2019-02-13
    2
  • 空空
    老师过年好!
    曾经在Linux3.10测试netlink收发包效率,发现一个问题,正常情况下每收一个包大概需要10us,但是每隔8秒会出现一次收包时间30-50ms,就是因为固定间隔8秒会出现一次收包时间过长,导致收包效率降低。请教一下老师每隔8秒系统会做什么?或者是因为什么系统配置?希望老师解答一下疑惑,谢谢!

    作者回复: 这个不好说,后面有讲到延迟增大的分析思路,到时候可以分析看看

    2019-02-08
    1
    2
  • 老师您好,请问最后一张图下方的两个大圈圈代表的是什么意思,是代表loop吗

    作者回复: ring buffer

    2019-02-06
    2
  • Geek_25565b
    老师好,netstat 执行一次 Recv-Q 和Send-Q 有值就说明堆积吗?还是用watch 看变化情况确定堆积?
    2019-08-02
    1
  • 空白
    一直不太理解,网络包是如何具体交付给对应的线程的?

    作者回复: 系统调用

    2019-07-14
    1
  • 学而不思则罔
    老师好,一直不太明白skb_buff和sk_buff的区别,这两者有关系吗

    作者回复: sk_buff一般是说内核数据接口,而 skb则是套接字缓存(socket buffer)

    2019-04-10
    1
  • 胡鹏
    我所知道的网络问题,就是服务器被ddos攻击,小规模,可以防,,,大规模防不了

    作者回复: 是的,大规模必须要专业的网络设备来抗

    2019-03-20
    1
  • 张挺
    您好,请问,数据从网卡到应用程序或者应用程序到网卡,都会同时触发硬中断和软中断吗?
    2019-03-20
    1
  • 饼子
    遇到了程序分配大量链接,占用完程序最大打开文件数量,使用lsof 查看分析的

    作者回复: 嗯嗯,文件数量或者连接数量都可以看到

    2019-02-20
    1
  • 玉剑冰锋
    您好老师,IP包分片,一个IP包分成多个分片,是如何保证接收方收一个完整的数据包的?

    作者回复: 根据 MTU 分片,分片里面会包含分片信息,所以接收后还可以组合起来。

    2019-02-15
    1
  • 夜空中最亮的星(华仔)
    新年好,给老师拜个晚年,过年的课都落下了,抓紧时间赶上来。

    作者回复: 谢谢,新春快乐!

    2019-02-14
    1
  • 使用InfiniBand网卡和InfiniBand交换机的时候, mtu如果配置65520的时候,通过http下载对象存储小文件比较慢,但是配置9000的时候大小文件都比较快。https://github.com/antirez/redis/issues/2385 Redis works very slow with MTU higher than packet size. 请问老师是什么原因

    作者回复: MTU大小的问题都是分片和重组导致的。后面有案例讲到分析内核中网络协议栈的行为,你可以到时候试着分析下这种场景

    2019-02-13
    1
  • 陈云卿
    系统出口带宽被打满,导致大量请求超时

    作者回复: DDoS 😊

    2019-02-06
    1
  • Penn
    中断不均,连接跟踪打满

    作者回复: 嗯 这是最常见的两个问题

    2019-02-06
    1
  • sTone
    根据tcp网络模型的封装方式, 网络接口层mac地址, 但是internet是ip寻址, 难道每次接到网络包都要拆分到网络层找到对应的ip地址, 然后再决定下一步? 是不是先mac寻址再op寻址?
    2019-06-08
  • 悟空
    打卡
    2019-06-07
收起评论
30
返回
顶部