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性能优化实战
登录|注册

44 | 套路篇:网络性能优化的几个思路(下)

倪朋飞 2019-03-04
你好,我是倪朋飞。
上一节,我们学了网络性能优化的几个思路,我先带你简单复习一下。
在优化网络的性能时,你可以结合 Linux 系统的网络协议栈和网络收发流程,然后从应用程序、套接字、传输层、网络层再到链路层等每个层次,进行逐层优化。上一期我们主要学习了应用程序和套接字的优化思路,比如:
在应用程序中,主要优化 I/O 模型、工作模型以及应用层的网络协议;
在套接字层中,主要优化套接字的缓冲区大小。
今天,我们顺着 TCP/IP 网络模型,继续向下,看看如何从传输层、网络层以及链路层中,优化 Linux 网络性能。

网络性能优化

传输层

传输层最重要的是 TCP 和 UDP 协议,所以这儿的优化,其实主要就是对这两种协议的优化。
我们首先来看 TCP 协议的优化。
TCP 提供了面向连接的可靠传输服务。要优化 TCP,我们首先要掌握 TCP 协议的基本原理,比如流量控制、慢启动、拥塞避免、延迟确认以及状态流图(如下图所示)等。
关于这些原理的细节,我就不再展开讲解了。如果你还没有完全掌握,建议你先学完这些基本原理后再来优化,而不是囫囵吞枣地乱抄乱试。
掌握这些原理后,你就可以在不破坏 TCP 正常工作的基础上,对它进行优化。下面,我分几类情况详细说明。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Linux性能优化实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(24)

  • 我来也
    [D44打卡]
    这个优化套路很全面,值得好好收藏.
    根据TCP/IP的网络模型 从四层协议中的下面三层:传输、网络、链路层,逐步分析每层的优化方法。

    以前知道的只有些浅显的:
    一个MTU通常在1500字节
    增加最大文件描述符的数量:ulimit -n xxxx
    减少TIME_WAIT状态的时间 让系统尽快释放
    真大TIME_WAIT状态的连接数

    以前的都是遇到一个,谷歌一个. 也没见谁有这么全面的优化思路.
    在不知道所以然的情况下,还很可能会出现返优化的情况.哈哈.

    虽然目前工作中还暂时用不上那么多高大上的优化方法,但有了个印象,以后遇到了再来复习也是极好的。
    2019-03-04
    7
  • C.C
    timewait的优化:
    timewait是由主动的一方主动关闭的,我认为应用层最好能够池化这些连接,而不是直接关闭这些链接; 另外,比如对于http有些场景的请求,对于需要关闭链接的情况,多个数据请求最好合并发送,也可以减少timewait的情况. 一半来说,我觉得一个服务器上有1W个左右的timewait的链接还是比较正常的.
    keepAlive,对于长连接的场景,我觉得tcp层是最好不要开. 因为1.tcp默认是7200秒,需要通过更改内核的方式,不知道在何种情况下是合适的. 2:长连接的情况下,应用层也是需要心跳检查的,这个时候tcp层开keepalive话,反而是中浪费.
    tcp层和应用层的网络优化,除了 tcp/ip详解卷一,有一本 effective Tcp/ip programming 也是不错的

    作者回复: 嗯嗯,总结的不错👍

    2019-04-02
    5
  • Adam
    老师,nr_open应该是单个进程可分配的最大文件数,file_max才是系统级别的?

    作者回复: 嗯嗯,是的,谢谢指出

    2019-03-11
    2
  • zhchnchn
    老师,有个疑问,从“王亮”的留言中看到,`net.ipv4.tcp_fin_timeout`这个参数决定了它保持在`FIN-WAIT-2`状态的时间,那它怎么又可以“缩短处于TIME_WAIT状态的超时时间”(老师总结的图中)呢?

    作者回复: 谢谢指出,文中不太准确,net.ipv4.tcp_fin_timeout实际上是从TIME_WAIT_2到TIME_WAIT的超时时间,而 TIME_WAIT状态的超时时间是固定的 2MSL(也就是60s)。

    2019-06-28
    1
  • 渐行渐远
    关于tcp这块有个关于开启时间戳的验证 参数为tcp_timestamps,有nat环境千万不要打开,可以通过cat /proc/sys/net/ipv4/tcp_timestamps 是否开启

    作者回复: 嗯 是的

    2019-03-28
    1
    1
  • 夜空中最亮的星(华仔)
    越来越期待后面的课了
    2019-03-05
    1
  • xfan
    打卡,学习本章,知道了使用调节内核网络参数,使用网卡特性,来调节个层性能,受益,感谢老师
    2019-03-05
    1
  • ninuxer
    打卡day46
    基础不牢,地动山摇,一些网络的概念没理解,消化起来比较费力~
    2019-03-04
    1
  • Abu
    在网卡支持RSS时,还需要用RPS或者RFS吗?请老师指教
    2019-10-26
  • QJT
    对于nginx,我看网上大量的文章都说应该设置 tcp_max_tw_buckets=5000,但您推荐的是一个很大的值,能解释一下吗?谢谢!
    2019-10-16
  • hola
    老师,linux里面的这个变量net.ipv4.tcp_fin_timeout 到底指代的是什么意义呢。
    tcp详解第一卷里面,
    说time_wait的等待时间由这个变量记录
    然后说 FIN_WAIT_2状态的等待时间也由这个变量记录
    然后有些博客说,其实time_wait状态的超时时间,并没有读取这个变量,而是由代码中宏定义的。
    有点懵逼
    2019-07-29
    1
  • 峰回
    老师,您好,系统中发现大量closed连接,应该优化哪些参数。
    2019-06-18
  • 王亮
    net.ipv4.tcp_fin_timeout 应该是表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间吧?

    作者回复: 是的

    2019-05-08
  • Joe
    好的
    2019-05-03
  • 王伟
    打卡
    2019-04-28
  • ulimit -n : open files (-n) 1024 这个跟 fs.nr_open = 1048576 是一个意思吗?

    作者回复: 一个意思但作用范围不一样,fs.nr_open对应单个进程,ulimit设置用户当前会话

    2019-04-28
  • Maxwell
    优化思路总结是挺好的,但是毕竟缺少实践,如果不实践,很快就会忘记!

    作者回复: 嗯嗯,多实践几次就记住了

    2019-03-27
  • Maxwell
    TCP优化,内核选项参数怎么修改呢?在哪修改呢?

    作者回复: 临时修改使用sysctl,持久化写入文件/etc/sysctl.conf

    2019-03-27
  • honnkyou
    "增大本地端口的范围 net.ipv4.ip_local_port_range 。"这个优化手段不是很理解,服务器端通常不都是监听某个端口嘛,为什么说增大本地端口范围会优化呢?

    作者回复: 监听的端口通常是一个,但服务器程序还可能会通过网络去连接其他服务,这时候它又是一个客户端了

    2019-03-20
  • 明翼
    老师,您好,我在今天生产环境发现一个问题想请教下,同事反馈es的集群的索引速度过慢,我去集群上看了下,从表面看来,内存、cpu、网络、磁盘各方面指标都还可以,都不高。
    操作系统为Centos,版本信息:Linux lc-gwrz-es25 3.10.0-693.el7.x86_64 #1 SMP Thu Jul 6 19:56:57 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux
    在dmesg去查看系统日志的时候,发现几乎每隔1-2s就有网卡重启的日志:
    [12528931.704091] ixgbe 0000:01:00.0 em1: NIC Link is Up 10 Gbps, Flow Control: RX/TX
    [12528933.478267] ixgbe 0000:01:00.0 em1: NIC Link is Down
    [12528933.908089] ixgbe 0000:01:00.0 em1: NIC Link is Up 10 Gbps, Flow Control: RX/TX
    [12528936.420314] ixgbe 0000:01:00.0 em1: NIC Link is Down
    [12528938.116022] ixgbe 0000:01:00.0 em1: NIC Link is Up 10 Gbps, Flow Control: RX/TX
    [12528948.595812] ixgbe 0000:01:00.0 em1: NIC Link is Down
    [12528950.439906] ixgbe 0000:01:00.0 em1: NIC Link is Up 10 Gbps, Flow Control: RX/TX
    [12528951.949896] ixgbe 0000:01:00.0 em1: NIC Link is Down
    [12528952.643856] ixgbe 0000:01:00.0 em1: NIC Link is Up 10 Gbps, Flow Control: RX/TX
    [12528953.305133] ixgbe 0000:01:00.0 em1: NIC Link is Down
    [12528954.847848] ixgbe 0000:01:00.0 em1: NIC Link is Up 10 Gbps, Flow Control: RX/TX
    [12528980.928031] ixgbe 0000:01:00.0 em1: NIC Link is Down
    [12528981.199552] ixgbe 0000:01:00.0 em1: NIC Link is Up 10 Gbps, Flow Control: RX/TX


    另外查看了下这个网卡的信息:
    em1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
            ether 22:14:5b:e1:3e:2a txqueuelen 1000 (Ethernet)
            RX packets 29473048069 bytes 29538551685381 (26.8 TiB)
            RX errors 755381927 dropped 0 overruns 0 frame 755381927
            TX packets 16901640311 bytes 17050517754286 (15.5 TiB)
            TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
     RX errors的数量有点多,通过es的日志来看,这台机器确实和其他主机的连接时常会超时,奇怪的是,对es的其他节点执行ping命令又能够在0.1ms内返回。我看了下网卡,网卡采用team绑定的方式,
    TEAM_CONFIG="{\"runner\": {\"name\": \"lacp\"}}"。
    请教下:1)为什么网络有问题,我ping显示正常;;2)这种可能是什么原因引起的。

    作者回复: 以前碰到过类似的问题,是网卡驱动到导致的,可以到驱动网站看看有没有类似的错误修复

    2019-03-18
收起评论
24
返回
顶部