FreeBSD 默认的回环接口 lo0
的 MTU 是 16384
:
lo0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 16384
options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
groups: lo
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
可以通过配置提高到 65535
:
编辑 /etc/rc.conf
文件,添加下面两行配置:
ifconfig_lo0="inet 127.0.0.1/8 mtu 65535"
ifconfig_lo0_ipv6="inet6 ::1/128 mtu 65535"
也可以使用 sysrc
来操作 rc.conf
:
$ sudo sysrc ifconfig_lo0="inet 127.0.0.1/8 mtu 65535"
$ sudo sysrc ifconfig_lo0_ipv6="inet6 ::1/128 mtu 65535"
Tips: =
左右两侧一定不要有空格!
IPv4 的 netmask
和 IPv6 的 prefixlen
也需要设置。
配置 IP 地址是必要的,不然 lo0
就没有 IP 地址了,在启动 nginx
这类需要监听端口的服务就会报错:
nginx: [emerg] bind() to 127.0.0.1:8443 failed (49: Can't assign requested address)
重启系统,然后通过 ifconfig
看看 MTU
是否已经变成 65535
:
lo0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 65535
options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
inet 127.0.0.1 netmask 0xff000000
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
inet6 ::1 prefixlen 128
groups: lo
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
测试 MTU 对网络吞吐量的影响
安装 netperf
网络测试工具:
$ sudo pkg install netperf
启动 netperf
的服务端:
$ netserver
Starting netserver with host 'IN(6)ADDR_ANY' port '12865' and family AF_UNSPEC
测试默认的 MTU 值是 16384
的情况下,网络的吞吐情况:
$ netperf
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to localhost () port 0 AF_INET : histogram : interval : dirty data : demo
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
65536 32768 32768 10.01 5278.87
调整到 65535
:
sudo ifconfig lo0 mtu 65535
再测试一下网络吞吐情况:
$ netperf
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to localhost () port 0 AF_INET : histogram : interval : dirty data : demo
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
65536 32768 32768 10.01 9334.43