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

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

套接字优化
应用程序优化
网络性能优化
网络性能工具
确定优化目标
网络性能优化的思路

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

你好,我是倪朋飞。
上一节,我们了解了 NAT(网络地址转换)的原理,学会了如何排查 NAT 带来的性能问题,最后还总结了 NAT 性能优化的基本思路。我先带你简单回顾一下。
NAT 基于 Linux 内核的连接跟踪机制,实现了 IP 地址及端口号重写的功能,主要被用来解决公网 IP 地址短缺的问题。
在分析 NAT 性能问题时,可以先从内核连接跟踪模块 conntrack 角度来分析,比如用 systemtap、perf、netstat 等工具,以及 proc 文件系统中的内核选项,来分析网络协议栈的行为;然后,通过内核选项调优、切换到无状态 NAT、使用 DPDK 等方式,进行实际优化。
通过前面的学习,你应该已经体会到,网络问题比我们前面学过的 CPU、内存或磁盘 I/O 都要复杂。无论是应用层的各种 I/O 模型,冗长的网络协议栈和众多的内核选项,抑或是各种复杂的网络环境,都提高了网络的复杂性。
不过,也不要过分担心,只要你掌握了 Linux 网络的基本原理和常见网络协议的工作流程,再结合各个网络层的性能指标来分析,你会发现,定位网络瓶颈并不难。
找到网络性能瓶颈后,下一步要做的就是优化了,也就是如何降低网络延迟,并提高网络的吞吐量。学完相关原理和案例后,我就来讲讲,优化网络性能问题的思路和一些注意事项。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了网络性能优化的方法和思路,重点包括确定优化目标、网络性能工具和网络性能优化。首先,强调了确定优化目标的重要性,指出不同应用中的性能指标优化标准可能会不同,需要进行基准测试以明确优化的标准。其次,介绍了网络性能工具的使用,帮助读者理解和记忆网络相关的性能工具。最后,从应用程序、套接字、传输层、网络层以及链路层等几个角度,分别阐述了网络性能优化的基本思路,包括对网络 I/O 和进程自身的工作模型的优化,以及应用层的网络协议优化方法。整体而言,本文通过系统性的介绍和分析,为读者提供了网络性能优化的基本思路和工具,有助于读者快速了解网络性能优化的相关知识。

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

全部留言(29)

  • 最新
  • 精选
  • allan
    老师,您好,问一下 套接字接收发送缓冲区和TCP接收发送缓冲区,是相同的吗?我的理解这两个应该是相同的缓冲区,只是套接字选项的设置是针对单个套接字,而对 TCP接收发送缓冲区的设置,针对的是 全局的所有套接字 ,是这样理解吗?请老师指教。

    作者回复: 是的,内核选项的范围是全局的,套接字接口里面设置的是单个

    2019-03-30
    4
    14
  • 耿长学
    老师,我想咨询下tcp_mem满了如何排查,tcp_mem满了之后新的连接进不来,dmesg看到有tcp_mem:out of mem的提示

    作者回复: cat /proc/sys/net/ipv4/tcp_mem 查看配置 cat /proc/net/sockstat 查看当前tcp的统计 然后可以通过 sysctl -w net.ipv4.tcp_mem=新配置 来增大

    2019-07-20
    13
  • 明翼
    跟上了,但是看的有点粗,这个系列我要多看几遍,性能问题无非CPU 内存 IO 网络,感谢老师的课程,对这类问题心理有底了,很喜欢去挑战问题了😁好想加老师微信,大神可以不😳

    作者回复: 我们专栏有个微信群可以加入

    2019-03-01
    7
    6
  • 腾达
    tcp_rmem、 tcp_wmem以及其他几个所对应的缓冲区的使用情况,有工具可以查看吗? 像类似“watch -d cat /proc/softirqs” 这样可以观察到缓冲区的变化。另外有图形界面工具吗?查看套接字缓冲区、TCP缓冲区大小变化的图形工具? 另外再问一下,套接字缓冲区、TCP缓冲区 这2个有什么区别吗?

    作者回复: 可以通过 /proc/net/sockstat、ss 这些工具来查看。图形界面也有很多,不过一般都是内置在监控系统里面,通过 Web 的方式来展示。比如 zabbix、Nagios等等

    2019-03-01
    5
  • xfan
    老师,我是用bpftools生成了一个过滤规则的字节码bytecode,bpfgen dns -- *.www.example.uk,这个规则怎么样加到网卡驱动上去呢,就是怎么安装到 linux18.04 上去呢.我知道load_bpf_file 这个方法,但是我在哪调用呢,老师给我一个思路,我想自己实现一套关于动态使用XDP拦截包的项目

    作者回复: 可以去参考一下XDP的文档https://prototype-kernel.readthedocs.io/en/latest/networking/XDP/index.html

    2019-03-02
    3
  • J!
    对于kill -9 进程这样的情况,已建立的tcp连接如何处理,还是由操作系统主动回收?

    作者回复: 系统会回收掉

    2019-03-03
    2
  • 科学Jia
    老师,想问问您:现在我遇到应用程序在负载测试中可能处理速度慢造成了消息响应延迟,我该用什么方法或者工具去查看这个应用程序里每个方法的时间调用?像perf这个工具可以看每个调用方法的cpu利用率一样?

    作者回复: 实际上没有通用的方法,uprobe应该是可以用的,不过使用起来还是比较麻烦的。推荐的做法是在应用内部提供metrics 接口,这个接口内部统计每个方法的调用情况。

    2019-03-01
    2
  • cliff(亮剑)
    老师好, 说实在,学了两边还是不明白如下数据之间的关系: SO_RCVBUFF, net/core/optmem_max, net/core/rmem_max, net/ipv4/tcp_rmem 和net/ipv4/tcp_mem 比如有如下的测试环境: 1)服务器端: 应用程序开了10个tcp服务器socket,每个设置10K SO_RCVBUFF 设置系统参数如下: net/core/optmem_max = 10K net/core/rmem_max =100K net/ipv4/tcp_rmem 4k 16K 80K net/ipv4/tcp_mem 40K 50K 120K 2)客户端轮流发送TCP消息给服务器: 那假设服务器的应用忙, 所有10个TCP的buffer能缓存100K的TCP数据么? 如果不能, 如何调整系统参数可以满足缓存100K的数据? 先谢谢老师

    作者回复: 内核配置选项是全局的,对所有socket生效;系统调用针对的是单个socket,他们的总和受限于内核配置

    2019-03-10
    1
  • 怀特
    我之前做过一个优化项目。该项目需要实现一个C/S结构的程序,发送URL给服务器,服务器返回URL的类别,比如属于军事,还是属于体育。 当时在局域网环境下,性能较差,我经过分析之后,“感觉“瓶颈在网络,是因为每个包的有效负载太小,所以改进策略是将多个url拼接在一起再发送出去,然后解析返回的结果给每个url。拼接过程和解析过程都是我自己实现的。 听了倪工的讲座,再回顾当时的实现,能看到当时的不足:我找到了问题的症结所在,但却用了很笨的实现方法来改进。貌似在套接字层增加TCP_CORE,然后在应用程序层将处理改为异步非阻塞的,就可以了吧? 收获颇多,谢谢倪工。

    作者回复: 不一定非要异步,但非阻塞、epoll 是比较通用的网络性能优化方法

    2019-03-01
    1
  • tinsang
    你好 项目里发现个问题,服务器centos6.5开启tcp服务,客户端每秒100个请求,发现io负载偏高,当前服务端只是接收请求计算 ,cpu使用率也很低,请问如何去定位问题呢

    作者回复: 请参考I/O模块排查IO问题

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