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

41 | 案例篇:如何优化 NAT 性能?(上)

倪朋飞 2019-02-25
你好,我是倪朋飞。
上一节,我们探究了网络延迟增大问题的分析方法,并通过一个案例,掌握了如何用 hping3、tcpdump、Wireshark、strace 等工具,来排查和定位问题的根源。
简单回顾一下,网络延迟是最核心的网络性能指标。由于网络传输、网络包处理等各种因素的影响,网络延迟不可避免。但过大的网络延迟,会直接影响用户的体验。
所以,在发现网络延迟增大的情况后,你可以先从路由、网络包的收发、网络包的处理,再到应用程序等,从各个层级分析网络延迟,等到找出网络延迟的来源层级后,再深入定位瓶颈所在。
今天,我再带你来看看,另一个可能导致网络延迟的因素,即网络地址转换(Network Address Translation),缩写为 NAT。
接下来,我们先来学习 NAT 的工作原理,并弄清楚如何优化 NAT 带来的潜在性能问题。

NAT 原理

NAT 技术可以重写 IP 数据包的源 IP 或者目的 IP,被普遍地用来解决公网 IP 地址短缺的问题。它的主要原理就是,网络中的多台主机,通过共享同一个公网 IP 地址,来访问外网资源。同时,由于 NAT 屏蔽了内网网络,自然也就为局域网中的机器提供了安全隔离。
你既可以在支持网络地址转换的路由器(称为 NAT 网关)中配置 NAT,也可以在 Linux 服务器中配置 NAT。如果采用第二种方式,Linux 服务器实际上充当的是“软”路由器的角色。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Linux性能优化实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(21)

  • 我来也
    [D41打卡]
    在已有的项目经验中,还未涉及到过NAT.
    倒是本地的虚拟机环境下,或者路由器上,会看到nat相关选项.

    问题一:当多个内网 IP 地址的端口号相同时,MASQUERADE 还可以正常工作吗?
    我觉得是可以正常工作的,要不然就不会允许设置ip地址段了.😁[纯属猜测哈]
    在路由器上做端口映射时,一个外网端口只能对应一个内网的IP.
    但是反方向,nat在转换源地址时,应该会记录原来的连接信息吧.要不然收到包该给谁发呢.

    问题二:如果内网 IP 地址数量或请求数比较多,这种方式有没有什么隐患呢?
    根据之前的经验,在请求数过多时,会导致CPU软中断上升.
    再谷歌了下,有看到说:
    iptables的conntrack表满了导致访问网站很慢.[https://my.oschina.net/jean/blog/189935]
        ```kernel 用 ip_conntrack 模块来记录 iptables 网络包的状态,并保存到 table 里(这个 table 在内存里),如果网络状况繁忙,比如高连接,高并发连接等会导致逐步占用这个 table 可用空间。```

    优化Linux NAT网关[https://tech.youzan.com/linux_nat/]
        ```net.netfilter.nfconntrackbuckets 这个参数,默认有点小,连接数多了以后,势必造成“哈希冲突”增加,“哈希处理”性能下降。( 是这样吗?)```

    作者回复: 👍两个回答都是正确的,第二个还不完整,可以再考虑深入一点(提示:还有其他很多内核资源限制)

    2019-02-25
    4
  • 青石
    问题1:Linux的NAT时给予内核的连接跟踪模块实现,保留了源IP、源端口、目的IP、目的端口之间的关系,多个内网IP地址的端口相同,但是IP不同,再nf_conntrack中对应不同的记录,所以MASQUERADE可以正常工作。

    问题2:NAT方式所有流量都要经过NAT服务器,所以NAT服务器本身的软中断导致CPU负载、网络流量、文件句柄、端口号上限、nf_conntrack table full都可能是性能瓶颈。
    2019-03-19
    3
  • 腾达
    大伙儿都掉队了吗?有深度的问题留言越来越少,有价值的问题回答也少了。

    作者回复: 嗯,有深度的留言还是前面多一些

    2019-02-25
    2
  • Darrykinger.com
    http://www.apelearn.com/study_v2/chapter16.html#id3 这个链接是我初次接触linux的时候学习的课程,对小白蛮友好
    2019-09-06
    1
  • wwj
    nat的三种类型有什么本质的区别、和链接追踪的联系有是什么

    作者回复: 主要是管理方式的区别,比如静态肯定比动态管理要简单的多;跟连接跟踪没有直接关系(只是Linux使用了连接跟踪)。

    2019-02-28
    1
  • ninuxer
    打卡day43
    工作场景没用到nat,基本都是基于4层或7层的反代
    针对第一个问题,是可以的,第二个问题不可以,我认为是有连接追踪表,文件数量,端口数量的限制

    作者回复: 嗯

    2019-02-27
    1
  • Maxwell
    vmware中虚拟机网络选择NAT模式后,IP地址经常变动,有什么方法解决么?

    作者回复: VM里面可以配置固定IP,或者也可以换其他模式

    2019-02-25
    1
  • Darrykinger.com
    以前在学习linux的时候,自己搭建过linux的下的nginx的负载均衡, 内网的处理后的结果转发,记得好想负载均衡和高可用,具体哪一个忘记了,工作的时候用过一次,将内网服务器处理请求后转发给那个可以上外网的服务器,然后返回给外网。。。本节有有好几个陌生的名词。。
    2019-09-06
  • Darrykinger.com
    1)iptalbes的三个表

    filter 这个表主要用于过滤包的,是系统预设的表,这个表也是阿铭用的最多的。内建三个链INPUT、OUTPUT以及FORWARD。INPUT作用于进入本机的包;OUTPUT作用于本机送出的包;FORWARD作用于那些跟本机无关的包。

    nat 主要用处是网络地址转换,也有三个链。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话。OUTPUT链改变本地产生的包的目的地址。POSTROUTING链在包就要离开防火墙之前改变其源地址。该表阿铭用的不多,但有时候会用到。

    mangle 这个表主要是用于给数据包打标记,然后根据标记去操作哪些包。这个表几乎不怎么用。除非你想成为一个高级网络工程师,否则你就没有必要花费很多心思在它上面。
    2019-09-06
  • 陳先森
    第一个问题是可以的,外网端口映射内网端口是一对多。就跟之前老师留言的一样,服务端对端口没有65535个端口限制但是客户端有。
    第二个问题会有隐患,请求数量多的时候会导致软路由服务器的资源和性能下降,甚至延时和超时都有可能以至于达到系统资源的瓶颈系统的软连接数达到瓶颈或者无法正常工作

    作者回复: 👍

    2019-04-29
  • Geek_96e358
    问题1:
    可以, MASQUERADE 主要用内部多个IP公用一个公网访问访问外部地址,发起连接的是本机的一个随机端口,并且是用在公网IP不固定情况下,比如拨号场景;
    问题2:
     会有性能问题,比如访问缓慢。客户端过多,并且连接过多,iptables conntrack表会满,并发生空间溢出
    2019-04-13
  • 如果
    DAY41,打卡
    2019-04-09
  • honnkyou
    "再来看 DNAT,显然,DNAT 需要在 nat 表的 PREROUTING 或者 OUTPUT 链中配置,其中, PREROUTING 链更常用一些(因为它还可以用于转发的包)。"
    DNAT不是转换到达包的目的地址吗?也可以在OUTPUT链中配置吗?

    作者回复: 嗯嗯,可以的,OUTPUT用于从本机发出的包

    2019-03-18
  • 曾经的十字镐
    我们有部分业务需要向外同步数据,但又必须保证内网服务器的安全,所以我就使用了nat网络,单纯知道外网ip是无法攻击的

    作者回复: 并不是这样的,通过NAT还是可以访问内部服务的,如果服务本身设计有问题,还是一样受到攻击

    2019-03-01
  • 加盐铁论
    打卡,加油💪!
    2019-02-27
  • 小庄.Jerry
    最近我们的一个客户,遇到问题2的问题了。该公司很多用户同时加入我们的会议系统,一般来说,客户会访问我们部署在当地数据中心的服务器,结果很多用户访问到我们数据美国数据中心的服务器了,导致糟糕的体验。
    我们的网络team给的解决方案:禁用了我们服务器的tcp_tw_recycle。
    看了man tcp的介绍,对于NAT网络中,要求禁掉tcp_tw_recycle。但是对于个中的原理还不是很明白,希望老师可以帮忙解释下

    作者回复: tcp_tw_recycle本身的实现就有问题,一定要禁止掉,并且在新的内核(4.1以后)里也被直接删除了

    2019-02-27
  • xfan
    终于搞明白了iptables原理和写法

    作者回复: 👍

    2019-02-27
  • 唯美
    项目中还没有用到,学习中
    2019-02-26
  • 李逍遥
    有个疑问, 看了访问baidu.com的例子,发包和收报都是需要NAT的,那是不是只配置SNAT或DNAT,就不能正常访问外网或被访问了呢?

    作者回复: 不是的,内核有连接跟踪,知道每个请求的来源和目的

    2019-02-26
  • 松花皮蛋me
    iptables性能还是有问题的
    2019-02-26
收起评论
21
返回
顶部