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

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

禁止广播 ICMP
禁止 ICMP 协议
调整 MTU 大小
开启反向地址校验
调整 TTL
开启 IP 转发
调整 UDP 数据包大小
增大本地端口号范围
增大套接字缓冲区大小
优化 Keepalive
缓解 SYN FLOOD
处理 TIME_WAIT 状态连接
使用 XDP 技术
使用 DPDK 技术
网络接口优化
网卡功能卸载
中断处理程序调度
ICMP 优化
分片调优
路由和转发优化
UDP 协议优化
TCP 协议优化
优化缓冲区大小
优化应用层网络协议
优化工作模型
优化 I/O 模型
极限场景优化
链路层
网络层
传输层
套接字
应用程序
网络性能优化

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

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

网络性能优化

传输层

传输层最重要的是 TCP 和 UDP 协议,所以这儿的优化,其实主要就是对这两种协议的优化。
我们首先来看 TCP 协议的优化。
TCP 提供了面向连接的可靠传输服务。要优化 TCP,我们首先要掌握 TCP 协议的基本原理,比如流量控制、慢启动、拥塞避免、延迟确认以及状态流图(如下图所示)等。
关于这些原理的细节,我就不再展开讲解了。如果你还没有完全掌握,建议你先学完这些基本原理后再来优化,而不是囫囵吞枣地乱抄乱试。
掌握这些原理后,你就可以在不破坏 TCP 正常工作的基础上,对它进行优化。下面,我分几类情况详细说明。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了网络性能优化的重要性及方法。从传输层、网络层和链路层多个层次出发,提出了针对 TCP 和 UDP 协议的优化方法。在传输层,包括处理处于 TIME_WAIT 状态的连接、缓解 SYN FLOOD 引发的性能问题以及优化 Keepalive 相关的内核选项。对于 UDP 协议,主要包括增大套接字缓冲区大小、调整本地端口号范围以及根据 MTU 大小调整 UDP 数据包的大小。在网络层,建议从路由和转发角度开启 IP 转发、调整数据包的生存周期 TTL,以及开启数据包的反向地址校验。此外,还需要注意调整 MTU 大小以适应叠加网络技术的影响,并通过内核选项限制 ICMP 的行为以避免各种网络问题。在链路层,提出了多种优化方法,包括优化中断处理程序、功能卸载到网卡中、多队列接收等。最后,文章还提到了极限场景下的优化方式,包括使用 DPDK 技术和 XDP 技术。总的来说,本文详细介绍了网络性能优化的方法,为读者提供了全面的优化思路和技术手段。

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

全部留言(29)

  • 最新
  • 精选
  • 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
    22
  • 橙汁
    关于tcp这块有个关于开启时间戳的验证 参数为tcp_timestamps,有nat环境千万不要打开,可以通过cat /proc/sys/net/ipv4/tcp_timestamps 是否开启

    作者回复: 嗯 是的

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

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

    2019-03-11
    6
  • 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
    3
    4
  • Maxwell
    TCP优化,内核选项参数怎么修改呢?在哪修改呢?

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

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

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

    2019-03-20
    2
  • ulimit -n : open files (-n) 1024 这个跟 fs.nr_open = 1048576 是一个意思吗?

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

    2019-04-28
    1
  • 明翼
    老师,您好,我在今天生产环境发现一个问题想请教下,同事反馈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
    1
  • hola
    我来请教了,今天服务器发现这个,软中断NET_RX为什么这么不均衡,是否意味着什么问题? [root]# watch -d cat /proc/softirqs Every 2.0s: cat /proc/softirqs Fri Mar 8 22:34:25 2019 CPU0 CPU1 CPU2 CPU3 HI: 4 1 0 1 TIMER: 713624971 755107323 712371160 933839267 NET_TX: 2 1 3 81 NET_RX: 16219 17426 17488 1270269922 BLOCK: 0 0 0 0 BLOCK_IOPOLL: 0 0 0 0 TASKLET: 5647 9600 8682 14476 SCHED: 535200439 484313787 449453690 603342848 HRTIMER: 0 0 0 0 RCU: 206853385 237158342 227458167 255373399

    作者回复: 可能是没有配置中断负载均衡,或者配置的时候配错了,绑定到了最后一个CPU

    2019-03-08
    1
  • 王灯武
    老师,您好!提一个与本篇无关的系统故障,最近几天经常出现tomcat进程自动消失,之前碰到的一种是因为ssh连接上去,然后执行bin/startup.sh | tail logs/catalina.out这样的命令启动并查看启动日志,这种启动方式在ssh连接断开的瞬间,会因为父子进程的关系,父进程(sshd)退出,所以tomcat进程也跟着自动退出了。这种异常退出有两个特点:1、会在/var/log/secure日志中看到Mar 5 16:40:36 host-10-234-8-172 su: pam_unix(su:session): session closed for user test这样的日志,这个session closed时间点跟tomcat进程退出的时间点是一样的。2、tomcat的catalina.out日志中会有平滑关闭退出的日志。 但是最近的故障没有上面两个特点,dmesg日志或/var/log/messages日志中也没有oom killer之类的错误信息。目前分析没什么头绪了,老师看看是否遇到过类似问题,或者有什么分析思路,谢谢!

    作者回复: 推荐使用进程管理工具(比如 systemd)管理服务,不要直接在SSH中启动

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