分类: LINUX
2008-05-02 15:24:45
物理内存不足可能会严重影响 Linux® 的性能。在本文中,我们将学习如何精确地度量 Linux 系统所使用的内存量。还将以 Ubuntu 系统为例学习有关降低内存需求的实践建议。
Linux 广受追捧的一个优点是它比 Microsoft® Windows® 的效率更高,因此在不太前沿的硬件上也能很好地执行。对于依然使用 Windows 98 时代的机器的人来说,最新最卓越的软件(特别是安全补丁)已经不再支持这些机器,因此这种性能优势使 Linux 成为颇具吸引力的升级产品。
然而,问题的真相在于虽然 Linux 内核仍然可以配置成合理的大小和效率,但由于新计算机的处理能力大大加强,很多 Linux 桌面环境(例如 KDE 和 GNOME)都增加了许多特性。因此,在较老的硬件上默认安装大多数发行版时,提供的性能都不是一流的。很多现代应用程序也是如此,例如,Firefox 之类的 Web 浏览器和 OpenOffice 之类的办公套件均功能完备,但是尝试在只有 128MB RAM 的机器上运行这些程序,可能会成为非常痛苦的体验!
该怎么办?丢掉所有旧的硬件然后升级?还是安装 1995 年左右的 Linux 发行版?(如果您决定走这条路,我记得使用 Linux-FT 是一种很好的体验。)
不要担心:多年以前,Linux 社区中的人就已经认识到这个问题,Linux 内核和发行版的一大特性(有人喜欢说 这个 伟大特性)在于其能够定制。本文将介绍如何对 Linux 系统进行裁减,以便在小容量的硬件上获得更好的性能。
在大多数情况下,桌面操作系统性能的一个最重要因素就是系统可用的内存量。虽然拥有快速的处理器效果不错,但是如果没有足够的物理内存保证一直很好地利用处理器,系统可能会花费大量时间用于在物理内存和交换空间之间的交换数据(这种情况称为 磁盘抖动),而 CPU 的大部分时间都是空闲的。因此对于老式的系统来说,额外添加内存通常是提高性能的最简单方法。然而,有很多原因决定了这种方法不太可能,例如缺少空闲插槽,对于一些系统(尤其是笔记本或基于 RAMBUS 的系统)来说,则是缺少买得起的 RAM,以及不希望在一台过期的系统上花更多钱这个容易理解的心理。
如果无法或不愿意升级 RAM,接下来最好减少系统上的 RAM 需求。本文将展示为 Linux 机器打造内存天堂 5 个简单步骤。
惟一需要做的重要选择就是要安装的 Linux 发行版和桌面环境(DE)。尽管这是截然不同的选择,但是发行版的选择可能影响 DE 的选择。虽然没有任何东西能够阻挡您在系统上安装软件,例如在 Ubuntu 上安装 Fluxbox;但是您会发现如果简单地使用发行版所附带的默认 DE,一切就会轻松很多。
在本文方案中,目标是寻找面向桌面的简单发行版,以便于新用户使用。我从 Ubuntu 6.10 开始入手,它和 GNOME 2.16 一起推出。
对于基本系统来说,我选择了一台配有 800MHz 处理器和 256MB RAM 的老机器。我将执行了两次测试,一次使用全部 256MB RAM 正常引导,一次在内核行上附加了 mem=128M
,这会强制内核只识别 128MB 物理内存。这样就可以有效地试验 256MB 和 128MB 的机器,而不必实际使用另一台物理机器(也不必反复从机器中插拔内存)。这个内核行选项能够足够近似地模拟 128 MB 的机器的行为;注意,如果真的只有 128MB 内存,可能会遇到其他问题,举例来说,要使用 Ubuntu,必须使用一个不同于普通机器磁盘的安装盘,它是专门为少于 192MB RAM 的机器准备的。
为了了解基本水平的内存使用情况,引导该系统,登录到桌面系统,并启动一个终端(在本文后面的内容中,我将这种设置称为 基本使用水平(base level));然后使用 free
命令来检查系统中的空闲内存量,结果如清单 1 所示。
ubuntu # free total used free shared buffers cached Mem: 255988 231704 24284 0 6432 139292 -/+ buffers/cache: 85980 170008 Swap: 746980 0 746980 |
第一行说明 256MB RAM 中有 231MB “正在使用”。下一行告诉我们尽管有 231MB 内存正在使用,但是应用程序只使用了其中的 86MB;缓冲区和高速缓存使用了其余的内存。
要评价性能,该清单中最重要的部分是 Swap
一行;它告诉我们当前没有使用任何交换空间,这说明目前没有真正遇到内存问题。系统现在可以全部装入物理内存,而不必借助慢速的基于磁盘的交换空间。
然后,为了了解系统的日常使用情况,启动一个 Web 浏览器(Firefox 2.0),然后用其打开 developerWorks,将即时消息客户机(Gaim)连接到 MSN,并使用文件管理器来浏览文件夹,又在 OpenOffice 中打开一个相当大的 Microsoft Word 格式的文档。(在本文剩余的部分中,将这种设置称为 轻量级使用水平(light usage level)。)
一旦成功加载这些之后, free
命令将如清单 2 所示。
ubuntu # free total used free shared buffers cached Mem: 255988 252196 3792 0 21276 87500 -/+ buffers/cache: 143420 112568 Swap: 746980 18676 728304 |
可以看到内存部分稍有变化。现在应用程序使用了 143MB 的物理内存,其余的内存均被缓冲区占用;另外,系统现在使用了 18MB 的交换空间。在这种轻量级的办公任务情况下,系统的可用性通常看起来很不错,但是已经没有太多发展空间了,可能无法进行需要资源更多的操作,例如编辑巨大的数字照片或视频文件,因为系统很快就会在处理时发生停歇。
为了了解系统在只有 128MB 时的执行情况,我重新引导了系统,并在内核行后面附加了 mem=128M
选项,就像前面介绍的一样。在与清单 1 同样的基本使用水平上,使用 128MB RAM 得到的结果如清单 3 所示。
ubuntu # free total used free shared buffers cached Mem: 126100 121464 4636 0 1636 37000 -/+ buffers/cache: 82828 43272 Swap: 746980 17924 729056 |
可以看到现在只使用了 128MB 内存,已经开始使用交换空间了,并且现在实际上还没有开始执行任何操作。
启动同一组应用程序产生的结果如清单 4 所示。
ubuntu # free total used free shared buffers cached Mem: 126100 123608 2492 0 392 51208 -/+ buffers/cache: 72008 54092 Swap: 746980 98452 648528 |
从这些数字中可以预测出,现在该机器在正常使用时的响应能力非常低,对于这些简单任务来说基本上还可以使用,但是会非常频繁地访问磁盘,我肯定不喜欢使用它作为自己的主要机器。可以看到应用程序需要的内存总量大约是 170MB,但内存中只装入了 72MB,因此 98MB 被转移到交换空间。这有助于解释系统响应能力降低的原因!
下一组测试,我决定使用 Xubuntu,这是与 Ubuntu 有关项目的发行套件。这个发行版与 Ubuntu 非常类似,但使用了 Xfce 4.4 Beta 2 DE,而不是 GNOME。与更为流行的 GNOME 和 KDE 项目不同(它们强调的是实现最佳功能),Xfce 被设计成轻量级的,因此有望更好地满足过期硬件的要求。我们将使用这个发行版执行与 Ubuntu 相同的测试。
在清单 5 中可以看出基本 DE 大约少使用了 25MB 的应用程序内存,并且缓冲区和缓存所使用的内存显著少于 Ubuntu(这可能意味着文件操作较少)。
xubuntu # free total used free shared buffers cached Mem: 255988 170964 85024 0 6004 104700 -/+ buffers/cache: 60260 195728 Swap: 746980 0 746980 |
在清单 6 中,再次启动那套测试应用程序(Web 浏览器、IM 客户机和文字处理器)。可以看到对于相同的应用程序组合,所需的内存比 Ubuntu 大约减少了 20MB(其中 126MB 位于物理内存,17MB 位于交换空间,总共是 143 MB;在 Ubuntu 上是 143MB 加 18MB,总共是 161MB)。
xubuntu # free total used free shared buffers cached Mem: 255988 252180 3808 0 1972 124008 -/+ buffers/cache: 126200 129788 Swap: 746980 16956 730024 |
清单 7 给出了只有 128MB RAM 时的基本使用水平。这次这个内存有限的系统表现良好,没有使用交换空间。
xubuntu # free total used free shared buffers cached Mem: 126100 123228 2872 0 4252 60484 -/+ buffers/cache: 58492 67608 Swap: 746980 0 746980 |
在清单 8 中,再次启动测试应用程序。虽然与 Ubuntu 相比,这个系统的表现更好,但是它依然使用了大量的交换空间,这个机器依然有些缓慢(只稍微比 Ubuntu 好一些)。
xubuntu # free total used free shared buffers cached Mem: 126100 123980 2120 0 468 56276 -/+ buffers/cache: 67236 58864 Swap: 746980 64516 682464 |
从这些数字可以看出,Xubuntu 在整个过程中使用的内存通常更少;因此如果您的系统只有 128MB(或更少内存),这可能是较好的选择。
Linux 发行版的一个重要特征是它们通常不需要花费任何费用,因此很容易下载多个发行版,然后逐一试用一段时间,从而确定喜欢使用的发行版,及其在硬件上的执行情况。如果硬件非常有限,可能希望考察一下 Damn Small Linux 之类的发行版,它宣称可以在只有 16MB RAM 的 486DX 处理器的系统上运行。
由于我的 256MB 系统上还有一点可用空间,所以通常喜欢使用 KDE,因此我尝试了 Ubuntu 的另一个派生版本 Kubuntu,它是基于 KDE 的,在内存使用方面大致介于 Xubuntu 和 Ubuntu 之间。作为参考,清单 9 展示了 Kubuntu 的基本使用水平。
kubuntu # free total used free shared buffers cached Mem: 255988 244736 11252 0 7612 160008 -/+ buffers/cache: 77116 178872 Swap: 746980 0 746980 |
选定了发行版之后,接下来的事情是选择要使用的应用程序组合。不同应用程序的内存需求可能差异很大;有时需要在规模和功能之间进行权衡,但是在另外一些情况下,即使功能相同的应用程序对内存的需求也可能存在巨大差异。
为了度量本文的内存使用情况,我们将使用 exmap
工具。该工具比 ps
或 top
更精确,因为它考虑了多个应用程序使用的共享库。例如,如果两个应用程序使用了相同的共享库,各占 1MB 内存,ps
会显示这两个应用程序均额外使用了 1MB 内存,exmap
则能更准确地显示每个应用程序都只使用了 500 KB 内存。这种精确性对于评价 KDE 和 GNOME 之类的桌面环境非常重要,因为在这些情况下应用程序之间会大量使用共享库。
对于在下面几部分讨论的每个应用程序,我测量了 exmap
所生成的 resident 和 effective resident 值。resident 值表示进程使用的物理内存总量,包括其他进程使用的共享库;该值通常与 ps
或 top
输出的值相同。effective resident 值是将共享库占用的内存平均分配给各个共享进程得到的;从指定进程所消耗的系统内存角度来看,该值更加精确。
还需要注意,在确定进程的全部内存开销时,还应该考虑 mapped 和 effective mapped 的值,它是进程中位于交换空间中的那些部分。mapped 值与 resident 值类似,但是它针对交换空间中的页面,而不是物理内存中的页面。因此要查看不考虑共享库时的数据,可以将 resident 和 mapped 值加在一起;要查看考虑对共享库时的数据,就需要将 effective resident 和 effective mapped 值加在一起。在制作该表时,并没有 记录这些值,这是因为对于我们的测试来说,交换空间中并没有什么进程,因此,对于这些列,exmap
命令输出结果的值均为 0。
对于表 1 中的各个浏览器,均启动了这个程序,并打开了 developerWorks 主页,然后等待它们全部显示出来。结果如表 1 所示。
应用程序 | Effective resident 内存(KB) | Resident 内存(KB) |
---|---|---|
Firefox | 27708 | 35068 |
Opera | 20477 | 27816 |
Konqueror | 13479 | 29748 |
Dillo | 2776 | 6888 |
Lynx | 1101 | 1540 |
从该表可以看出,这些浏览器的内存使用情况存在很大差异,内存需求最高的浏览器(Firefox)使用的内存比需求最低的浏览器(Lynx)多了大约 27 倍。这并不是非常公平的比较,因为 Lynx 并不能实现同样的功能(举例来说,它甚至不能显示图形),但这说明,可以根据需求极大地降低内存的使用情况。尽管表 1 中列出的前 3 个浏览器的功能与第一个浏览器的功能多少有些相同,但 Opera 使用的内存大约只有 Firefox 的 2/3,Konqueror 使用的内存比 Firefox 少一半。
对于要求不太高的使用需求来说,Dillo 是介于功能完善的浏览器和只有少量开销的 Lynx 之间的折中方案。Dillo 提供了一个 GUI;但在默认状态下其功能相当有限,没有其他插件时甚至不支持 SSL!
还需要注意我们对共享内存的使用也进行了比较,Konqueror 的执行情况比 Firefox 更好,它使用的内存大约少 14MB;然而,如果查看一下总体使用情况,Konqueror 也仍然高于 Firefox,但差距不大,大约只有 5MB。这是因为 Konqueror 大量地使用了 KDE 共享库,使用 KDE 桌面时,这些库被加载到各种应用程序。然而,如果没有使用任何其他 KDE 应用程序,Opera 将是比 KDE 更佳的选择。稍后我们将更加详细地讨论这个问题。
为了测试文字处理器,我加载了首次对表 2 中列出的文字处理器进行测试时使用的同一个 Microsoft Word 格式的文档。
应用程序 | Effective resident 内存(KB) | Resident 内存(KB) |
---|---|---|
OpenOffice Writer | 70114 | 81960 |
AbiWord | 58029 | 65224 |
KWord(来自 KOffice) | 46512 | 60096 |
从这些数字可以明显看出,OpenOffice Writer 使用的内存比 KWord 或 AbiWord 都要多。KWord 使用的内存仅次于 OpenOffice,它在正确地显示 Microsoft Word 格式的文档方面做得最好。尽管 AbiWord 也可以成功地打开该文档,但在正确显示文档时会遇到一些问题,因此如果对您来说与 Microsoft Office 的协作非常重要,最好选择 OpenOffice。
为了测试即时消息,我使用表 3 给出的 IM 客户机分别登录到 MSN Messenger 帐号中。
应用程序 | Effective resident 内存(KB) | Resident 内存(KB) |
---|---|---|
aMSN | 18455 | 20344 |
Gaim | 13456 | 21464 |
Kopete | 10988 | 24176 |
KMess | 7154 | 19660 |
此处,Kmess 最适合我,并且它是合理的选择,因为我只对连接到 MSN 感兴趣。如果需要使用其他服务,那么 Kopete 似乎是最好的选择。不过要注意,如果使用不同的 IM 协议,应用程序使用的内存可能会增加;另外,Kmess 是集成的 KDE 应用程序,如果没有使用 KDE,Gaim 可能更适合您。
现在您已经了解如何分析应用程序的内存使用情况;可以对自己感兴趣的所有应用程序类型简单地重复这个过程,体验各种可用选择,直到找到内存需求最低又能满足功能需求的选择为止。
在上面的 Web 浏览器一节中,您可能会注意到:在使用应用程序时,最节省内存的通常是与桌面环境紧密集成的应用程序。这是因为这些应用程序通常大量使用嵌入到 DE 中的共享库,并且这些共享库可能早已加载到系统中。举例来说,Konqueror 是 KDE 的文件管理器和 Web 浏览器;因此,它在 KDE 系统上运行时使用的内存明显少于 Firefox,这是因为它的大部分功能已经通过其他应用程序加载到该系统。类似地,如果希望使用 RSS 聚合器,Akregator 可能是很好的选择,因为它同样非常可能使用相同的库。
因此,如果您注重内存使用情况,则在自己的 系统上执行这些测试非常重要,这是因为很难通过查看他人的基准测试结果来了解哪个应用程序在您的系统上使用的内存较少。
这个事实对于选择 DE 也有影响。举例来说,如果真正希望使用 Konqueror,则使用 KDE 作为 DE 可能最为有效。类似地,如果您是 GNOME 用户,在使用您感兴趣的简短 KDE 应用程序之前需要三思,因为它可能会使用整个主机来加载库,但只有自己会使用这些库。
选定发行版、桌面环境和应用程序组合之后,哪些工作还可以降低使用的内存呢?要回答这个问题,需要对系统进行深入挖掘和配置。借助 exmap
,可以分析出系统上正在运行的内容,然后尝试删除不需要的内容,并按照自己的需要对系统进行配置。
较好的着手点是系统引导时自动启动的服务,但这样做需要非常小心,才不至于删除系统运行时需要的任何内容。需要研究具体的发布版需要哪些内容,以及服务的配置方式,因为各个发行版的这些内容可能有所不同。有些发行版比其他发行版差,因为它默认启动很多不需要的服务,例如 Web 服务器等,这会占用大量内存。
除了系统服务之外,您可能还希望了解 DE 的配置情况,因为它也可能启动不需要的服务。
我的 Kubuntu 系统看起来并没有启动太多不必要的服务,但是快速查看一下进程列表,就会发现一些明显能够删除的内容:
只需花 5 分钟进行配置,就能节省 14MB 左右的内存,与最初大约节省 77MB 相比,这是不错的着手点。
深入了解您的 DE 和其他大型应用程序的设置非常值得,因为有些设置可能会影响所使用的内存量。举例来说,通过减少虚拟桌面的个数,也许可以节省一些内存,使用较大的位图作为背景时尤其如此。关闭一些奇异的显示特效也可能有所帮助。
在使用旧硬件时,应该考虑到该机器的局限,并正确地进行操作。举例来说,如果希望编辑一组照片,请不要同时打开所有照片。这样只会不必要地消耗内存。如果依次打开,并且编辑之后立即将其关闭,就会简单很多。类似地,如果您正在尝试捕获并编辑一些视频,请考虑单独捕获每一个屏幕,而不要一次捕获所有屏幕;如果正在创建包含图形展示的大型文档,则在编辑完文本之前不要添加图片。
最后一个步骤是查看系统中的内存大户,并找出是否可以从某处节省一些内存。有很多节省内存的机会,但性能就会有所下降,对于大多数人来说,对性能产生的负面影响和所需的工作量,使得这样做非常不值得。不过,可以考虑下面一些操作:
只使用硬件特有的驱动程序重新编译内核。大部分主流发行版都适合于大量硬件,因此它们通常支持您没有使用的很多硬件。这可以产生一定的优势,尽管以模块形式存在的硬件支持在不需要时不会加载到系统中。
重新编译特定的应用程序或库,这样就可以对大小进行优化,使其专门用于正在使用的特定 CPU,从而也可以节省一些内存。Gentoo 发行版在这个方面做得非常好,您可以使用自己选择的确切编译标记轻松地重新编译某些或所有系统组件。遗憾的是,这个过程在老机器上执行时可能非常漫长。
删除应用程序或库的某些特性,然后对其重新编译也可以降低一些内存需求。借助 Gentoo 又是很好的主意,因为它包含 USE
标记的概念,允许在禁用应用程序的特性之后,轻松构建系统。这样可以极大地减少应用程序的大小,应用程序发布时通常都支持大量的文件格式、编码等,这通常需要加载一些库来提供实际支持。如果您知道自己永远都不会阅读(比如说)JPEG 文件,就可以在 Gentoo 中说明这一点(通过 USE="-jpeg"
),这样任何处理图形的应用程序编译后都不支持 JPEG,从而可以降低内存负载。
最近推出的 2.6 内核有一个 swappiness 参数,它可以在运行时进行调优。这个参数决定了,将应用程序移动到交换空间而不是移动到正在减少的高速缓存和缓冲区中的可能性,在前面的测试中可以看到,将应用程序交换出去,而保留大块物理内存以进行缓存的情况很常见。通过降低交换出去的可能性,缓存可能减少,这样就可以在内存中保留更多应用程序。但是,这种移动是否真正会使机器运行得更快,取决于正在运行的应用程序。如果在应用程序之间频繁地换入换出,那么机器的响应能力可能会提高,因为它们位于内存中的概率增加了;然而,如果有一个任务会执行大量磁盘读写操作,这样做可能速度很慢。通常,降低 swappiness 可以提高交互式应用程序的响应能力,但是会降低系统的总体吞吐量。
本文的思想可以使您的老机器重新焕发青春(以及其他一些安全性),并在老式硬件上更好地使用 Linux。测量结果显示,一台 800-MHz/256-MB 的机器可以很好地运行一个相当好用的 Linux 桌面,以满足轻量级的日常办公和家用需求,如发送 e-mail、浏览 Web、文字处理等工作。稍作调整并进行实验,即使 128MB 的机器也可以成为令人满意的桌面计算机。
尽管本文重点讲述在相当有限的硬件上实现功能良好的桌面,也可以对其他 Linux 应用采用相同的原理。不管最新的超大机器上有多少内存,很快就会发现新应用程序已占满了这些内存。通过应用这些技术,可以稍微提高过载服务器的性能,并深入了解应用程序的内存使用情况。
原文链接:http://www.ibm.com/developerworks/cn/linux/l-linux-memory.html