弗吉尼亚电力公司——Linux 辛勤工作
我是弗吉尼亚电力公司的一名程序员,这是一家为弗吉尼亚州大部分地区和北卡罗来纳州东北部一小部分地区约 200 万客户提供电力的电力公司。弗吉尼亚电力公司的服务区域划分为五个区:北部、南部、东部、西部和中部。在我工作的运营服务组的职责中,包括维护一个集中式档案数据库,该数据库存储了每个区 SCADA 主计算机检索的所有模拟值的 30 分钟平均值。这些平均数据对于系统规划人员和负荷预测人员至关重要,并且在规划可能耗资数百万美元的大型建设项目时至关重要。处理所有这些数据是一项艰巨的任务,但 Linux 拯救了局面。
对于那些不是电力系统爱好者的人,这里做一些解释:SCADA 是 Supervisory Control And Data Acquisition(监控和数据采集)的首字母缩写,基本上是指通过安装在变电站的远程终端单元 (RTU) 从服务区域内各个位置检索实时模拟和状态数据。这些信息通过专用通信线路由中央主计算机获取,并在那里存储、分析并呈现给确保照明保持开启的运营人员,当照明未开启时,他们会 非常 忙碌。这些系统操作员(他们被称为)也可以在必要时远程操作现场设备,如线路断路器和电容器组(这是 SCADA 的监控部分);主计算机甚至包含几个反馈算法,可以根据系统状况自动操作设备。
弗吉尼亚电力公司还有另一个 SCADA 系统,用于监控整个电网,并为发电站提供自动反馈控制;这被称为能源管理系统,或 EMS。如果您想知道:是的,EMS 检索模拟值,就像分区计算机一样。是的,我们将它们存档到我们的中央数据库中。是的,Linux 也在这里拯救了局面。
在整个服务区域还散布着许多智能电子设备,如数字兆瓦时电表、数据记录仪、故障检测继电器和线路张力监视器,这些设备未直接连接到 SCADA 系统,但必须定期通过公共电话网络拨号连接以获取数据,不仅供系统操作员、规划人员和工程师使用,还供会计部门的人员使用。您猜对了——Linux 也 在 这个领域拯救了局面!
应该有足够的背景知识让我们开始;现在进入场景,正如我在 1992 年末加入运营服务组时存在的那样
分区 SCADA 计算机每 15 分钟通过专用串行线路将平均模拟数据转储到位于我们当地计算机房的冗余 PDP 11/84 计算机;这些机器吃力地(并且经常失败)处理所有被倾倒给它们的信息。EMS 系统的平均模拟数据每 6 小时通过串行 DECnet 链路转储到 MicroVAX,由于内部安全问题,只有在要进行传输时才能激活该链路。另一台计算机,IBM PS/2 型号 60,运行着我见过的最令人厌恶的商业软件(它将保持匿名;侮辱死者是不礼貌的),通过单条电话线,一次一个地艰难地拨打尽可能多的数字电表和记录仪。
每天清晨,来自 PDP、MicroVAX 和 PS/2 的前一天的所有信息都在分类、计算、合并、插值和更新的狂欢中被咀嚼,最终简化为一组 30 分钟的平均值,然后通过 DECnet 运送到我们的主存档系统(VAX 4000)并合并到主数据库中。哇!当时我正忙于其他项目,但在空闲时间,我研究了该系统的代码片段——我对这些遭遇的记忆只有战栗、冷汗和没完没了的 Fortran 源代码的噩梦。
我们的故事中的第一个英雄登场:Joel Fischer,工程师和技术布道者,微处理器计算机真正潜力的信徒,以及 Unix 的新手——在公用事业公司中有些罕见。(正如你们都知道的那样,大多数公司都会形成一种占主导地位的计算机哲学,这种哲学往往会给解决问题的方法蒙上色彩。在许多公用事业公司,官方口号通常是 IBM 大型机、运行 VMS 的 VAX、运行 DOS 或 Windows 或 Novell 的 PC。很少有 TCP/IP。而且很少有 Unix。)
Joel 于 1993 年初加入我们的小组。他的主要职责是维护平均模拟数据库系统。在处理了难以驾驭的 PDP、不配合的 PS/2 和喜怒无常的 MicroVAX 一段时间后,他开始认同我的信念,即 必须 有更好的方法来处理我们所有传入的数据。
因此,一系列富有成效和令人振奋的“隔间聊天”开始了。Joel 会来到我的隔间,提出一些关于如何改进系统的想法,我会以一些关于 他的 想法的想法作为回报,等等。无论如何,我们的小组有点像臭鼬工厂,因此这种低开销的问题解决方法是一个行之有效的原则。Joel 比我更熟悉我们公司的网络,并告诉我两个重要的事实:我们的企业骨干网覆盖了除西部地区之外的所有分区办公室,并且我们所有的路由器都是原生 TCP/IP——尽管事实上 TCP/IP 没有被少数几个专用系统以外的系统使用。
好吧,好吧,好吧。在最偶然的情况下,我当时正在家里研究 Linux,并且印象深刻,以至于我自己也变得有点福音派。我走过 Minix 和 Coherent 的道路,我对 GNU 和 FSF 并不陌生;我们在 VAX 4000 上运行 gcc 和 Emacs。
我只花了一个晚上在家就意识到 Linux 是一件好事。几周的使用和我的软件直觉(我想我 18 年的编程经验对 某些 事情有好处)告诉我 Linux 确实是一件非常好的事情。因此,我清理了我在公司机器上的一个磁盘分区并安装了 Linux,以证明它可以完成我声称它可以完成的事情。随后与来访我隔间的人的对话遵循了以下一般模式
“嘿,那是什么?”
“Linux,一个 copylefted Unix 克隆……”我发表了一篇关于自由软件及其许多优点的简短演讲。但你已经 知道 所有这些了。
“嗯?它会做(填写空白)吗?”
“当然。” 键盘敲击声。“给你。”
(当我启动 X-windows 时——哦,我的天哪!)
逐渐地,一个新的分布式数据收集系统的设计成形了。我们可以在每个分区计算机中心安装一台 PC,以接收来自 SCADA 主计算机的平均模拟数据,并拨打该分区中的所有现场设备(电表、继电器等)。我们中央办公室的一台机器将接收来自分区 SCADA 计算机的重复数据馈送,以提供数据冗余,并充当备份拨号系统。所有这些 PC 系统都可以通过企业网络使用 TCP/IP 连接在一起(西部地区除外,我们可以在那里使用 UUCP)。与 Vax 的连接有点问题,但我们最终确定使用高速专用串行链路和简单的文件传输协议。
当然,并非一切都一帆风顺。我们有反对者,他们质疑使用 个人电脑 来取代小型计算机的想法。我们怎么能确定 PC 的功能足够强大,可以处理所有传入的数据并拨打远程设备和处理网络?我们需要在内部开发的所有软件又该怎么办?与所有远程设备通信的协议转换器?将数据转换为适合提交到我们的 VAX 数据库系统的格式的软件?(当然,所有这些都是合理的担忧。与我们的“魔鬼代言人”的许多讨论对于帮助我们敲定系统的具体细节并提供最佳答案:可工作、可靠的软件!非常有价值。)
我们的故事中的第二个英雄登场:Lynn Lough,我们的主管。她知道这些数据对于公司高效运营和规划的重要性,并且她理解需要一个可靠、冗余的检索系统。Joel 和我提出了我们提议的系统。硬件成本:六台 486/66 PC 的价格,配备充足的 RAM 和磁盘空间。软件成本:零。(嗯,不 完全 是。不要忘记我们需要开发的所有内部软件。但你明白我的意思。)
我们向她解释了自由软件基金会的潜在理念;免费 并不总是意味着不好,而是通常意味着更好——因为软件不是为了赶上某些任意的营销截止日期而被匆忙推出,而是在持续改进和完善的环境中发布,来自任何地方的数百名最聪明的软件人才(那就是你们,伙计们!)将提供反馈。此外,有了所有东西的源代码,我们将永远不会受制于决定放弃对特定软件的支持或仅通过升级并收取高昂升级费用的供应商。
Lynn 权衡了所有利弊。她一定看到了我们眼中的热情,因为她做出了我们整个故事中最具决定性的决定:她说 是。
哇!几周之内,到 8 月中旬,我们已经在我们的计算机房里安装了 6 台漂亮的全新 PC。作为我们项目的主要程序员(实际上,因为我们有点人手不足,我是 唯一 的程序员),我卷起虚拟袖子,全身心投入。
(在为 Linux 开发了一年代码之后,我要响亮而清晰地说一件事:我宁愿爬过一英亩的“Visual This++”和“集成开发那个”才能到达 gcc、Emacs 和 gdb。谢谢。回到我们的故事。)
我们的第一步是选择一个提供我们所需的所有服务的内核——没有什么特别的,只是可靠的网络和 System V 型 IPC 原语。我们最终选择了 0.99.13s。我们购买了 8 端口串行板,为每台 PC 提供 10 个串行端口。对 serial.c 进行了一些快速更改以支持该板(如果没有访问源代码,这是不可能的,我 一遍又一遍 地向任何愿意听的人重复),我们就有了我们的基本系统。一旦我有喘息之机,我想发布我们正在使用的串行板的补丁:Omega COMM-8,它为每个端口提供可单独选择的 IRQ。同时,如果您有兴趣,请给我发电子邮件。
我们的下一步是尽快更换故障频出的 PDP,因为它们的不稳定导致数据丢失。我们已经有了双数据馈送。(实际上,来自每个分区的数据都通过单条串行线路输入,并在调制解调器的后端分叉,所以我们实际上并没有冗余数据输入;这是我们系统旨在纠正的弱点之一。)我们决定拿出我们的两台 PC,暂时将它们配置为 PDP 的即插即用替代品。为了实现这一点,我们必须能够接受当前形式的输入数据(由于各种原因,分区主计算机无法更改以修改它们向我们发送平均数据的方式),将其简化为数据库输入格式,并将其移动到数据库 VAX。
我认真对待 Unix 工具包哲学,而不是编写一个庞大的程序来完成所有事情,我编写了一组小型实用程序,每个实用程序只做一件事。对于运行时修改,我使用了小型配置文件,对于进程间通信(在必要时),我使用了消息队列。
很快,我就有了一个输入守护程序,它挂在串行线路上监视数据,一个检查程序,它确保我们及时获得每季度的文件并验证它们包含的点,一个平均程序,它计算 30 分钟的平均文件,一个构建器,它每小时构建一个数据库提交文件,以及一个 PC 到 VAX 守护程序,它通过高速串行线路实现了一个简单的传输协议。(当然,最后一个程序需要在 VAX 端有一个相应的守护程序,这意味着要涉足 VMS 领域。幸好我在那里有 gcc 和 Emacs!)
到十月的第三周,我们准备好进行试运行了。我们停止了一台 PDP,将数据输入线路转移到我们的 PC 上,并启动了 Linux。在 15 分钟内,我们的下一个平均数据周期已经发送,并且在我们 PC 的硬盘上安全地存放着 5 个我见过的最精彩的数据文件:来自每个分区的输入文件,每个字节都存在且已被清点。在 30 分钟内,我们有了我们的第一个计算平均文件。在一个小时内,我们有了我们的第一个数据库传输文件,整齐地存放在一个假脱机目录中,最终它会进入 VAX。
那天晚上我没怎么睡觉。在家登录后,我看着每个数据周期进来,心情就像在等待真正好的科幻电影一样。当然,我事先已经测试了所有这些软件,但是看到它在真实数据中实时工作比我愿意承认的更令人兴奋。
在这个里程碑之后,事件进展得非常快。到 11 月初,剩下的 PDP 被降级为备份状态,我们的 PC 成为我们存档数据库的主要数据源。到年底,那台 PDP 也消失了;第二台 PC 将作为我们的备份机器,同时我们将我们的 PC 安装在分区运营中心。
在接下来的几个月中,随着我们的 PC 逐渐迁移到它们在分区 SCADA 主计算机中心的永久住所,我将精力转向满足我们的智能设备拨号需求——记住所有那些需要定期轮询的兆瓦时电表、数据记录仪等等?更多代码需要开发——正合我意!
为了满足我们当前的需求,并为未来的拨号需求做好准备,我设计了一个通用拨号系统,它可以连接到几乎任何带有调制解调器和面向字节的通信协议的设备。拨号设备的请求被发布到消息队列;守护程序进程管理分配给设备拨号的所有电话线路。当消息队列中收到请求时,拨号管理器分配一条电话线路,fork 自身的一个副本以处理拨号和连接到设备的任务,并且一旦建立连接,exec 相应的协议任务以实际与远程设备对话。当协议进程终止时,父拨号管理器回收可用的电话线路,以用于任何进一步的拨号请求。如果拨号请求多于可用的电话线路,则拨号管理器会维护一个内部队列,其中包含所有常用的超时等。
这个拨号管理器方案听起来应该很熟悉——它受到了 inetd 超级服务器的启发。现在牛顿关于站在巨人肩膀上的那句名言是什么……?
我不会深入探讨为我们询问的各种设备编写协议任务的引人入胜和深奥的细节。到目前为止,我们已经开发了协议任务来与六种不同类型的设备进行通信,并且还有更多正在开发中。最后一次统计,我们的 Linux PC 定期拨打近一百个独立的设备。
我们的故事几乎已经到了今天,航行变得越来越顺利。我们已经在我们的 VAX 数据库机器上安装了 TCP/IP 堆栈,因此与我们的 Linux 机器的连接比以往任何时候都更容易。我们已经在我们的系统运营中心(这是我们故事开头提到的 EMS 系统)安装了第六台远程 Linux 机器,以负责检索 EMS 平均模拟值,以及处理该部门的一些拨号需求。我们目前正在开发一个虚拟拨号 SCADA 系统来补充我们的 SCADA 主计算机……但那是另一篇文章的主题了。
我们的 Linux 系统网络一直在处理全天候的数据检索工作——每 15 分钟处理约 12,000 个数据点——将近一年了,并且 没有 因为任何系统软件问题而丢失一个字节的数据!对于所有辛勤工作和才华横溢的 Linux 开发人员来说,最好的致敬莫过于我们的系统日复一日、时复一时地发出满意的嗡嗡声,绝对可靠。天哪,我开始认为 Linux 真的 是 自切片面包以来最好的东西!
尽管 Vance Petree 成年时最初是音乐作曲专业的学生,但他很快发现计算机是获得食物的更可靠手段。他已经在弗吉尼亚电力公司担任程序员 15 年,与他的妻子(一位挂毯编织者——这很像编程,只是更慢)和两只会说话的猫住在弗吉尼亚州里士满市中心 70 年历史的联排别墅中。可以通过电子邮件 vpetreeinfi.net 联系他。
Vance Petree (vpetreeinfi.net) 尽管 Vance 成年时最初是音乐作曲专业的学生,但他很快发现计算机是获得食物的更可靠手段。他已经在弗吉尼亚电力公司担任程序员 15 年,与他的妻子(一位挂毯编织者——这很像编程,只是更慢)和两只会说话的猫住在弗吉尼亚州里士满市中心 70 年历史的联排别墅中。