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

42 | 案例篇:如何优化 NAT 性能?(下)

倪朋飞 2019-02-27
你好,我是倪朋飞。
上一节,我们学习了 NAT 的原理,明白了如何在 Linux 中管理 NAT 规则。先来简单复习一下。
NAT 技术能够重写 IP 数据包的源 IP 或目的 IP,所以普遍用来解决公网 IP 地址短缺的问题。它可以让网络中的多台主机,通过共享同一个公网 IP 地址,来访问外网资源。同时,由于 NAT 屏蔽了内网网络,也为局域网中机器起到安全隔离的作用。
Linux 中的 NAT ,基于内核的连接跟踪模块实现。所以,它维护每个连接状态的同时,也对网络性能有一定影响。那么,碰到 NAT 性能问题时,我们又该怎么办呢?
接下来,我就通过一个案例,带你学习 NAT 性能问题的分析思路。

案例准备

下面的案例仍然基于 Ubuntu 18.04,同样适用于其他的 Linux 系统。我使用的案例环境是这样的:
机器配置:2 CPU,8GB 内存。
预先安装 docker、tcpdump、curl、ab、SystemTap 等工具,比如
# Ubuntu
$ apt-get install -y docker.io tcpdump curl apache2-utils
# CentOS
$ curl -fsSL https://get.docker.com | sh
$ yum install -y tcpdump curl httpd-tools
大部分工具,你应该都比较熟悉,这里我简单介绍一下 SystemTap 。
SystemTap 是 Linux 的一种动态追踪框架,它把用户提供的脚本,转换为内核模块来执行,用来监测和跟踪内核的行为。关于它的原理,你暂时不用深究,后面的内容还会介绍到。这里你只要知道怎么安装就可以了:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Linux性能优化实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(22)

  • 于欣磊
    https://mp.weixin.qq.com/s/VYBs8iqf0HsNg9WAxktzYQ:(多个容器snat时因为搜索本地可用端口(都从1025开始,到找到可用端口并插入到conntrack表是一个非事务并且有时延--第二个插入会失败,进而导致第一个syn包被扔掉的错误,扔掉后重传找到新的可用端口,表现就是时延偶尔为1秒或者3秒)

    这篇文章是我见过诊断NAT问题最专业的,大家要多学习一下里面的思路和手段

    作者回复: 👍 谢谢分享。内核问题的分析和排查一般都比较耗时间,对基础知识的要求也会高一些。

    2019-03-01
    10
  • 无名老卒
    很惊讶,之前在线上环境中就出现了kernel: nf_conntrack: table full, dropping packet.的报错,当时就认为是conntrack_max导致的,后面调整了这个值之后就恢复了,但其实那次故障也不应该会加载nf_conntrack模块,因为iptables规则只是设置了几个IP允许登陆服务器,当时也不清楚为什么会去加载这个模块了。

    同时,conntrack_max和conntrack_buckets有没有什么联系呢?从描述中,感觉conntrack_buckets应该要大于conntrack_max才对,但实际 上不是这样,请老师解惑下。

    作者回复: 应该是反过来,nf_conntrack_max是最大连接跟踪数,nf_conntrack_buckets是连接跟踪表(哈希表)大小。哈希表最大也就是最大连接跟踪数

    2019-05-01
    2
  • vvccoe
    ‘# 连接跟踪对象大小为 376,链表项大小为 16
    nf_conntrack_max* 连接跟踪对象大小 +nf_conntrack_buckets* 链表项大小
    = 1000*376+65536*16 B
    = 1.4 MB’
    老师 上面的376和16 是固定值吗?

    作者回复: 这是内核数据结构的大小,一般不会变化

    2019-02-27
    2
  • Geek_007
    老师你好,有两个问题想请教一下。
    第一点,了解到ip_conntrack模块既然会限制链接,且调大会导致占用内存,而且调大了也不一定能解决大流量服务器的网络性能问题,我理解是不是应该关掉ip_conntrack模块,因为业务服务器按理说是不需要状态追踪的。
    第二点,如果我关掉ip_conntrack,会不会因为我执行iptables命令导致该模块被加载,或者执行conntrack命令导致模块被加载。。

    作者回复: 1. 有很多服务是依赖conntrack的,所以要看实际需求确定
    2. 要看iptables规则是不是用到了conntrack功能

    2019-04-10
    1
  • 腾达
    这个案例,能不能讲讲怎么找到是NAT问题?这个很关键,但文章里直接点明说是NAT问题,这个就不好了,一般看cpu,看其他指标很难想到是nat问题,真实场景里,怎么会想到是nat问题呢?

    作者回复: 嗯嗯,是个好问题。下一模块中有内核线程的分析思路,到时候可以看到分析的方法

    2019-03-01
    1
  • 明翼
    systemtap这个真牛,还可以追踪内核模块执行,长见识咯!iptables需要学习下
    2019-03-01
    1
  • 夜空中最亮的星(华仔)
    以前只是知道net性能不好,今天通过老师的讲解彻底明白了来龙去脉。
    公司内部上网用的就是net 人一多就特别慢。
    业务基本上没用过net。

    作者回复: NAT,不是net😊

    2019-02-27
    1
  • 我来也
    [D42打卡]
    今天的内容只能围观了.
    居然还用了内核动态追踪工具,统计丢包位置.
    对于我这种完全不了解内核的人来说, 只当是开了眼界.

    对于我来说,目前知道 NAT会带来性能损耗 就行了.🤦‍♀️
    能避免就避免使用,不能避免了就在请求数较多的场景下调些参数.

    `# 连接跟踪对象大小为 376,链表项大小为 16`
    这应该是c结构体的大小吧.

    作者回复: 是的

    2019-02-27
    1
  • Cranliu
    今天是跟不上了,没有网络基础,进入到网络模块就开始觉得吃力了😂

    作者回复: 先尝试尝试案例,再回去补补基础

    2019-02-27
    1
  • 辉晖
    这边安装实验使用ab压测,没有大量nf_hook_slow丢包
    29384 packets dropped at tcp_rcv_state_process
    22287 packets dropped at sk_stream_kill_queues
    12686 packets dropped at tcp_v4_rcv
    6668 packets dropped at tcp_v4_do_rcv
    8 packets dropped at unix_stream_connect
    1 packets dropped at nf_hook_slow
    1 packets dropped at unix_release_sock
    2019-10-16
  • 刘鼎
    # 连接跟踪对象大小为 376,链表项大小为 16
    nf_conntrack_max* 连接跟踪对象大小 +nf_conntrack_buckets* 链表项大小
    = 1000*376+65536*16 B
    = 1.4 MB

    这个计算,应该是假设每个链表只有一个结点吧?
    我理解是有65535个链表,假如1000个在一个链表,应该是65535+1000个的结点空间?
    2019-09-19
  • tony
    root@ub1805:~# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F2EDC64DC5AEE1F6B9C621F0C8CAB6595FDFF622
    Executing: /tmp/apt-key-gpghome.kvfiZkEsRG/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys F2EDC64DC5AEE1F6B9C621F0C8CAB6595FDFF622
    gpg: keyserver receive failed: Invalid argument
    root@ub1805:~# stap-prep
    You need package linux-image-4.15.0-52-generic-dbgsym but it does not seem to be available
     Ubuntu -dbgsym packages are typically in a separate repository
     Follow https://wiki.ubuntu.com/DebuggingProgramCrash to add this repository
    root@ub1805:~# apt-get install linux-image-`uname -r`-dbgsym
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    E: Unable to locate package linux-image-4.15.0-52-generic-dbgsym
    E: Couldn't find any package by glob 'linux-image-4.15.0-52-generic-dbgsym'
    E: Couldn't find any package by regex 'linux-image-4.15.0-52-generic-dbgsym'
    好像无法安装
    2019-07-31
  • Tom
    老师你好,docker,是不是必然会用到dnat的端口映射?linux服务器内 nat本身应该也有流量限制吧!

    作者回复: 不一定,比如使用hostnetwork就会直接使用host的网络。NAT支持流量限制,不过需要额外的配置

    2019-07-31
  • bigzuo
    不太熟悉linux 网络底层超过,这节课看的很费力

    作者回复: 正好赶紧去补补😊

    2019-07-03
  • 悟空
    nf_conntrack_buckets 和 nf_conntrack_max 从文中的描述没有搞清楚,
    我们只是调整了 nf_conntrack_max(最大连接跟踪数),那么,这个连接是记录在 nf_conntrack_buckets(连接跟踪表)中的吗?,那是否意味着,调整max的同时,也得调整buckets表的大小?

    作者回复: 可以只调整一个,不过要记得这两个参数一起决定了连接跟踪表的结构,这是一个哈希表,两者相除表示冲突的程度。

    2019-06-09
  • manatee
    另外安装centos 安装systemtap那边有个小小的笔误,最后那个stab-prep 应该是stap-prep

    作者回复: 谢谢指出

    2019-05-27
  • manatee
    讲个不是很重要的点,ab命令在centos中没有-s参数

    作者回复: 嗯嗯 不同版本的选项有可能不一样,所以我们一直强调要查man

    2019-05-27
  • Maxwell
    请问这个错误是什么原因导致的呢?
    root@maxwell-virtual-machine:/usr/bin/env# stap --all-modules dropwatch.stp
    semantic error: while resolving probe point: identifier 'kernel' at dropwatch.stp:18:7
            source: probe kernel.trace("kfree_skb") { locations[$location] <<< 1 }
                          ^

    semantic error: no match

    Pass 2: analysis failed. [man error::pass2]
    Tip: /usr/share/doc/systemtap/README.Debian should help you get started.

    作者回复: 可能是debuginfo跟内核版本不一致

    2019-03-24
  • xfan
    讲的不错,让我懂了追踪过程,和我最想知道的东西

    作者回复: 😊

    2019-02-28
  • ninuxer
    打卡day44
    很少用nat,没有发言权😂
    不过对于lvs的nat模式,之后如果用到,可以用这里的contrack命令分析分析具体状态
    然后计算链表占用内存大小的,链接对象376和链表大小16是固定数值?

    作者回复: 嗯 内核数据结构的大小

    2019-02-28
收起评论
22
返回
顶部