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 干净地进行了修补。 已经对 v1.1 补丁进行了 1.1.92 的一些测试,该补丁仅是为了在最新的内核源代码树中干净地进行修补而创建的。 (是的,它工作得很好。)

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 太多可能就有点过分了。 这是一个设置 eql 设备的 ifconfig 命令示例

ifconfig eql 198.67.33.239 mtu 1006

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

route add default eql

3.2. 手动从属设备

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

从属设备的语法是 “eql_enslave <master-name> <slave-name> <estimated-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 脚本/系统,用于重新拨打丢失的 PPP 连接以与 eql 驱动程序一起使用,时间是 95 年 2 月 25-26 日的周末(以下称为 8 小时 PPP 仇恨节)。 也许今年晚些时候。

4. 关于从属调度程序算法

从属调度程序可能会被十几个其他东西替换,并能更快地推送流量。 驱动程序当前设置中的公式经过调整,可以处理具有截然不同的每秒比特数“优先级”的从属设备。

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

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

5. 测试人员报告

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

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

5.1. Randolph Bentson 的测试报告

From bentson@grieg.seaslug.org Wed Feb  8 19:08:09 1995
Date: Tue, 7 Feb 95 22:57 PST
From: Randolph Bentson <bentson@grieg.seaslug.org>
To: guru@ncm.com
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
bentson@grieg.seaslug.org

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/sec。 下一轮测试将在两个或多个 Cirrus 芯片上分配负载。

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

#行数

速度 kbit/sec

mtu

秒数持续时间

理论速度

实际速度

%of max

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 <ahealey@st.nepean.uws.edu.au>
To: Simon Janes <guru@ncm.com>
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.  :)