Skip to content

Latest commit

 

History

History
122 lines (88 loc) · 2.64 KB

File metadata and controls

122 lines (88 loc) · 2.64 KB

一、准备工作

为了方便观察,需要准备两台服务器。一台作为客户端、另一台作为服务器。

客户端准备

为了本实验的顺利进行,客户端需要进行一些内核参数的调整。

  • 调整 ip_local_port_range 来 保证可用端口数要大于 5 万。
  • 保证 tw_reuse 和 tw_recycle 是关闭状态的,否则连接无法进入 TIME_WAIT
  • 调整 tcp_max_tw_buckets 保证能有 5 万个 TIME_WAIT 状态供观察。
# vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 5000 65000
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_max_tw_buckets = 60000

# sysctl -p

# cat /proc/meminfo
Slab:              39848 kB
...

服务端准备

一般我们测试的时候本地的两台机器的 RTT 都很短,零点几毫秒,很容易把连接队列打满,进而导致握手过慢。 为了避免这个问题,所以需要确认或修改一下系统 somaxconn 的大小(源代码中的 backlog 都设置的是 1024,但必须要 somaxconn 大于这个数字才能生效)。

# vi /etc/sysctl.conf
net.core.somaxconn = 1024
# sysctl -p

# cat /proc/meminfo
Slab:              53512 kB
...

先分别记录一下服务器和客户端实验开始前的 slab 内存开销,例如。

# cat /proc/meminfo
...

二、测试开始

在服务器机器上,进入 test-01 目录,再选择一门你熟悉的语言。无论选择哪门语言,下面的操作过程描述都是通用的。

启动 Server

# make run-srv

再到另外的客户端机器上,首先修改 Makefile 中的服务器 IP(默认是 192.168.0.1 )。然后启动客户端

# make run-cli

然后客户端开始顺序建立连接。

三、观察结果

1. 观察客户端 ESTABLISH 状态内存开销

先确认一下连接总数

# netstat -antp | grep ESTABLISH | wc -l
50017

再确认客户端连接内存开销

# slabtop
...
# cat /proc/meminfo
...

2. 观察服务端 ESTABLISH 状态内存开销

# slabtop
...
# cat /proc/meminfo
...

3. 观察 FIN_WAIT2 状态内存开销

在客户端测试代码所在的控制台上执行 CTRL + C,这样所有的连接在收到来自服务器的 ack 后都将进入 FIN_WAIT2。

# netstat -antp | grep FIN_WAIT2 | wc -l
50000

```sh
# slabtop
...
# cat /proc/meminfo
...

4. 观察 TIME_WAIT 状态内存开销

接着在服务器代码所在的控制太伤执行 CTRL + C,这样服务器也会发出 FIN。客户端上的所有 FIN_WAIT2 都将进入 TIME_WAIT 并等待 2 MSL。

# netstat -antp | grep TIME_WAIT | wc -l
50016

```sh
# slabtop
...
# cat /proc/meminfo
...