首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | HR | 镜像
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
搜索中心 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>系统管理>桌面应用>正文

通过并行提高Linux系统引导速度

http://www.oklinux.cn  2003-01-01  IBM developerWorks 中国网站  James Hunt   会员收藏  游客收藏  【 】 
您查看的文章来源于http://www.oklinux.cn

传统服务框架的缺陷

关键的是,只有当配置中的所有服务都启动以后,您才可以登录进入您的 Linux 系统。等待50个服务启动可能会需要若干分钟,而这本来应该是您享用Linux系统的时间。

我已经找到了一个加速这个过程的方法。注意这种方法不会停止任何服务。不管怎样,停掉那些不用的服务是很明智的,不仅是因为这样可以加快引导的速度(在机器可以登录之前需要运行的服务少了),而且,由于很多服务要以 root 用户身份来运行,停掉不用的服务会减少您的安全隐患。

扼要重述一下,当一个 Linux 系统引导时,它以一种连续的方式来运行所有的某个运行级所配置的所有服务——一个接一个地。这是一个耗时的操作。

或许一个很明显的加快服务启动速度的方法是并行地启动所有的服务,这样它们就可以同时启动。不幸的是,虽然这听起来很吸引人,却不可行。原因是各个服务之间存在依赖的关系。Linux没有把这些依赖关系完全显式地表示出来,但是事实上这些依赖关系是存在的。还记得我们先前讨论的关于链接名字格式的问题吗?在“S”和“K”之后的两位数决定了链接(也就是它们指向的服务)的运行顺序。这些数字确定了一个硬性的顺序,这样一定程度上也强化了服务之间的依赖关系。

服务之间的依赖关系

回顾清单 1,我们可以看到 network 服务(S10network)将在ntpd服务(S58ntpd)之前运行。这是我们所期望的,因为 ntpd 服务要求网络可达,以使它可以连接一个本地时间服务器。不幸的是,这个硬性的顺序并不能告诉我们足够的信息,并且会让人误解。例如,在清单 1中我们可以看到 lpd 服务(S60lpd)将在 network 服务之后运行。虽然这样对那些连接到网络并且使用网络打印机的 Linux 系统来说是正确的,但是这并不说明当背板上有一个 inkjet 打印机连接到本地系统时,lpd 服务还是必须要在 network 服务之后运行。实际上,在这种情况下,在启动 network 之前先启动 lpd 会更好一些。

再来看另外一个例子:crond (cron daemon)服务 (在清单 1中的 S90crond)也是在 network 启动之后运行。可是,如果您没有使用远程机器文件的 cron 文件,那么就应该让 crond 在 network 之前启动。

由于我刚才介绍的 Linux 下启动服务的传统方法有一定的局限性,往往倾向于“安全第一",让所有的重要的服务先启动,然后再启动余下的那些。

所以,尽管我们不能并行地启动所有的服务,但我们可以并行地启动那些相互间没有依赖关系的服务。当这些相互间无依赖的服务启动以后,我们可以启动那些所有依赖条件已经满足(也就是说,那些服务所依赖的服务已经启动)的服务。然后重复这一过程,直到所有服务全部启动。

这个看起来是一个复杂的问题,不过幸运的是,已经有一个现成的可以用来解决这个问题的程序。这个程序不是别的,正是 make。

通常当编译软件时,make 会提供我们所需要的严密的框架。所有我们要做的就是告诉 make 什么是服务之间的依赖;它可以去做所有的计算交叉依赖的艰难工作,并且,使用它的鲜为人知的标记 -j ,它可以作为许多"作业"而同步运行。

得出服务间依赖关系

如先前我间接提到的,传统的 Linux 系统没有显式地表示服务间的依赖关系,所以现在我们不得不自己去做一些艰难的工作,得出这些依赖关系。这可能会需要一段时间,因为您可能都不知道每个服务在做什么,更别提服务之间的关系了。然而,如果您没有完成这些工作,这种方法对您来说没有任何益处。(如前面所提到的,如果这种方法有实用价值,希望 Linux 发行商可以采用它,并且为我们做这些艰难的工作。)

现在,我们来做一个简单的实例。我们都知道,ntpd 服务需要网络,这说明 ntpd 服务依赖于network 服务。在 make 语法中这个依赖关系这样表示:

ntpd : network

我们还可以确定 netfs 服务(挂载我们所需要的所有NFS目录)依赖于网络。在我的系统(您的可能会不一样)上,autofs 服务(自动挂载网络文件系统)也依赖于 network 服务,因为我曾经自动挂载远程文件系统(您可能挂载光驱或者软驱)。我们的“依赖表”现在是这样:

ntpd : network

netfs : network

autofs : network

这看起来没什么,但是您知道这意味着什么吗?这意味着一旦 network 服务启动完成,我们可以并行地启动 ntpd,netfs 和 autofs 服务。

做为一个特定的例子,假设所有的服务都需要10秒才能启动。用传统的服务启动方法,启动 network,ntpd,netfs 和 autofs 服务需要40秒。而用这种技术,只需要20秒——节约的50%的时间。

为什么会这样?好了请看,network 服务启动需要10秒时间,但是(因为当 rc 脚本在运行时,机器处于完全多任务的状态)其余三个服务可以同时启动,所以这三个服务合起来的启动时间是10秒。

事实上,大部分服务需要的启动时间可能不是10秒,但是既然每一个服务要做一些完全不同的事情,启动它们所需要的时间会很可观。

样例实现

我在参考资料部分提供的压缩文件中有一个使用上述技术的样例实现。包括一个修改过的用于调用 make 命令的 rc 脚本,以及样例GNU makefile文件,分别是 runlevel.mk,start5.mk和stop5.mk。makefile 文件 runlevel.mk 是控制程序,start5.mk 文件和stop5.mk 文件分别是运行级5时启动和停止服务时的服务依赖描述文件。

注意所给出的启动和停止 makefile 文件提供的不是完全的服务间依赖关系列表,而仅仅是一个例子。同时也要注意,如果您不修改这些文件就在您的系统上使用,几乎不可能成功,因为您的服务列表可能和我的并不一样。

结束语(以及一些补充说明)

我提出了一种用来加快 Linux 机器引导速度的方法。这种方法允许系统在启动服务时启动顺序中靠后的部分服务并行启动,而不是以传统的串行方式启动,以实现引导的加速。这种方法在理论上没有问题,并且可以利用现有的系统工具实现。

这种方法的效率取决于需要启动的服务的数量和每个服务启动所需要的时间。并行的可行性主要取决于服务间的依赖关系。对于某些系统来说,使用这种方法可能只会有很小的改进,但对于其他系统,它可能会显著地影响引导速度。可以这样理解,每个系统都有不同的一组服务被激活,并且每一个服务需要不同的时间来启动。再强调一次,要使用这种方法,您需要确定您的特定系统的服务之间的依赖关系。

补充说明:

  • 一些服务程序仅仅是在后台运行一个程序,它们自己就退出了(也就是说,服务程序结束了,但是真实的工作仍然在后台进行)。这说明了一个事实,那就是传统的系统是不完善的,这种服务程序编写者试图在现有框架的界限内减少一些时钟周期。采用本文描述的这种方法将会使依赖关系更加显式化,不需要服务编写者再去“欺骗”。这种方法考虑到在这些服务程序之外建立一个更为高效的框架。

  • 当您希望“交互式”引导您的系统时,这里所提到的技术不再适用,因为您通常是当系统某些地方出错的时候才会这样去做;在这种情况下,您可能希望串行地去启动所有的服务以找出出错的原因。不过,修改系统的启动过程,来让用户在系统引导来选择是以串行的方式(允许交互的服务启动)或者“并行”的服务启动方式,是容易实现的。

  • 采用这种方法可能还需要更深入的考虑,因为如果传统的系统和新的系统都提供给用户,将需要同步维持两组关于服务如何启动的信息(有序的 rc.d/ 链接文件和运行级 make 文件)。一个更好一些的解决方案是 Linux 发行版本能从 makefile 文件自动生成链接文件,因为 makefile 文件比链接文件记录了更多的关于服务的信息。

  • 这个系统可能对一个专用的服务器来说并不适合,因为当一个服务发生错误时,管理员希望能在错误发生时在控制台中马上可以看到这个错误。不过,对于普通的终端用户来说,并行化的方法可以在允许用户查看是否有问题发生的前提下显著地加快引导速度。

  • 有趣的是,尽管我提出的这种方法从传统观点来看不是“类似Linux的”,但 Linux 基础标准 (LSB,Linux Standards Base)看起来并没有要指定 init.d 脚本的运行顺序,所以这种方法有可能被 Linux 发行商所采用,而且使之仍然符合 LSB。这对用户来说是一个好消息,如前面所提到的,因为发行商可以为我们计算出所有的软件包之间的依赖关系。

  • 有一种方法可能更为大胆,那就是 /etc/inittab 文件中的“action field”的“wait”修改为“once”。这样用户在服务启动完成之前就可以登录。不过,这已经超出了本文的范围。要得到更详细的信息请查阅 man inittab,并且请记住,UML是您的好帮手。

    参考资料

  • 下载用本文所讨论的方法实现的一个样例的压缩包。

  • 官方的 GNU Make 主页中有 make 程序的下载及 make 文档的链接。

  • LSB (Linux Standard Base) 的目标是明确定义 Linux 系统的构成。LSB 公共文档中包含了有关“系统初始化”的文档。

  • UML (User Mode Linux) 主页中有 UML 的下载及其文档的链接,使用UML您可以在真实的 Linux 系统上再启动一个“虚拟的”Linux 系统。

  • 如果需要一个完全的指南来帮助您开始使用 UML, 请参阅教程“用户模式 Linux 简介” (developerWorks, 2003年1月)。

  • DeveloperWorks Linux 专区有更多的为 Linux 开发人员准备的资源。

    关于作者

    James Hunt 是 英国 IBM Hursley 实验室的一名软件工程师。他不是一名赛车手,他的汽车也显然不是赛车。James 自己公开承认是一个Linux 迷,他一有机会就向其他的人来讲述相关的话题,并以此度过了很多美好的时光。他的工作内容是分布式平台(AIX,HP-UX,Linux,OS/400,Solaris和Windows)上的 WebSphere MQ 产品。他曾经做过 UNIX 系统管理员、数据库的管理和编程。他对 Linux 的文件系统和编译器感兴趣,并且他可能是现在仅有的 Perl 编码标准文档的作者。James 是一个古怪的人,喜欢写技术文档。在他的业余时间,他弹吉他,学瑜珈,开游艇,虽然他还未能设法把这些活动并行化。您可以通过 jameshunt-at-uk.ibm.com 与 James 联系。

    (责任编辑:赵纪雷)

    共3页: 上一页 [1] [2] 3 下一页

  • 上一篇:通过对TOS的优化提高防火墙性能   下一篇:如何实现Linux下文档快速排版

    收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
    相关文档
    ·如何实现Linux下文档快速排版
    ·通过对TOS的优化提高防火墙性能
    ·应用Linux下两种中文输入法
    ·搭建Linux平台上的网络音乐服务器
    ·应用 Xine 播放VCD和DVD的技巧
    ·用好Linux音频播放器—XMMS
    ·使用Kuickshow打造Linux下的电子像册
    ·在Linux上建立LDAP服务器(一)
    ·如何实现在Linux下播放流媒体
    ·用RipperX轻松制作MP3
    ·教你如何使用GIMP处理数码照片
    ·OpenOffice中样式的使用
    ·用RedOffice进行幻灯片实时修改
    ·让Red Hat9.0与XP组成双系统
    ·使用Linux备份Windows
    ·剖析无线网络中的 Linux 窍门
    发表评论
    密码: 匿名评论
    评论内容:

    (不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
     
      最新文档
    ·Aurorae: KDE 4 新的窗口边框主题引擎
    ·Google Chrome 主题库
    ·Bespin-被KDE4遗忘的主题
    ·10 套不错的 GNOME 主题
    ·无人值守安装Linux系统
    ·巧妙管理Linux服务器存储空间
    ·值得期待的Fedora 11操作系统新特性简
    ·面对CSS跨站攻击 IE与FireFox态度不一
    ·网友分享:在Linux系统上玩转磁盘阵列
    ·Ubuntu系统技巧之登录时查看“每日一句
    ·专家观点:Linux系统管理学习路线图
    ·开源办公软件 KOffice 2.0 Beta 7 发布
      阅读排行
    ·linux无线网卡设置与安装
    ·Ubuntu多媒体播放器的安装与配置
    ·VNCServer 配置 及Vncview的使用
    ·用新型D-BUS与Linux桌面应用程序通讯
    ·与微软相媲美! Ubuntu v8.04组图欣赏
    ·10 套不错的 GNOME 主题
    ·如何安装和使用wine
    ·菜鸟也疯狂:Linux桌面应用全攻略
    ·2008年Linux的25个顶级游戏
    ·安装Sony VAIO和HP Pavilion本本内置摄
    ·Linux高手过招:量身定制Linux桌面
    ·10套优秀的 Linux 图标 美化你的 Linux
    ·linux虚拟光驱介绍
    ·U盘Linux的制作
    ·引导装入工具Grub入门到精通
    网摘收藏: