总结篇:系统的网络性能评估及优化思路

32 篇文章 3 订阅
订阅专栏
2 篇文章 0 订阅
订阅专栏

目录

一、性能指标

二、网络基准测试

1、转发性能

2、TCP/UDP 性能

3、HTTP 性能

4、应用负载性能

三、性能优化思路

1、确定优化目标

2、网络性能工具

3、网络性能优化

四、总结

1、性能评估

 2、性能优化


 

一、性能指标

在 Linux网络的工作机制及性能指标中,说到,带宽、吞吐量、延时、PPS 等,都是最常用的网络性能指标。

  • ​首先,带宽,表示链路的最大传输速率,单位是 b/s(比特 / 秒)。在你为服务器选购网卡时,带宽就是最核心的参考指标。常用的带宽有 1000M、10G、40G、100G 等。

  • 第二,吞吐量,表示没有丢包时的最大数据传输速率,单位通常为 b/s (比特 / 秒)或者 B/s(字节 / 秒)。吞吐量受带宽的限制,吞吐量 / 带宽也就是该网络链路的使用率。

  • 第三,延时,表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟。这个指标在不同场景中可能会有不同的含义。它可以表示建立连接需要的时间(比如 TCP 握手延时),或者一个数据包往返所需时间(比如 RTT)。

  • 最后,PPS,是 Packet Per Second(包 / 秒)的缩写,表示以网络包为单位的传输速率。PPS 通常用来评估网络的转发能力,而基于 Linux 服务器的转发,很容易受到网络包大小的影响(交换机通常不会受到太大影响,即交换机可以线性转发)。

这四个指标中,带宽跟物理网卡配置是直接关联的。一般来说,网卡确定后,带宽也就确定了(当然,实际带宽会受限于整个网络链路中最小的那个模块)。

Linux 服务器的网络吞吐量一般会比带宽小,而对交换机等专门的网络设备来说,吞吐量一般会接近带宽。

最后的 PPS,则是以网络包为单位的网络传输速率,通常用在需要大量转发的场景中。而对 TCP 或者 Web 服务来说,更多会用并发连接数和每秒请求数(QPS,Query per Second)等指标,它们更能反应实际应用程序的性能。

 

二、网络基准测试

熟悉了网络的性能指标后,如何通过性能测试来确定这些指标的基准值呢?

Linux 网络协议栈,是我们需要掌握的核心原理。它是基于 TCP/IP 协议族的分层结构:

Linux 网络基于 TCP/IP 协议栈,而不同协议层的行为显然不同。应用程序基于协议栈的哪一层呢?如:

  • 基于 HTTP 或者 HTTPS 的 Web 应用程序,属于应用层,需要测试 HTTP/HTTPS 的性能;

  • 对游戏服务器来说,为了支持更大的同时在线人数,通常会基于 TCP 或 UDP ,与客户端进行交互,这时就需要测试 TCP/UDP 的性能;

  • 还有一些场景,是把 Linux 作为一个软交换机或者路由器来用的,。这种情况下,更关注网络包的处理能力(即 PPS),重点关注网络层的转发性能。

注意,低层协议是其上的各层网络协议的基础。那么,低层协议的性能,也就决定了高层的网络性能。测试场景要尽量模拟生产环境,这样的测试才更有价值。比如,你可以到生产环境中,录制实际的请求情况,再到测试中回放。

说明,以下所有的测试方法,都需要两台 Linux 虚拟机。其中一台,可以当作待测试的目标机器;而另一台,则可以当作正在运行网络服务的客户端,用来运行测试工具。

1、转发性能

网络接口层和网络层,它们主要负责网络包的封装、寻址、路由以及发送和接收。在这两个网络协议层中,每秒可处理的网络包数 PPS,是最重要的性能指标。特别是 64B 小包的处理能力,值得我们特别关注。

(1)hping3 作为一个测试网络包处理能力的性能工具。hping3也可作为一个 SYN 攻击的工具来使用。

(2)pktgen,Linux 内核自带的高性能网络测试工具,pktgen 支持丰富的自定义选项,方便你根据实际需要构造所需网络包,从而更准确地测试出目标服务器的性能。不过,在 Linux 系统中,你并不能直接找到 pktgen 命令。因为 pktgen 作为一个内核线程来运行,需要加载 pktgen 内核模块后,再通过 /proc 文件系统来交互。如下,pktgen 启动的两个内核线程和 /proc 文件系统的交互文件:

$ modprobe pktgen$ ps -ef | grep pktgen | grep -v greproot     26384     2  0 06:17 ?        00:00:00 [kpktgend_0]root     26385     2  0 06:17 ?        00:00:00 [kpktgend_1]$ ls /proc/net/pktgen/kpktgend_0  kpktgend_1  pgctrl

pktgen 在每个 CPU 上启动一个内核线程,并可以通过 /proc/net/pktgen 下面的同名文件,跟这些线程交互;而 pgctrl 则主要用来控制这次测试的开启和停止。

如果 modprobe 命令执行失败,说明内核没有配置 CONFIG_NET_PKTGEN 选项。需要配置 pktgen 内核模块(即 CONFIG_NET_PKTGEN=m)后 ,重新编译内核,才可以使用。

在使用 pktgen 测试网络性能时,需要先给每个内核线程 kpktgend_X 以及测试网卡,配置 pktgen 选项,然后再通过 pgctrl 启动测试。

如下测试案例:

以发包测试为例,假设发包机器使用的网卡是 eth0,而目标机器的 IP 地址为 192.168.0.30,MAC 地址为 11:11:11:11:11:11。

发包测试示例:

# 定义一个工具函数,方便后面配置各种测试选项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_0pgset "rem_device_all"   # 清空网卡绑定pgset "add_device eth0"  # 添加eth0网卡# 配置eth0网卡的测试选项PGDEV=/proc/net/pktgen/eth0pgset "count 1000000"    # 总发包数量pgset "delay 5000"       # 不同包之间的发送延迟(单位纳秒)pgset "clone_skb 0"      # SKB包复制pgset "pkt_size 64"      # 网络包大小pgset "dst 192.168.0.30" # 目的IPpgset "dst_mac 11:11:11:11:11:11"  # 目的MAC# 启动测试PGDEV=/proc/net/pktgen/pgctrlpgset "start"

稍等一会儿,测试完成后,结果可以从 /proc 文件系统中获取。可以查看刚才的测试报告:

$ cat /proc/net/pktgen/eth0Params: count 1000000  min_pkt_size: 64  max_pkt_size: 64     frags: 0  delay: 0  clone_skb: 0  ifname: eth0     flows: 0 flowlen: 0...Current:     pkts-sofar: 1000000  errors: 0     started: 1534853256071us  stopped: 1534861576098us idle: 70673us...Result: OK: 8320027(c8249354+d70673) usec, 1000000 (64byte,0frags)  120191pps 61Mb/sec (61537792bps) errors: 0

可以看到,测试报告主要分为三个部分:

  • 第一部分的 Params 是测试选项;

  • 第二部分的 Current 是测试进度,其中, packts so far(pkts-sofar)表示已经发送了 100 万个包,也就表明测试已完成。

  • 第三部分的 Result 是测试结果,包含测试所用时间、网络包数量和分片、PPS、吞吐量以及错误数。

根据上面的结果,我们发现,PPS 为 12 万,吞吐量为 61 Mb/s,没有发生错误。

 

2、TCP/UDP 性能

iperf 和 netperf 都是最常用的网络性能测试工具,测试 TCP 和 UDP 的吞吐量。它们都以客户端和服务器通信的方式,测试一段时间内的平均吞吐量。

以 iperf 为例,看一下 TCP 性能的测试方法。

目前,iperf 的最新版本为 iperf3,运行下面的命令来安装:

# Ubuntuapt-get install iperf3# CentOSyum install iperf3

然后,在目标机器上启动 iperf 服务端:

# -s表示启动服务端,-i表示汇报间隔,-p表示监听端口$ iperf3 -s -i 1 -p 10000

接着,在另一台机器上运行 iperf 客户端,运行测试:

# -c表示启动客户端,192.168.0.30为目标服务器的IP# -b表示目标带宽(单位是bits/s)# -t表示测试时间# -P表示并发数,-p表示目标服务器监听端口$ iperf3 -c 192.168.0.30 -b 1G -t 15 -P 2 -p 10000

稍等一会儿(15 秒)测试结束后,回到目标服务器,查看 iperf 的报告:

[ ID] Interval           Transfer     Bandwidth...[SUM]   0.00-15.04  sec  0.00 Bytes  0.00 bits/sec                  sender[SUM]   0.00-15.04  sec  1.51 GBytes   860 Mbits/sec                  receiver

最后的 SUM 行就是测试的汇总结果,包括测试时间、数据传输量以及带宽等。按照发送和接收,这一部分又分为了 sender 和 receiver 两行。

从测试结果可以看到,这台机器 TCP 接收的带宽(吞吐量)为 860 Mb/s, 跟目标的 1Gb/s 相比,还是有些差距的。

 

3、HTTP 性能

HTTP 就是最常用的一个应用层协议。比如,常用的 Apache、Nginx 等各种 Web 服务,都是基于 HTTP。

常用的 HTTP 压力测试工具,比如 ab、webbench 等。其中,ab 是 Apache 自带的 HTTP 压测工具,主要测试 HTTP 服务的每秒请求数、请求延迟、吞吐量以及请求延迟的分布情况等。

运行下面的命令,你就可以安装 ab 工具:

# Ubuntu$ apt-get install -y apache2-utils# CentOS$ yum install -y httpd-tools

在目标机器上,使用 Docker 启动一个 Nginx 服务,然后用 ab 来测试它的性能。首先,在目标机器上运行下面的命令:

$ docker run -p 80:80 -itd nginx

在另一台机器上,运行 ab 命令,测试 Nginx 的性能:

# -c表示并发请求数为1000,-n表示总的请求数为10000$ ab -c 1000 -n 10000 http://192.168.0.30/...Server Software:        nginx/1.15.8Server Hostname:        192.168.0.30Server Port:            80...Requests per second:    1078.54 [#/sec] (mean)Time per request:       927.183 [ms] (mean)Time per request:       0.927 [ms] (mean, across all concurrent requests)Transfer rate:          890.00 [Kbytes/sec] receivedConnection Times (ms)              min  mean[+/-sd] median   maxConnect:        0   27 152.1      1    1038Processing:     9  207 843.0     22    9242Waiting:        8  207 843.0     22    9242Total:         15  233 857.7     23    9268Percentage of the requests served within a certain time (ms)  50%     23  66%     24  75%     24  80%     26  90%    274  95%   1195  98%   2335  99%   4663 100%   9268 (longest request)

ab 的测试结果分为三个部分,分别是请求汇总、连接时间汇总还有请求延迟汇总。

在请求汇总部分,可以看到:

  • Requests per second 为 1074;

  • 每个请求的延迟(Time per request)分为两行,第一行的 927 ms 表示平均延迟,包括了线程运行的调度时间和网络请求响应时间,而下一行的 0.927ms ,则表示实际请求的响应时间;

  • Transfer rate 表示吞吐量(BPS)为 890 KB/s。

连接时间汇总部分,则是分别展示了建立连接、请求、等待以及汇总等的各类时间,包括最小、最大、平均以及中值处理时间。

最后的请求延迟汇总部分,则给出了不同时间段内处理请求的百分比,比如, 90% 的请求,都可以在 274ms 内完成。

 

4、应用负载性能

应用程序基于 HTTP 协议,为最终用户提供一个 Web 服务。使用 ab 工具,可以得到某个页面的访问性能,但这个结果跟用户的实际请求,很可能不一致。因为用户请求往往会附带着各种各种的负载(payload),而这些负载会影响 Web 应用程序内部的处理逻辑,从而影响最终性能。

为了得到应用程序的实际性能,就要求性能工具本身可以模拟用户的请求负载,而 iperf、ab 这类工具就无能为力了。幸运的是,我们还可以用 wrk、TCPCopy、Jmeter 或者 LoadRunner 等实现这个目标。

以 wrk 为例,它是一个 HTTP 性能测试工具,内置了 LuaJIT,方便你根据实际需求,生成所需的请求负载,或者自定义响应的处理方法。wrk 工具本身不提供 yum 或 apt 的安装方法,需要通过源码编译来安装。可以运行下面的命令,来编译和安装 wrk:

$ https://github.com/wg/wrk$ cd wrk$ apt-get install build-essential -y$ make$ sudo cp wrk /usr/local/bin/

wrk 的命令行参数比较简单。比如,用 wrk ,来重新测一下前面已经启动的 Nginx 的性能。

# -c表示并发连接数1000,-t表示线程数为2$ wrk -c 1000 -t 2 http://192.168.0.30/Running 10s test @ http://192.168.0.30/  2 threads and 1000 connections  Thread Stats   Avg      Stdev     Max   +/- Stdev    Latency    65.83ms  174.06ms   1.99s    95.85%    Req/Sec     4.87k   628.73     6.78k    69.00%  96954 requests in 10.06s, 78.59MB read  Socket errors: connect 0, read 0, write 0, timeout 179Requests/sec:   9641.31Transfer/sec:      7.82MB

这里使用 2 个线程、并发 1000 连接,重新测试了 Nginx 的性能。你可以看到,每秒请求数为 9641,吞吐量为 7.82MB,平均延迟为 65ms,比前面 ab 的测试结果要好很多。

这也说明,性能工具本身的性能,对性能测试也是至关重要的。不合适的性能工具,并不能准确测出应用程序的最佳性能。

 

当然,wrk 最大的优势,是其内置的 LuaJIT,可以用来实现复杂场景的性能测试。wrk 在调用 Lua 脚本时,可以将 HTTP 请求分为三个阶段,即 setup、running、done,如下图所示:

wrk地址:https://github.com/wg/wrk/

在执行测试时,通过 -s 选项,执行脚本的路径:

$ wrk -c 1000 -t 2 -s auth.lua http://192.168.0.30/

wrk 需要你用 Lua 脚本,来构造请求负载。这对于大部分场景来说,可能已经足够了 。不过,它的缺点也正是,所有东西都需要代码来构造,并且工具本身不提供 GUI 环境。

像 Jmeter 或者 LoadRunner(商业产品),则针对复杂场景提供了脚本录制、回放、GUI 等更丰富的功能,使用起来也更加方便。

 

三、性能优化思路

1、确定优化目标

跟 CPU 和 I/O 方面的性能优化一样,优化前,先问问自己,网络性能优化的目标是什么?换句话说,我们观察到的网络性能指标,要达到多少才合适呢?

实际上,虽然网络性能优化的整体目标,是降低网络延迟(如 RTT)和提高吞吐量(如 BPS 和 PPS),但具体到不同应用中,每个指标的优化标准可能会不同,优先级顺序也大相径庭。所以,为了更客观合理地评估优化效果,我们首先应该明确优化的标准,即要对系统和应用程序进行基准测试,得到网络协议栈各层的基准性能。根据这些基准指标,再结合已经观察到的性能瓶颈,我们就可以明确性能优化的目标。

 

2、网络性能工具

(1)根据指标找工具

(2)根据工具查指标

 

3、网络性能优化

结合Linux 系统的网络协议栈和网络收发流程,可以从应用程序、套接字、传输层、网络层以及链路层等几个角度,分别来看网络性能优化的基本思路。

(1)应用程序

应用程序,通常通过套接字接口进行网络操作。由于网络收发通常比较耗时,所以应用程序的优化,主要就是对网络 I/O 和进程自身的工作模型的优化。

从网络 I/O 的角度来说,主要有下面两种优化思路。

  • 第一种是最常用的 I/O 多路复用技术 epoll,主要用来取代 select 和 poll。这其实是解决 C10K 问题的关键,也是目前很多网络应用默认使用的机制。

  • 第二种是使用异步 I/O(Asynchronous I/O,AIO)。AIO 允许应用程序同时发起很多 I/O 操作,而不用等待这些操作完成。等到 I/O 完成后,系统会用事件通知的方式,告诉应用程序结果。不过,AIO 的使用比较复杂,你需要小心处理很多边缘情况。

从进程的工作模型来说,也有两种不同的模型用来优化。

  • 第一种,主进程 + 多个 worker 子进程。其中,主进程负责管理网络连接,而子进程负责实际的业务处理。这也是最常用的一种模型。

  • 第二种,监听到相同端口的多进程模型。在这种模型下,所有进程都会监听相同接口,并且开启 SO_REUSEPORT 选项,由内核负责,把请求负载均衡到这些监听进程中去。

应用层的网络协议优化:

  • 使用长连接取代短连接,可以显著降低 TCP 建立连接的成本。在每秒请求次数较多时,这样做的效果非常明显。

  • 使用内存等方式,来缓存不常变化的数据,可以降低网络 I/O 次数,同时加快应用程序的响应速度。

  • 使用 Protocol Buffer 等序列化的方式,压缩网络 I/O 的数据量,可以提高应用程序的吞吐。

  • 使用 DNS 缓存、预取、HTTPDNS 等方式,减少 DNS 解析的延迟,也可以提升网络 I/O 的整体速度。

(2)套接字

      套接字可以屏蔽掉 Linux 内核中不同协议的差异,为应用程序提供统一的访问接口。每个套接字,都有一个读写缓冲区。

  • 读缓冲区,缓存了远端发过来的数据。如果读缓冲区已满,就不能再接收新的数据。

  • 写缓冲区,缓存了要发出去的数据。如果写缓冲区已满,应用程序的写操作就会被阻塞。

所以,为了提高网络的吞吐量,你通常需要调整这些缓冲区的大小。比如:

  • 增大每个套接字的缓冲区大小 net.core.optmem_max;

  • 增大套接字接收缓冲区大小 net.core.rmem_max 和发送缓冲区大小 net.core.wmem_max;

  • 增大 TCP 接收缓冲区大小 net.ipv4.tcp_rmem 和发送缓冲区大小 net.ipv4.tcp_wmem。

套接字的内核选项,如下表格:

不过有几点需要你注意。

  • tcp_rmem 和 tcp_wmem 的三个数值分别是 min,default,max,系统会根据这些设置,自动调整 TCP 接收 / 发送缓冲区的大小。

  • udp_mem 的三个数值分别是 min,pressure,max,系统会根据这些设置,自动调整 UDP 发送缓冲区的大小。

当然,表格中的数值只提供参考价值,具体应该设置多少,还需要根据实际的网络状况来确定。比如,发送缓冲区大小,理想数值是吞吐量 * 延迟,这样才可以达到最大网络利用率。

 

除此之外,套接字接口还提供了一些配置选项,用来修改网络连接的行为:

  • 为 TCP 连接设置 TCP_NODELAY 后,就可以禁用 Nagle 算法;

  • 为 TCP 连接开启 TCP_CORK 后,可以让小包聚合成大包后再发送(注意会阻塞小包的发送);

  • 使用SO_SNDBUF 和 SO_RCVBUF ,可以分别调整套接字发送缓冲区和接收缓冲区的大小。

 

(3)传输层

传输层最重要的是 TCP 和 UDP 协议,其实主要就是对这两种协议的优化。

TCP 协议的优化

TCP 提供了面向连接的可靠传输服务。要优化 TCP,首先要掌握 TCP 协议的基本原理,比如流量控制、慢启动、拥塞避免、延迟确认以及状态流图(如下图所示)等。

第一类,在请求数比较大的场景下,大量处于 TIME_WAIT 状态的连接,它们会占用大量内存和端口资源。这时,我们可以优化与 TIME_WAIT 状态相关的内核选项,比如采取下面几种措施。

  • 增大处于 TIME_WAIT 状态的连接数量 net.ipv4.tcp_max_tw_buckets ,并增大连接跟踪表的大小 net.netfilter.nf_conntrack_max。

  • 减小 net.ipv4.tcp_fin_timeout 和 net.netfilter.nf_conntrack_tcp_timeout_time_wait ,让系统尽快释放它们所占用的资源。

  • 开启端口复用 net.ipv4.tcp_tw_reuse。这样,被 TIME_WAIT 状态占用的端口,还能用到新建的连接中。

  • 增大本地端口的范围 net.ipv4.ip_local_port_range 。这样就可以支持更多连接,提高整体的并发能力。

  • 增加最大文件描述符的数量。可以使用 fs.nr_open 和 fs.file-max ,分别增大进程和系统的最大文件描述符数;或在应用程序的 systemd 配置文件中,配置 LimitNOFILE ,设置应用程序的最大文件描述符数。

 

第二类,为了缓解 SYN FLOOD 等,利用 TCP 协议特点进行攻击而引发的性能问题,可以考虑优化与 SYN 状态相关的内核选项,比如采取下面几种措施。

  • 增大 TCP 半连接的最大数量 net.ipv4.tcp_max_syn_backlog ,或者开启 TCP SYN Cookies net.ipv4.tcp_syncookies ,来绕开半连接数量限制的问题(注意,这两个选项不可同时使用)。

  • 减少 SYN_RECV 状态的连接重传 SYN+ACK 包的次数net.ipv4.tcp_synack_retries。

     

第三类,在长连接的场景中,通常使用 Keepalive 来检测 TCP 连接的状态,以便对端连接断开后,可以自动回收。但是系统默认的 Keepalive 探测间隔和重试次数,一般都无法满足应用程序的性能要求。所以,这时候你需要优化与 Keepalive 相关的内核选项,比如:

  • 缩短最后一次数据包到 Keepalive 探测包的间隔时间 net.ipv4.tcp_keepalive_time;

  • 缩短发送 Keepalive 探测包的间隔时间 net.ipv4.tcp_keepalive_intvl;

  • 减少 Keepalive 探测失败后,一直到通知应用程序前的重试次数 net.ipv4.tcp_keepalive_probes。

 

需要注意的是:

优化 TCP 性能时,如果同时使用不同优化方法,可能会产生冲突。比如,

  • 就像网络请求延迟的时候,服务器端开启 Nagle 算法,而客户端开启延迟确认机制,就很容易导致网络延迟增大。

  • 另外,在使用 NAT 的服务器上,如果开启 net.ipv4.tcp_tw_recycle ,就很容易导致各种连接失败。实际上,由于坑太多,这个选项在内核的 4.1 版本中已经删除了。

 

UDP 的优化

UDP 提供了面向数据报的网络协议,它不需要网络连接,也不提供可靠性保障。所以,UDP 优化,相对于 TCP 来说,要简单得多。常见的几种优化方案。

  • 跟上边套接字部分提到的一样,增大套接字缓冲区大小以及 UDP 缓冲区范围;

  • 跟前面 TCP 部分提到的一样,增大本地端口号的范围;

  • 根据 MTU 大小,调整 UDP 数据包的大小,减少或者避免分片的发生。

 

(4)网络层

网络层,负责网络包的封装、寻址和路由,包括 IP、ICMP 等常见协议。在网络层,最主要的优化,其实就是对路由、 IP 分片以及 ICMP 等进行调优。

第一种,从路由和转发的角度出发,调整下面的内核选项。

  • 在需要转发的服务器中,比如用作 NAT 网关的服务器或者使用 Docker 容器时,开启 IP 转发,即设置 net.ipv4.ip_forward = 1。

  • 调整数据包的生存周期 TTL,比如设置 net.ipv4.ip_default_ttl = 64。注意,增大该值会降低系统性能。

  • 开启数据包的反向地址校验,比如设置 net.ipv4.conf.eth0.rp_filter = 1。这样可以防止 IP 欺骗,并减少伪造 IP 带来的 DDoS 问题。

 

第二种,从分片的角度出发,最主要的是调整 MTU(Maximum Transmission Unit)的大小。

通常,MTU 的大小应该根据以太网的标准来设置。以太网标准规定,一个网络帧最大为 1518B,那么去掉以太网头部的 18B 后,剩余的 1500 就是以太网 MTU 的大小。

在使用 VXLAN、GRE 等叠加网络技术时,要注意,网络叠加会使原来的网络包变大,导致 MTU 也需要调整。比如,以 VXLAN 为例,它在原来报文的基础上,增加了 14B 的以太网头部、 8B 的 VXLAN 头部、8B 的 UDP 头部以及 20B 的 IP 头部。换句话说,每个包比原来增大了 50B。

所以,我们就需要把交换机、路由器等的 MTU,增大到 1550, 或者把 VXLAN 封包前(比如虚拟化环境中的虚拟网卡)的 MTU 减小为 1450。

另外,现在很多网络设备都支持巨帧,如果是这种环境,你还可以把 MTU 调大为 9000,以提高网络吞吐量。

 

第三种,从 ICMP 的角度出发,为了避免 ICMP 主机探测、ICMP Flood 等各种网络问题,可以通过内核选项,来限制 ICMP 的行为。比如,

  • 禁止 ICMP 协议,即设置 net.ipv4.icmp_echo_ignore_all = 1。这样,外部主机就无法通过 ICMP 来探测主机。

  • 禁止广播 ICMP,即设置 net.ipv4.icmp_echo_ignore_broadcasts = 1。

 

(5)链路层

链路层负责网络包在物理网络中的传输,比如 MAC 寻址、错误侦测以及通过网卡传输网络帧等。自然,链路层的优化,也是围绕这些基本功能进行的。接下来,我们从不同的几个方面分别来看。

第一、由于网卡收包后调用的中断处理程序(特别是软中断),需要消耗大量的 CPU。所以,将这些中断处理程序调度到不同的 CPU 上执行,就可以显著提高网络吞吐量。这通常可以采用下面两种方法。

  • 可以为网卡硬中断配置 CPU 亲和性(smp_affinity),或者开启 irqbalance 服务。

  • 可以开启 RPS(Receive Packet Steering)和 RFS(Receive Flow Steering),将应用程序和软中断的处理,调度到相同 CPU 上,这样就可以增加 CPU 缓存命中率,减少网络延迟。

第二、现在的网卡都有很丰富的功能,原来在内核中通过软件处理的功能,可以卸载到网卡中,通过硬件来执行。

  • TSO(TCP Segmentation Offload)和 UFO(UDP Fragmentation Offload):在 TCP/UDP 协议中直接发送大包;而 TCP 包的分段(按照 MSS 分段)和 UDP 的分片(按照 MTU 分片)功能,由网卡来完成 。

  • GSO(Generic Segmentation Offload):在网卡不支持 TSO/UFO 时,将 TCP/UDP 包的分段,延迟到进入网卡前再执行。这样,不仅可以减少 CPU 的消耗,还可以在发生丢包时只重传分段后的包。

  • LRO(Large Receive Offload):在接收 TCP 分段包时,由网卡将其组装合并后,再交给上层网络处理。不过要注意,在需要 IP 转发的情况下,不能开启 LRO,因为如果多个包的头部信息不一致,LRO 合并会导致网络包的校验错误。

  • GRO(Generic Receive Offload):GRO 修复了 LRO 的缺陷,并且更为通用,同时支持 TCP 和 UDP。RSS(Receive Side Scaling):也称为多队列接收,它基于硬件的多个接收队列,来分配网络接收进程,这样可以让多个 CPU 来处理接收到的网络包。

  • VXLAN 卸载:也就是让网卡来完成 VXLAN 的组包功能。

第三、对于网络接口本身,也有很多方法,可以优化网络的吞吐量。比如,

  • 可以开启网络接口的多队列功能。这样,每个队列就可以用不同的中断号,调度到不同 CPU 上执行,从而提升网络的吞吐量。

  • 可以增大网络接口的缓冲区大小,以及队列长度等,提升网络传输的吞吐量(注意,这可能导致延迟增大)。

  • 还可以使用 Traffic Control 工具,为不同网络流量配置 QoS。

最后,别忘了一种极限场景C10M 问题:

在单机并发 1000 万的场景中,对 Linux 网络协议栈进行的各种优化策略,基本都没有太大效果。因为这种情况下,网络协议栈的冗长流程,其实才是最主要的性能负担。这时,我们可以用两种方式来优化。

  • 第一种,使用 DPDK 技术,跳过内核协议栈,直接由用户态进程用轮询的方式,来处理网络请求。同时,再结合大页、CPU 绑定、内存对齐、流水线并发等多种机制,优化网络包的处理效率。

  • 第二种,使用内核自带的 XDP 技术,在网络包进入内核协议栈前,就对其进行处理,这样也可以实现很好的性能。

四、总结

1、性能评估

性能评估是优化网络性能的前提,只有在你发现网络性能瓶颈时,才需要进行网络性能优化。根据 TCP/IP 协议栈的原理,不同协议层关注的性能重点不完全一样,也就对应不同的性能测试方法。比如,

  • 网络接口层和网络层,它们主要负责网络包的封装、寻址、路由,以及发送和接收。每秒可处理的网络包数 PPS,就是它们最重要的性能指标(特别是在小包的情况下)。你可以用内核自带的发包工具 pktgen ,来测试 PPS 的性能。

  • 传输层的TCP和UDP,主要负责网络传输。对它们而言,吞吐量(BPS)、连接数以及延迟,就是最重要的性能指标。可以用 iperf 或 netperf ,来测试传输层的性能。不过要注意,网络包的大小,会直接影响这些指标的值。所以,通常,你需要测试一系列不同大小网络包的性能。

  • 应用层,最需要关注的是吞吐量(BPS)、每秒请求数以及延迟等指标。你可以使用 wrk、Jmeter 等模拟用户的负载,测试应用程序的每秒请求数、处理延迟、错误数等;

由于低层协议是高层协议的基础。所以,一般情况下,需要从上到下,对每个协议层进行性能测试,然后根据性能测试的结果,结合 Linux 网络协议栈的原理,找出导致性能瓶颈的根源,进而优化网络性能。

在优化网络的性能时,我们可以结合 Linux 系统的网络协议栈和网络收发流程,从应用程序、套接字、传输层、网络层再到链路层等,对每个层次进行逐层优化。

 

 2、性能优化

在优化网络的性能时,我们可以结合 Linux 系统的网络协议栈和网络收发流程,从应用程序、套接字、传输层、网络层再到链路层等,对每个层次进行逐层优化

具体而言:

  • 在应用程序中,主要是优化 I/O 模型、工作模型以及应用层的网络协议;

  • 在套接字层中,主要是优化套接字的缓冲区大小;

  • 在传输层中,主要是优化 TCP 和 UDP 协议;

  • 在网络层中,主要是优化路由、转发、分片以及 ICMP 协议;

  • 最后,在链路层中,主要是优化网络包的收发、网络功能卸载以及网卡选项。

  • 如果这些方法依然不能满足要求,可以考虑,使用 DPDK 等用户态方式,绕过内核协议栈;或者,使用 XDP,在网络包进入内核协议栈前进行处理。

 

文章内容整理来源:极客时间-Linux性能优化实战,希望对大家有所帮助~


 

 

网络性能评估
lingshengxiyou的博客
04-10 1976
l 带宽表示链路的最大传输速率,单位是b/s 比特/秒,在位服务器选网卡时,带宽就是最核心的参考指标,常用的带宽有1000M,10G,40G,100G等网络带宽测试,测试的不是带宽,而是网络吞吐量,Linux服务器的网络吞吐量一般会比带宽小,而对交换机等专门的网络设备来说,吞吐量一般会接近带宽l 吞吐量表示没有丢包时最大的数据传输速率,单位通常是b/s比特/秒,或B/s字节/秒,吞吐量受带宽的限制,吞吐量/带宽也是该网络链路的使用率l 延迟。
大型网站性能优化实战
03-17
具体内容包括:基于用户体验的性能优化要素、前端性能优化实战、网站性能分析、服务性能优化、TCP优化、DNS优化、CDN优化、大型网站性能监控体系、大型网站容量评估、高性能系统架构模式、大促保障体系、数据分析...
深入探索 Android 网络优化(二、网络优化基础)上
Android技术之家
05-28 4298
前言成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。思维导图大纲一、为什么要进行网络优化?「等待网络是我们 App 最大的性能瓶颈,再...
Linux - 网络性能评估
热门推荐
小工匠
03-07 2万+
网络性能的好坏直接影响应用程序对外提供服务的稳定性和可靠性。网络性能可以从以下几个方面进行管理和优化
计算机网络性能评估
A soul tortured by desire
04-24 1406
计算机网络性能评估 性能评价(performance cvaluation)是计算机网络和计算机系统研究与应用的重要理论基础和支撑技术,是通信和计算机科学领域的重要研究方向,也是一门理论与实践紧密相连、内容丰富、体系完整的学科。计算机网络性能评价的目的主要有三个:选择、改进和设计。 中文名 计算机网络性能评估 外文名 Computer network performance evalua...
rmem:rmem公共仓库
05-07
rmem:适用于ARMv8,RISC-V,Power和x86的可执行并发模型 rmem工具包括针对Power,ARMv8,RISC-V和x86(TSO)处理器体系结构的宽松内存并发语义的可执行操作模型,以及在石蕊测试和ELF二进制文件上执行模型的机制:交互式地逐步执行合法的并发行为,伪随机地找到合法的结果,并穷举枚举小型并发程序在架构上允许的所有结果。 对于ARM,它同时支持当前的ARMv8-A多副本原子模型和较早的ARMv8-A非多副本原子模型。 该工具提供了独立的Web界面版本(已编译为JavaScript),可以在进行尝试,也可以提供命令行版本。 rmem是一部分,由ERC Advanced赠款“ ELVER”(2018-2023,ERC AdG 789108),EPSRC计划赠款“ REMS:主流系统的严格工程”(EP / K008528 / 1)资助, EPSRC授予“ C3
网络优化思路
weixin_34174132的博客
04-09 919
我们可以从应用程序、套接字、传输层、网络层以及链路层等几个角度,分别来看网络性能优化的基本思路。应用程序应用程序,通常通过套接字接口进行网络操作。由于网络收发通常比较耗时,所以应用程序的优化,主要就是对网络 I/O 和进程自身的工作模型的优化。1).用最常用的 I/O 多路复用技术 epoll,主要用来取代 select 和 poll。这其实是解决 C10K 问题的关键,也是目前很多网络应用默认使...
性能瓶颈之网络分析及调优
qq_38571773的博客
12-05 1193
性能测试-网络瓶颈分析
太阳能光伏电站并网电池储能系统性能评估附matlab代码.zip
最新发布
10-16
1.版本:matlab2014/2019a/2021a,内含运行结果,不会运行可私信 2.附赠案例数据可直接运行...擅长智能优化算法、神经网络预测、信号处理、元胞自动机等多种领域的算法仿真实验,更多仿真源码、数据集定制私信+。
iperf3_dissector:适用于Wireshark的Iperf3解剖器
04-27
#Iperf3 Wireshark的解剖器 Wireshark已经包含一个iperf2解剖器,但在iperf3中,某些字段已更改顺序,外加UDP端口。 因此,我制作了这个小LUA文件来识别和解析iperf3 UDP数据包。 工作基于 要安装,只需将LUA文件复制到。\ App \ Wireshark \ plugins目录。 注意:解剖器尚不支持--udp-counters-64bit选项。 注意:解剖器仅解码时间戳和序列号。 没有其他领域。 使用iperf3解剖器,您可以自己验证iperf3中的乱序UDP数据包。 我用它来解决出现很多重复帧的网络情况。 iperf3转储了很多错误消息,我认为这是iperf3本身的错误。 使用解剖器,我可以看到iperf3是正确的,确实存在尴尬的网络状况。 例子:
pso-gru-lstm:PSO优化GRU-LSTM超参数
02-19
主要思路: 建立GRU-LSTM模型 定义PSO的参数:最大迭代次数、最大惯性权重、最小惯性权重、粒子数量、所有粒子的位置和速度、个体经历的最佳位置和全局最佳位置、每个个体的历史最佳适应值 定义超参数搜索范围 计算...
Linux Perf Master (Linux性能优化大师 ePub)
03-15
### 特色章节 * [基于Linux单机的负载评估](chapter/abc/load.md) * [动态追踪技术:DTrace](chapter/tools/dtrace.md) ...* [性能优化思路:从珠海航展交通管控实践谈起](chapter/thinking/traffic.md)
网络改造及网络安全整体技术解决方案.doc
06-10
16 3.5 方案特点 19 3.6 现有基础网络存在的问题 19 3.7 现有基础网络解决思路 20 3.8 内部网络优化 21 第4章 二期网络安全规划建设方案 23 4.1 网络安全建设的必要性 23 4.2 网络安全建设的价值 23 4.3 网络拓扑图 ...
Linux内核调优部分参数说明
zuiyijiangnan的博客
05-18 1099
1、linux socket 缓存:core rmem_default rmem_max 使用udp接收数据时: 若没有调用setsokcetopt设置系统接收缓存,则接收缓存的大小为rmem_default。 若程序调用setsocketopt设置系统接收缓存,则设置值不能超过rmem_max. 系统会为每个udp_socket申请一份缓存空间,而不是共用同一份缓存。 即每个udp socket都会有一个rmem_default大小的缓存空间(假设没有setsockopt设置) #接收套接字缓
IPv4和IPv6比特转发率和包转发率的关系
奋斗中拥有
08-15 4132
 IPv4和IPv6比特转发率和包转发率的关系目录:一、bps和pps如何换算?二、为什么以太网最短是64字节?三、IPv6 的最短包长是多少?四、Spirent上为什么设置IPv6最短长度为76字节,Spirent仪器上能否发送64字节的IPv6报文?五、IPv6 包的pps如何计算比价合理?一、bps和pps如何换算?比特转发率:bps(bits
打造千万级流量系统——秒杀系统性能
Aplumage的专栏
05-14 749
系统参数:如何按业务场景优化网络性能 一般来说,不同的参数类型对应不同的资源和性能,进而影响不同的业务场景,比如网络参数主要影响以网络请求为主的业务,文件系统参数主要影响以读写文件为主的业务场景。 那我们该如何获取参数类型呢,可以执行以下命令: sudo /sbin/sysctl -a|awk -F "." '{print $1}'|sort -k1|uniq 结果如下所示: abi debug fs kernel net user v
网络性能优化思路
qq_40500045的博客
02-21 4491
网络性能优化思路 文章目录网络性能优化思路前言一、确定优化目标二、网络性能工具网络性能优化应用程序套接字传输层网络层链路层总结 前言 网络问题比我们前面学过的 CPU、内存或磁盘 I/O 都要复杂。无论是应用层的各种 I/O 模型,冗长的网络协议栈和众多的内核选项,抑或是各种复杂的网络环境,都提高了网络的复杂性。不过,也不要过分担心,只要你掌握了 Linux 网络的基本原理和常见网络协议的工作流程,再结合各个网络层的性能指标来分析,你会发现,定位网络瓶颈并不难。找到网络性能瓶颈后,下一步要做的就是优化
[转载]UDP和TCP协议包大小的计算
技术资料库
12-29 6103
UDP一次发送数据包的大小,TCP一次发送数据包的大小。MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,EthernetII帧的结构DMAC+SMAC+Type+Data+CRC由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据
深度学习模型评估优化思路方法
03-30
深度学习模型评估优化是一个重要的研究领域,以下是一些思路和方法: 1. 数据预处理:数据的预处理和清洗对于模型的性能至关重要。可以使用标准化、归一化、缩放、降噪等技术来处理数据。 2. 模型选择:选择适合数据集的模型是至关重要的。可以使用经典的模型,如卷积神经网络、循环神经网络等,也可以使用自适应模型,如深度强化学习等。 3. 超参数调整:超参数是指在模型训练过程中需要手动设置的参数,如学习率、批量大小等。可以使用网格搜索、随机搜索等方法来选择最优的超参数。 4. 模型评估:使用交叉验证、混淆矩阵、ROC曲线等方法来评估模型的性能,以确定模型的准确性、精确性和召回率等指标。 5. 正则化:正则化技术可以防止模型出现过拟合现象,如L1和L2正则化、dropout等。 6. 模型集成:使用多个模型的结果来获得更好的性能,如投票、平均、堆叠等方式。 7. 预测解释:使用可解释性技术来解释模型预测结果,如LIME、SHAP等。 8. 模型部署:将模型集成到实际应用中,可以使用容器化技术、云服务等方式进行部署。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Win10 IE浏览器代理服务器没有响应 问题解决方法 24739
  • Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结(oom) 10758
  • swap满了,cache太多,怎么破? 9208
  • 约瑟夫问题——循环链表C++ 7636
  • 在CentOS7上成功安装django框架 5376

分类专栏

  • Kubernetes 1篇
  • 网络 2篇
  • 数据结构与算法 2篇
  • 数据分析 5篇
  • 笔记 5篇
  • 机器学习 13篇
  • 数据库 2篇
  • C/C++ 37篇
  • Linux运维 32篇
  • 项目版本管理-Git 1篇
  • 电脑轻松使用 1篇
  • Python学习篇 16篇
  • Django框架 5篇
  • 中间件 7篇
  • Kafka 4篇

最新评论

  • 软中断CPU使用率高 咋办?

    weixin_39394823: 很好,很详细,很易懂,我决定看完才去吃饭

  • 从两种斐波那契数的实现认识递归算法

    Liulianglianglia: 方式二的代码优点看不懂(麻瓜sr),请问第5行的代码的意思是什么呀?

  • 总结篇:性能问题分析及优化的一般方法,工具速查

    棣莫弗: 这个人的系列文章都抄袭至极客时间专栏,已经侵犯了作者的知识产权,请你等待法律诉讼。

  • Centos7查看主机IP地址

    七分小魔女: 那这里的IP地址分别是127.0.0.1 和192.168.140.132嘛?

  • Win10 IE浏览器代理服务器没有响应 问题解决方法

    m0_60661844: 亲测真的有用谢谢大佬我搞了半天,实在想不明白,只好百度了,没想到第一次尝试就成功了

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 内存性能指标及工具
  • 云主机安装gcc通过降级glibc解决依赖问题
  • uwsgi ini配置文件参数详解
2022年4篇
2021年23篇
2020年33篇
2019年18篇
2018年7篇
2017年41篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C-Jonn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司廊坊SEO按效果付费报价江门seo排名价格重庆网站改版公司丽江外贸网站建设公司来宾企业网站改版赤峰网站优化推广价格荆门营销型网站建设阳江营销型网站建设价格太原关键词排名报价吕梁网站优化按天收费推荐阿坝网站排名优化公司吉祥SEO按效果付费报价鹤岗关键词排名包年推广多少钱北京网站开发哪家好池州企业网站建设价格抚州优化公司柳州企业网站制作价格哈尔滨模板制作价格宝安企业网站建设肇庆建站扬州关键词按天收费价格青岛SEO按天收费云浮网络广告推广多少钱宜宾网页设计公司上饶网络广告推广多少钱日照优化珠海网站优化报价包头seo网站推广报价沈阳优化报价木棉湾百度竞价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化