本文内容包括Linux下对于 Sockets API 的使用、两个可以提高性能的 socket 选项以及 GNU/Linux 优化。为了能够开发性能卓越的应用程序,请遵循以下技巧:最小化报文传输的延时;最小化系统调用的负载;为 Bandwidth Delay Product 调节 TCP 窗口;动态优化 GNU/Linux TCP/IP 栈。
动态优化 GNU/Linux TCP/IP 栈:
标准的 GNU/Linux 发行版试图对各种部署情况都进行优化。这意味着标准的发行版可能并没有对您的环境进行特殊的优化。
解决方案
GNU/Linux 提供了很多可调节的内核参数,您可以使用这些参数为您自己的用途对操作系统进行动态配置。下面我们来了解一下影响 socket 性能的一些更重要的选项。
在 /proc 虚拟文件系统中存在一些可调节的内核参数。这个文件系统中的每个文件都表示一个或多个参数,它们可以通过 cat 工具进行读取,或使用 echo 命令进行修改。清单 3 展示了如何查询或启用一个可调节的参数(在这种情况中,可以在 TCP/IP 栈中启用 IP 转发)。
清单 3. 调优:在 TCP/IP 栈中启用 IP 转发
- [root@camus]# cat /proc/sys/net/ipv4/ip_forward
- 0
- [root@camus]# echo "1" > /poc/sys/net/ipv4/ip_forward
- [root@camus]# cat /proc/sys/net/ipv4/ip_forward
- 1
- [root@camus]#
表 1 给出了几个可调节的参数,它们可以帮助您提高 Linux TCP/IP 栈的性能。
可调节的参数 |
默认值 |
选项说明 |
||||||
|
"110592" |
定义默认的接收窗口大小;对于更大的 BDP 来说,这个大小也应该更大。 |
||||||
/proc/sys/net/core/rmem_max |
"110592" |
定义接收窗口的***大小;对于更大的 BDP 来说,这个大小也应该更大。 |
||||||
/proc/sys/net/core/wmem_default |
"110592" |
定义默认的发送窗口大小;对于更大的 BDP 来说,这个大小也应该更大。 |
||||||
/proc/sys/net/core/wmem_max |
"110592" |
定义发送窗口的***大小;对于更大的 BDP 来说,这个大小也应该更大。 |
||||||
|
|
启用 RFC 1323 定义的 window scaling;要支持超过 64KB 的窗口,必须启用该值。 |
||||||
/proc/sys/net/ipv4/tcp_sack |
"1" |
启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段);(对于广域网通信来说)这个选项应该启用,但是这会增加对 CPU 的占用。 |
||||||
/proc/sys/net/ipv4/tcp_fack |
"1" |
启用转发应答(Forward Acknowledgment),这可以进行有选择应答(SACK)从而减少拥塞情况的发生;这个选项也应该启用。 |
||||||
/proc/sys/net/ipv4/tcp_timestamps |
"1" |
以一种比重发超时更精确的方法(请参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。 |
||||||
/proc/sys/net/ipv4/tcp_mem |
"24576 32768 49152" |
确定 TCP 栈应该如何反映内存使用;每个值的单位都是内存页(通常是 4KB)。***个值是内存使用的下限。第二个值是内存压力模式开始对缓冲区使用应用压力的上限。第三个值是内存上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的 BDP 可以增大这些值(但是要记住,其单位是内存页,而不是字节)。 |
||||||
/proc/sys/net/ipv4/tcp_wmem |
"4096 16384 131072" |
为自动调优定义每个 socket 使用的内存。***个值是为 socket 的发送缓冲区分配的最少字节数。第二个值是默认值(该值会被 wmem_default 覆盖),缓冲区在系统负载不重的情况下可以增长到这个值。第三个值是发送缓冲区空间的***字节数(该值会被 wmem_max 覆盖)。 |
||||||
/proc/sys/net/ipv4/tcp_rmem |
"4096 87380 174760" |
与 tcp_wmem 类似,不过它表示的是为自动调优所使用的接收缓冲区的值。 |
||||||
/proc/sys/net/ipv4/tcp_low_latency |
"0" |
允许 TCP/IP 栈适应在高吞吐量情况下低延时的情况;这个选项应该禁用。 |
提示:下面介绍一个有关***性配置的问题。注意,如果您重新启动了 GNU/Linux 系统,那么您所需要的任何可调节的内核参数都会恢复成默认值。为了将您所设置的值作为这些参数的默认值,可以使用 /etc/sysctl.conf 在系统启动时将这些参数配置成您所设置的值。
【编辑推荐】