本文内容包括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 在系统启动时将这些参数配置成您所设置的值。