linux性能优化-网络

7层OSI模型

  • 应用层

  • 表示层

  • 会话层

  • 传输层

  • 网络层

  • 链路层

  • 物理层

    linux中的网络模型 TCP/IP 模型

  • 应用层

  • 传输层

  • 网络层

  • 网络接口层
    osi模型

MTU

网络接口配置的最大传输单元 MTU , 规定了最大的ip包大小, 常用的以太网中 MTU的默认值为 1500, 超过这个大小, 就会在网络层分片后的ip包不大于MTU, MTU 越大 需要分包就越少,自然网络吞吐能力就越强

网络包处理流程

网络包处理流程

网络性能指标

  • 带宽
  • 延迟
  • 吞吐量
  • pps

  • 网络可用性

  • 丢包率

  • 并发连接数

  • 重传率

    网络io模型

  • i/o事件的通知方式, 水平触发和边缘触发

    • 水平触发: 只要文件描述符可以非阻塞的执行i/o,就会触发通知, 也就是说程序可以随时检查文件描述符的状态,然后在根据状态进行io操作
    • 边缘触发: 只有在文件描述符的状态发生改变, 也就是io请求达到时,才会发送一次通知, 这时候 应用程序就需要尽可能多的执行i/o 直到无法继续读写.才可以停止,如果io没有执行完, 或者因为某些原因没来的急处理 那么这次通知就丢失了

PPS测试工具

pktgen

TCP UDP 性能测试

iperf和netperf都是最常用的网络性能测试工具, 测试tcp udp 的吞吐量.

1
2
#安装iperf
yum install iperf3

在目标机器上面启动服务端

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

在另一台机器上运行iperf客户端进行测试

1
2
3
4
5
# -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

然后查看 iperf的报告,

1
2
3
4
[ 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 相比,还是有些差距的。

http性能测试

ab : apache自带的http压测工具, 主要测试http服务的每秒请求数, 请求延迟 吞吐量以的分布情况等

1
2
#安装ab
yum install -y httpd-tools

测试nginx性能为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# -c 表示并发请求数为 1000,-n 表示总的请求数为 10000
$ ab -c 1000 -n 10000 http://192.168.0.30/

...
Server Software: nginx/1.15.8
Server Hostname: 192.168.0.30
Server 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] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 27 152.1 1 1038
Processing: 9 207 843.0 22 9242
Waiting: 8 207 843.0 22 9242
Total: 15 233 857.7 23 9268

Percentage 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 内完成

应用负载性能测试

wrk : http性能测试工具, 内置luaJIT 根据实际需求, 生成所需的请求负载, 或者自定义响应处理方法

wrk安装: 通过源码编译安装即可

1
2
3
4
git clone https://github.com/wg/wrk
cd wrk
make
cp wrk /usr/local/bin

测试nginx性能

1
2
3
4
5
6
7
8
9
10
11
# -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 179
Requests/sec: 9641.31
Transfer/sec: 7.82MB

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

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

wrk


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!