EQL 驱动程序:串行 IP 负载均衡 HOWTO

Simon “Guru Aleph-Null” Janes, simon@ncm.com

v1.1, 1995 年 2 月 27 日

这是 EQL 设备驱动程序的手册。EQL 是一种软件设备,可让您对 IP 串行链路(SLIP 或未压缩的 PPP)进行负载均衡,以提高您的带宽。除了在您的链路上已经有很多流量的情况下,它可以帮助它们之外,它不会降低您的延迟(即 ping 时间)。这个驱动程序已经使用 1.1.75 内核进行了测试,并且已知可以与 1.1.86 干净地打补丁。在 1.1.92 上进行了一些使用 v1.1 补丁的测试,该补丁仅是为了在最新的内核源代码树中干净地打补丁而创建的。(是的,它工作正常。)

1. 简介

哪个更糟糕?一条 56K 租用线路的巨额费用还是两条电话线?很可能是前者。如果您发现自己渴望更高的带宽,并且有一个灵活的 ISP,现在可以将调制解调器绑定在一起以作为一个点对点链路工作,从而提高您的带宽。所有这些都不需要在任何一侧都有特殊的黑盒子。

eql 驱动程序仅使用 Livingston PortMaster-2e 终端服务器进行了测试。我不知道其他终端服务器是否支持负载均衡,但我知道 PortMaster 可以做到,并且几乎和 eql 驱动程序所做的一样好(--不幸的是,在我目前的测试中,Livingston PortMaster 2e 的负载均衡比使用 28.8 Kbps 和 14.4 Kbps 连接的测试机器慢了 1 到 2 KB/s。但是,我不确定它是否真的是 PortMaster,还是 Linux 的 TCP 驱动程序。我被告知 Linux 的 TCP 实现速度非常快。--)

我建议 ISP 可能应该向负载均衡客户端收取第二条线路费用的 75% 和第三条线路费用的 50% 等等...

嘿,我们都可以做梦,你知道的...

2. 内核配置

在这里,我描述了使用 eql 驱动程序启动并运行内核的一般步骤。从打补丁、构建到安装。

2.1. 打补丁内核

如果您没有或无法获得包含 eql 驱动程序的内核副本,请从 ftp://slaughter.ncm.com/pub/Linux/LOAD_BALANCING/eql-1.1.tar.gz 获取驱动程序的副本。将此存档解压缩到诸如 /usr/local/src/ 之类的显眼位置。它将创建以下文件

-rw-r--r-- guru/ncm      198 Jan 19 18:53 1995 eql-1.1/NO-WARRANTY
-rw-r--r-- guru/ncm      30620 Feb 27 21:40 1995 eql-1.1/eql-1.1.patch
-rwxr-xr-x guru/ncm      16111 Jan 12 22:29 1995 eql-1.1/eql_enslave
-rw-r--r-- guru/ncm      2195 Jan 10 21:48 1995 eql-1.1/eql_enslave.c

将最近的内核(1.1.92 之后的版本)解压缩到诸如 /usr/src/linux-1.1.92.eql 之类的方便位置。使用符号链接将 /usr/src/linux 指向此开发目录。

通过运行以下命令应用补丁

cd /usr/src
patch </usr/local/src/eql-1.1/eql-1.1.patch

2.2. 构建内核

在打完内核补丁后,运行 make config 并为您的硬件配置内核。

配置完成后,按照您的习惯进行 make 和安装。

3. 网络配置

到目前为止,我只将 eql 设备与 Matt Dillon 的 DSLIP SLIP 连接管理器一起使用(--“如此快速地将自己的灵魂出卖给代码的人。”--)。您如何为其他“连接”管理器配置它取决于您。我看到的大多数其他连接管理器在处理多个连接时都做得不是很好。

3.1. /etc/rc.d/rc.inet1

在 rc.inet1 中,将 eql 设备 ifconfig 到您通常用于机器的 IP 地址,以及您为 SLIP 线路首选的 MTU。有人可能会认为,对于两个调制解调器来说,MTU 应该大约是通常大小的一半,对于三个调制解调器来说是三分之一,对于四个调制解调器来说是四分之一,等等...但是如果低于 296 太多,可能就有点过头了。这是一个 ifconfig 命令示例,用于设置 eql 设备

ifconfig eql 198.67.33.239 mtu 1006

一旦 eql 设备启动并运行,请使用使生活更轻松的酷炫的新路由语法,在路由表中向其添加静态默认路由

route add default eql

3.2. 手动绑定设备

手动绑定设备需要两个实用程序:eql_enslave 和 eql_emancipate(--eql_emancipate 尚未编写,因为当被绑定的设备“死机”时,它会自动从队列中取出。我还没找到编写它的好理由...除了为了完整性之外,但这并不是一个好的动机,是吗?--)

绑定设备的语法是 “eql_enslave <主设备名称> <从设备名称> <估计的 bps>”。以下是一些绑定示例

eql_enslave eql sl0 28800
eql_enslave eql ppp0 14400
eql_enslave eql sl1 57600

当您想将设备从奴役的生活中解放出来时,您可以使用 ifconfig 禁用该设备(eql 将自动埋葬死去的从设备并将其从队列中删除),或者使用 eql_emancipate 释放它。(--或者直接使用 ifconfig 禁用它,eql 驱动程序将为您取出它。--)

eql_emancipate eql sl0
eql_emancipate eql ppp0
eql_emancipate eql sl1

3.3. 为 eql 设备配置 DSLIP

一般的想法是自动启动并保持尽可能多的 SLIP 连接。

3.3.1. /etc/slip/runslip.conf

这是一个 runslip.conf 示例

name          sl-line-1
enabled
baud          38400
mtu           576
ducmd         -e /etc/slip/dialout/cua2-288.xp -t 9
command        eql_enslave eql $interface 28800
address        198.67.33.239
line          /dev/cua2

name          sl-line-2
enabled
baud          38400
mtu           576
ducmd         -e /etc/slip/dialout/cua3-288.xp -t 9
command        eql_enslave eql $interface 28800
address        198.67.33.239
line          /dev/cua3

3.4. 使用 PPP 和 eql 设备

我还没有对 PPP 设备进行任何负载均衡测试,主要是因为我没有像 SLIP 的 DSLIP 那样的 PPP 连接管理器。我从 LinuxNET:Billy 那里找到了一个关于 PPP 性能的好技巧:确保将 asyncmap 设置为某个值,以便不转义控制字符。

我试图修复一个 PPP 脚本/系统,以便在 2 月 25-26 日的那个周末(以下称为 8 小时 PPP 仇恨节)用于 eql 驱动程序重新拨号丢失的 PPP 连接。也许今年晚些时候。

4. 关于从设备调度算法

从设备调度程序可以用十几种其他东西代替,并可以更快地推送流量。驱动程序当前设置中的公式经过调整,可以处理具有差异很大的每秒比特“优先级”的从设备。

我所做的所有测试都是使用两个 28.8 V.FC 调制解调器,一个以 28800 bps 或更低的速度连接,另一个始终以 14400 bps 的速度连接。

一个版本的调度程序能够通过 28800 和 14400 连接推送 5.3 K/s,但是当链路上的优先级相差很大时(57600 对 14400),“更快”的调制解调器接收所有流量,“更慢”的调制解调器会饿死。

5. 测试人员的报告

有些人已经使用较新的内核(比 1.1.75 更新)试验了 eql 设备。由于删除了旧的“从设备均衡”驱动程序配置选项,我已更新驱动程序以在较新的内核中干净地打补丁。

  • 来自 LinuxNET 的 icee 在没有任何拒绝的情况下修补了 1.1.86,并且能够启动内核并绑定几个 ISDN PPP 链接。

5.1. Randolph Bentson 的测试报告

From [email protected] Wed Feb  8 19:08:09 1995
Date: Tue, 7 Feb 95 22:57 PST
From: Randolph Bentson <[email protected]>
To: [email protected]
Subject: EQL driver tests


I have been checking out your eql driver.  (Nice work, that!)
Although you may already done this performance testing, here
are some data I've discovered.

Randolph Bentson
[email protected]

Simon Janes 编写的伪设备驱动程序 EQL 可用于将多个 SLIP 连接捆绑到看起来像是单个连接的内容中。这使人们可以逐步改进拨号网络连接,而无需购买昂贵的 DSU/CSU 硬件和服务。

我进行了一些此软件的测试,目的是:首先,确保它确实如所述那样工作;其次,作为锻炼我的设备驱动程序的一种方法。

以下性能测量结果来自在两个 Linux 系统 (1.1.84) 之间运行的一组 SLIP 连接,一个使用带有 Cyclom-8Ys 的 486DX2/66,另一个使用带有 Cyclom-16Y 的 486SLC/40。(使用了端口 0、1、2、3。以后的配置将在板上的不同 Cirrus 芯片之间分配端口选择。)建立链接后,我定时传输了 289284 字节的数据的二进制 ftp 传输。如果没有开销(数据包头、字符间和数据包间的延迟等),则传输将花费以下时间

bits/sec  seconds
345600    8.3
234600    12.3
172800    16.7
153600    18.8
76800     37.6
57600     50.2
38400     75.3
28800     100.4
19200     150.6
9600      301.3

以较低速度和大数据包运行的单条线路达到此值的 2% 以内。对于更高的速度,性能受到限制(正如 Cirrus 数据手册所预测的那样),总计约为 160 kbits/秒。下一轮测试将在两个或多个 Cirrus 芯片之间分配负载。

好消息是,人们几乎可以充分利用第二条、第三条和第四条线路的带宽。(坏消息是,对于更高的速度,连接建立似乎很脆弱。一旦建立,连接就显得足够健壮。)

#线路

速度 kbit/秒

mtu

持续时间(秒)

理论速度

实际速度

最大值的 %

3

115200

900

_

345600

3

115200

400

18.1

345600

159825

46

2

115200

900

_

230400

2

115200

600

18.1

230400

159825

69

2

115200

400

19.3

230400

149888

65

4

57600

900

_

234600

4

57600

600

_

234600

4

57600

400

_

234600

3

57600

600

20.9

172800

138413

80

3

57600

900

21.2

172800

136455

78

3

115200

600

21.7

345600

133311

38

3

57600

400

22.5

172800

128571

74

4

38400

900

25.2

153600

114795

74

4

38400

600

26.4

153600

109577

71

4

38400

400

27.3

153600

105965

68

2

57600

900

29.1

115200

99410.3

86

1

115200

900

30.7

115200

94229.3

81

2

57600

600

30.2

115200

95789.4

83

3

38400

900

30.3

115200

95473.3

82

3

38400

600

31.2

115200

92719.2

80

1

115200

600

31.3

115200

92423

80

2

57600

400

32.3

115200

89561.6

77

1

115200

400

32.8

115200

88196.3

76

3

38400

400

33.5

115200

86353.4

74

2

38400

900

43.7

76800

66197.7

86

2

38400

600

44

76800

65746.4

85

2

38400

400

47.2

76800

61289

79

4

19200

900

50.8

76800

56945.7

74

4

19200

400

53.2

76800

54376.7

70

4

19200

600

53.7

76800

53870.4

70

1

57600

900

54.6

57600

52982.4

91

1

57600

600

56.2

57600

51474

89

3

19200

900

60.5

57600

47815.5

83

1

57600

400

60.2

57600

48053.8

83

3

19200

600

62

57600

46658.7

81

3

19200

400

64.7

57600

44711.6

77

1

38400

900

79.4

38400

36433.8

94

1

38400

600

82.4

38400

35107.3

91

2

19200

900

84.4

38400

34275.4

89

1

38400

400

86.8

38400

33327.6

86

2

19200

600

87.6

38400

33023.3

85

2

19200

400

91.2

38400

31719.7

82

4

9600

900

94.7

38400

30547.4

79

4

9600

400

106

38400

27290.9

71

4

9600

600

110

38400

26298.5

68

3

9600

900

118

28800

24515.6

85

3

9600

600

120

28800

24107

83

3

9600

400

131

28800

22082.7

76

1

19200

900

155

19200

18663.5

97

1

19200

600

161

19200

17968

93

1

19200

400

170

19200

17016.7

88

2

9600

600

176

19200

16436.6

85

2

9600

900

180

19200

16071.3

83

2

9600

400

181

19200

15982.5

83

1

9600

900

305

9600

9484.72

98

1

9600

600

314

9600

9212.87

95

1

9600

400

332

9600

8713.37

90

5.2. Anthony Healy 的报告

Date: Mon, 13 Feb 1995 16:17:29 +1100 (EST)
From: Antony Healey <[email protected]>
To: Simon Janes <[email protected]>
Subject: Re: Load Balancing

Hi Simon,
      I've installed your patch and it works great. I have trialed
      it over twin SL/IP lines, just over null modems, but I was
      able to data at over 48Kb/s [ISDN link -Simon]. I managed a
      transfer of up to 7.5 Kbyte/s on one go, but averaged around
      6.4 Kbyte/s, which I think is pretty cool.  :)