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

36 | 套路篇:怎么评估系统的网络性能?

倪朋飞 2019-02-13
你好,我是倪朋飞。
上一节,我们回顾了经典的 C10K 和 C1000K 问题。简单回顾一下,C10K 是指如何单机同时处理 1 万个请求(并发连接 1 万)的问题,而 C1000K 则是单机支持处理 100 万个请求(并发连接 100 万)的问题。
I/O 模型的优化,是解决 C10K 问题的最佳良方。Linux 2.6 中引入的 epoll,完美解决了 C10K 的问题,并一直沿用至今。今天的很多高性能网络方案,仍都基于 epoll。
自然,随着互联网技术的普及,催生出更高的性能需求。从 C10K 到 C100K,我们只需要增加系统的物理资源,就可以满足要求;但从 C100K 到 C1000K ,光增加物理资源就不够了。
这时,就要对系统的软硬件进行统一优化,从硬件的中断处理,到网络协议栈的文件描述符数量、连接状态跟踪、缓存队列,再到应用程序的工作模型等的整个网络链路,都需要深入优化。
再进一步,要实现 C10M,就不是增加物理资源、调优内核和应用程序可以解决的问题了。这时内核中冗长的网络协议栈就成了最大的负担。
需要用 XDP 方式,在内核协议栈之前,先处理网络包。
或基于 DPDK ,直接跳过网络协议栈,在用户空间通过轮询的方式处理。
其中,DPDK 是目前最主流的高性能网络方案,不过,这需要能支持 DPDK 的网卡配合使用。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Linux性能优化实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(28)

  • 我来也
    [D36打卡]
    想不到网络篇这么快就开始"套路"了😁
    由于现在客户端的网络环境复杂,经常会出现部分用户反馈卡顿的情况.
    我这边能做的也有限.
    只能在第一个网路出入口,记录每次收发消息的内容和具体的时间戳(精确到ms).
    遇到玩家反馈时,再根据玩家的唯一编号,及发生的大致时间,在日志中查找玩家的响应时间,来推测是服务器响应慢了,还是客户端到服务器中间的路线慢了.
    有时甚至会让客户端主动汇报,上次发送请求和收到请求的时间间隔. 来验证是不是客户本身的网络环境导致的.
    其实服务器端都有处理消息的耗时记录,平常几乎都没什么太耗时的状况发生.
    遇到客户网络原因导致的延迟,只能说是新加入口,让客户端选择一个最优入口了.

    作者回复: 嗯,网络抖动是很常见的现象。可以考虑更多的接入点、专线、CDN 等等都可以优化公网的链路延迟问题

    2019-02-13
    6
  • ninuxer
    打卡day38
    之前对应用做压测的场景多点,通过学习,又get了底层的压测的方法👍

    作者回复: 嗯 越往上层场景越多

    2019-02-19
    3
  • 挺直腰板
    倪老师,你上面的脚本运行后,提示“cat: /proc/net/pktgen/eth0: 没有那个文件或目录”系统是cetnos7.0,请问如何处理。

    作者回复: 查一下网卡名,看看是不是eth0?换成正确的应该就可以了

    2019-03-31
    1
  • Xiaobai
    4核8G 5M带宽服务器 服务跑一些商城 ,微信小程序 ,如何评估能承受多大的并发量

    作者回复: 最简单的就是做压力测试

    2019-03-23
    1
  • Maxwell
    目前在公司做性能测试,我会首先使用iperf测试网络吞吐量,在局域网下,我会先开启少数线程(2个)进行压测,在测试结果报告中,查看消耗的带宽,再使用iperf的测试结果吞吐量对比,如果网络吞吐量没有瓶颈,那应用程序的性能就与网络无关了,这样理解对么?

    作者回复: 不是的,这只是说明了系统的网络吞吐没问题,但不代表应用的吞吐就没问题了。应用程序的吞吐也还是要测试的

    2019-03-22
    1
  • tech1
    打卡
    2019-12-03
  • 懵懂的Java
    老师你好,像tcp和http我理解最后的性能好坏不也得取决于用户和服务器之间的网络是否畅通吗。光钎和普通以太网肯定结果也不一样吧。
    2019-10-14
  • 辉晖
    底层协议是其上的各层网络协议的基础。可以理解成:越高层,性能测试的结果就越“差”?
    按照老师的案例,如果HTTP层选用了合适的工具,那么测试结果就应该比使用wrk来的好?
    2019-09-30
  • 乖,摸摸头
    我云服务器15M的带宽,咋测试出来吞吐率这么低
    [root@node1 ~]# wrk -c 1000 -t 2 http://m.xxxx.com
    Running 10s test @ http://m.yupao.com
      2 threads and 1000 connections
      Thread Stats Avg Stdev Max +/- Stdev
        Latency 1.27s 320.93ms 1.99s 62.96%
        Req/Sec 42.03 58.53 290.00 87.69%
      313 requests in 10.05s, 8.82MB read
      Socket errors: connect 0, read 0, write 0, timeout 97
      Non-2xx or 3xx responses: 268
    Requests/sec: 31.15
    Transfer/sec: 0.88MB
    只有0.88M
    2019-09-25
    2
  • 世事不可强求-快乐长存
    在对nginx进行压测的时候,系统的内核参数有没有需要改变的?比如说syncookie等
    2019-08-20
  • 。。。。
    有个问题: 买到的 【服务器带宽】理论上 >=吞吐量。
    我现在 手上的腾讯云服务器 :网络带宽是 1M
    但是经,wrk测试,网络吞吐量达到了4M,这是怎么一回事儿呢?
    [root@VM_0_2_centos wrk]# wrk -c 1000 -t 2 http://localhost/
    Running 10s test @ http://localhost/
      2 threads and 1000 connections
      Thread Stats Avg Stdev Max +/- Stdev
        Latency 108.23ms 80.21ms 1.95s 97.68%
        Req/Sec 2.54k 1.77k 5.87k 66.15%
      49587 requests in 10.06s, 40.20MB read
      Socket errors: connect 0, read 0, write 0, timeout 78
    Requests/sec: 4929.91
    Transfer/sec: 4.00MB

    作者回复: 不要使用localhost测试网络,测试带宽要跨主机测试

    2019-08-14
  • 。。。。
    老师 ,没明白这里的吞吐量和实际的带宽大小有什么区别呢?
    我的服务器带宽大小是1M,但是用wrk测试网络吞吐量达到了4M?为什么会超出实际的带宽大小呢?
    [root@VM_0_2_centos wrk]# wrk -c 1000 -t 2 http://localhost/
    Running 10s test @ http://localhost/
      2 threads and 1000 connections
      Thread Stats Avg Stdev Max +/- Stdev
        Latency 108.23ms 80.21ms 1.95s 97.68%
        Req/Sec 2.54k 1.77k 5.87k 66.15%
      49587 requests in 10.06s, 40.20MB read
      Socket errors: connect 0, read 0, write 0, timeout 78
    Requests/sec: 4929.91
    Transfer/sec: 4.00MB

    作者回复: 跨主机测试试试?

    2019-08-14
  • 你认不出来我
    老师,请教一下,我现在有个服务压测的时候从服务端看到服务端从接到网络请求到处理完成只用了 5ms; 但是从客户端看耗时 75 分位都有 400ms, 我用 iperf 测试吞吐量也没有问题,所以请教一下老师有没有什么查这个问题的思路呢?

    作者回复: 从客户端和服务器端同时抓包,就可以看出区别了。这里很肯能是从客户端到服务器的连接慢了

    2019-08-13
  • 梦回汉唐
    我想查看目标服务器的收包的情况,这个怎么在目标服务器上操作呢

    作者回复: 请参考第43、44期

    2019-04-04
  • null
    老师你好,有点疑问请老师解答一下,在用pktgen 的测试中,貌似只能测出发包机器的发包吞吐量吧?因为发包机没法感知到目标机是否真的处理了这个包,还是直接在网卡就被丢了。如果想测试目标机的吞吐量应该怎么弄呢?

    作者回复: 目标机内部可以观测到的

    2019-03-29
  • 如果
    DAY36,打卡
    2019-03-27
  • 💖李京潼💖
    老师我这有个问题想请教一下,基于webservice 接口,对于需要多session, 每个session有多个请求,并且这些请求按照先后顺序有依赖关系,上个请求响应结果作为下个请求包的内容,用哪种开源工具更合适呢?谢谢

    作者回复: 这是纯应用的东西了,没有具体细节不好推荐

    2019-03-20
  • Griffin
    请问用iperf3测试tcp/udp时这个-b的目标带宽是指啥? 是预估该网络有1G的带宽么?
    iperf3 -c 192.168.0.30 -b 1G -t 15 -P 2 -p 10000

    作者回复: 设置测试数据的吞吐量,也就是 iperf3 自己发出的测试包该用多大的带宽。在文档里还有更详细的介绍,你可以man看看

    2019-03-13
  • Griffin
    老师, 请问在测试PPS的案例中, 我写错了IP和mac地址,但是pkts-sofar还是1000000 呢? 这个是只测试发送不看返回值么?

    作者回复: 对的

    2019-03-13
  • MJ
    # 定义一个工具函数,方便后面配置各种测试选项
    function pgset() {
        local result
        echo $1 > $PGDEV

        result=`cat $PGDEV | fgrep "Result: OK:"`
        if [ "$result" = "" ]; then
             cat $PGDEV | fgrep Result:
        fi
    }

    # 为 0 号线程绑定 eth0 网卡
    PGDEV=/proc/net/pktgen/kpktgend_0
    pgset "rem_device_all" # 清空网卡绑定
    pgset "add_device eth0" # 添加 eth0 网卡

    # 配置 eth0 网卡的测试选项
    PGDEV=/proc/net/pktgen/eth0
    pgset "count 1000000" # 总发包数量
    pgset "delay 5000" # 不同包之间的发送延迟 (单位纳秒)
    pgset "clone_skb 0" # SKB 包复制
    pgset "pkt_size 64" # 网络包大小
    pgset "dst 192.168.0.30" # 目的 IP
    pgset "dst_mac 11:11:11:11:11:11" # 目的 MAC

    # 启动测试
    PGDEV=/proc/net/pktgen/pgctrl
    pgset "start"


    老师,这段是vi一个文件保存成脚步吗?

    作者回复: 可以直接粘贴到SHELL运行,保存到脚本里也可以的

    2019-03-13
收起评论
28
返回
顶部