内容


在 PlayStation 3 上进行 Linux 开发,第 2 部分

内存操作

了解 PS3 Linux 上的内存大户

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 在 PlayStation 3 上进行 Linux 开发,第 2 部分

敬请期待该系列的后续内容。

此内容是该系列的一部分:在 PlayStation 3 上进行 Linux 开发,第 2 部分

敬请期待该系列的后续内容。

本系列的第 1 部分,我介绍了 PlayStation 3 (PS3)Linux 和它作为开发平台的优势和不足。本文是第二部分,介绍一些对运行 Linux 的 PS3 系统的性能会有显著影响的因素。

这里的建议并不适合所有人。如果您做的是图形处理,那么在运行系统的时候就不能没有 X。另一方面,如果你不需要图形处理,那么没有什么能比它更节省系统内存了。

如果以前使用的都是桌面系统,从来没有装入过交换(swap)驱动,那么本文对内存的重视看起来可能有些奇怪。但是实际上,PS3 本身并没有足够的内存,因此无法顺畅地运行现代的桌面 Linux 系统。在默认的 Fedora 7 安装中,系统在内存交换上花了许多时间(是您的时间)。内存交换对于任何系统都有很大的影响。对于使用 2.5 英寸硬盘的系统,对硬盘的访问通过 hypervisor 进行,它的主内存速度要比多数桌面系统的内存快得多,正因如此,与传统桌面系统的对比才更显得突出。

另一项提示:在我的测试系统上,在原始安装的 2.6.21 内核下的重新启动不稳定。2.6.23 内核修正了这问题,可以使用 PS3 增件 CD 中的版本,或者使用来自标准 Fedora 升级的版本。一般来说,来自 PS3 增件 CD 的内核可能是最佳选择。

降低内存消耗

这个主题的重要性恒久不变。对于多数桌面 Linux 用户来说,需要自己动手来减少内存的消耗,这已经是很久以前的事情了。而且,因为进程的增长会占满可用空间,所以即使只有 64 MB 主内存的服务器也被当成功能强大的服务器,实际上只是上面没有运行太多软件,所以不需要许多内存开销。虽然 PS3 系统不是个省内存的系统,但 Fedora 7 也不是为小内存系统设计的,虽然它很迷人。

为了减少内存消耗,先要找出内存的消耗大户。方法之一是使用 top 命令,它会实时地显示系统上的进程。默认情况下, top 按 CPU 使用情况排序显示进程,这对另外一种性能调优有用,但对跟踪内存大户来说并不是最佳途径。请注意 top 提供了内存使用情况汇总。例如,在运行 X 但关闭了一些服务的的 PS3 上,我得到这个结果:

清单 1. 我真的用了这么多内存么?
Mem:    219192k total,   213692k used,      5500k free,     7232k buffers
Swap:  4192956k total,        0k used,   4192956k free,    89468k cached

还是使用 top(就是在 shell 中运行 top 命令),然后输入 O(这是个大写的 O,意思是 “按……排序”),然后输入 q,然后按 回车键。在这种情况下,q 表示 “驻留大小”,会显示进程实际使用的内存数量。另一个可以使用的选项是 “虚拟内存”(选项 o)。

现在应该看到一个进程列表,按照物理内存的实际使用情况排序。下面是部分列表,同样也来自测试机。

清单 2. 我猜我确实是用了这么多内存
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3259 root      20   0 65424  36m 4996 S    2 17.2   0:01.39 Xorg
 3422 seebs     20   0 92900  24m  20m S    0 11.6   0:01.22 nautilus
 3439 seebs     20   0 58600  24m  22m S    0 11.5   0:00.36 nm-applet
 3473 seebs     20   0 56620  24m  14m S    0 11.4   0:01.22 /usr/bin/sealer
 3420 seebs     20   0 50248  21m  18m S    0 10.2   0:01.90 gnome-panel
 3476 seebs     20   0 48988  14m  10m S    1  6.9   0:00.64 gnome-terminal
 3445 seebs     20   0 33104  14m 9464 S    0  6.7   0:00.40 puplet
 3453 seebs     20   0 45764  13m  12m S    0  6.4   0:00.22 gnome-power-man
 3414 seebs     20   0 41920 9696 8052 S    0  4.4   0:00.29 gnome-settings-
 3418 seebs     20   0 22200 8996 7316 S    0  4.1   0:00.33 metacity
 3297 seebs     20   0 40544 8384 7088 S    0  3.8   0:00.32 gnome-session
 3432 seebs     20   0 20076 6120 5244 S    0  2.8   0:00.10 bluetooth-apple
 3444 seebs     20   0 14692 6060 3532 S    0  2.8   0:00.24 python

排前十位左右的内存大户都是与 X 相关的。这就是为什么如果真的想释放内存,要做的第一件事可能就是关闭 X。由于注意到许多应用程序是特定于 GNOME 的,所以您可能想试试 KDE,但是我想恐怕不会有效果。KDE 在 PS3 上的内存开支与 GNOME 不相上下。

实际上,如果绝对需要 X,那么最好是不使用 X 登录窗口提供的 X 会话环境,改用控制台登录,然后用小一些的窗口管理器和少一些的附加程序来启动 X。但是如何做到这点呢?首先是退出 top,回到提示符—只要按 q 即可。

利用运行级(runlevel)

运行级是许多 Linux 用户都没有机会了解的一项特性。它们实际上继承自 System V UNIX®,当然也有一些区别。运行级 是定义好的一套并行运行的系统服务。由于历史原因,常用的桌面 Linu 环境带有生成 Gnome 或 KDE 的图形登录应用程序,这种环境称为运行级 5。传统的没有 X 的独立工作站通常在运行级 2 下运行。在理论上,可以使用 /sbin 目录下的 init 命令直接修改系统的运行级。例如,(以 root 身份)运行 /sbin/init 2,就是告诉系统转移到运行级 2(通常这是通过中断运行级 2 不使用的服务,然后启动运行级 2 上使用的服务来完成的)。

默认的运行级由 /etc/inittab 文件中的一行设置,这一行看起来像下面这样:

清单 3. 默认运行级
		 id:5:initdefault:

这种格式是历史造成的,您要了解的就是要想有效地修改它,只要将 5 改成 2 或 3 即可。然后下次系统启动时,就会进入文本控制台登录提示符,而不会启动 X。

一个简单的事实就是:对于内存有限的开发系统来说,文本控制台比全功能的 X 环境更合适。所以现在要看看哪些功能是可以去掉的。请将 /etc/inittab 的 initdefault 值改为 3 并重新启动(实际上能够用 init 命令过渡,但是在一些特殊情况下这个命令不生效)。立即就能注意到系统启动快了许多。在登录之后,立即运行 top。结果与前面有异,内存可能只占满了一半,而不是像前面那样几乎全部占满。生效了!

内存开支还是很大

节省了一百兆内存固然不错,但是还能进一步瘦身。再次运行 top 命令会发现其他一些内存大户:

清单 4. 请原谅,我没记得自己运行了这些进程
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 2204 root      39  19 30056  12m 5632 S    0  5.7   0:00.70 yum-updatesd
 1825 root      20   0 19220 5052  972 S    0  2.3   0:00.00 python
 2238 haldaemo  20   0  6648 2728 2180 S    0  1.2   0:00.27 hald
 1909 root      20   0 13480 2236 1564 S    0  1.0   0:00.02 cupsd
 2015 root      20   0 12352 1976 1272 S    0  0.9   0:00.02 console-kit-dae
 1958 root      20   0 12132 1796  748 S    0  0.8   0:00.01 sendmail
 2301 root      20   0  5548 1792 1484 S    0  0.8   0:00.02 login
 2141 xfs       20   0  5388 1776  884 S    0  0.8   0:00.05 xfs
 2425 seebs     20   0  5392 1732 1480 S    0  0.8   0:00.08 bash
 2371 seebs     20   0  5392 1728 1480 S    0  0.8   0:00.08 bash
 1966 smmsp     20   0 10356 1576  696 S    0  0.7   0:00.00 sendmail
 2221 avahi     20   0  3772 1520 1344 S    0  0.7   0:00.07 avahi-daemon
 1751 root      20   0 11332 1348  588 S    0  0.6   0:00.43 pcscd
 1796 root      20   0 29652 1304 1032 S    0  0.6   0:00.02 automount

迄今为止,最大的程序是 yum-updatesd,这应该是与系统的 yum 更新程序有关的守护程序。幸运的是,没有这个程序我们也能做得很好;可以在需要的时候手动运行 yum。

编辑运行级

糟糕的是,没有一个特定的运行级是 “没有 yum-updatesd 的运行级 3”。这意味着现在需要开始手工删除服务。有两种方法可以手工删除服务。每个运行级都由 /etc/rc.d 中名为 rcN.d 的目录定义;例如,运行级 3 由 /etc/rc.d/rc3.d 中的文件定义(在 Fedora 7 系统上,在 /etc 中还有到这些目录的符号链接,但是使用完整路径是个好习惯)。

这类目录中,每个目录都包含许多文件,文件名有些神秘,例如 “K74nscd” 或 “S88nasd”。命名规范很简单:用 K 开始 的名称是进入该运行级时要停止的服务(假设从高运行级进入,在高运行级中可能正在使用它们),用 S 开始的名称是进入该运行级时要运行的服务。两位数字用来对服务排序,S13rpcbind 在 S14nfslock 之前启动,它们都在 S25netfs 之前依次启动。简单而且有效。

实际上,这些通常并不是文件,而是到 /etc/rc.d/init.d 中存储的脚本的符号链接。通常只有一个脚本负责启动或停止指定服务,然后做出相应的链接。当 init 修改运行级时,分别用 “start” 或 “stop” 参数调用脚本。

如果觉得这些操作太复杂,有些眼花缭乱,那么只要从运行级目录中删除不需要的 S 或 K 链接即可。类似的,也可以添加新的链接。另一个选项是使用 chkconfig 工具程序;这是个非常灵活和强大的工具,能够维护这些符号链接。提示:如果删除了重要的内容,可能必须使用恢复 CD(例如 Fedora 安装盘,请参阅 参考资料)才能再次干净地引导系统。在删除之前,请确定清楚这些东西是什么,有哪些内容依赖它们。

例如,如果想从运行级 2 删除 yum-updatesd 程序,只要删除链接 /etc/rc.d/rc2.d/S97yum-updatesd 即可。要用 chkconfig 从运行级 2 删除它,应该使用的命令是 /sbin/chkconfig yum-updatesd off

跟踪更多空间

使用 chkconfigtop 这两个命令,可以跟踪很多大内存用户,了解它们提供了什么,如果不需要的话就可以删除它们。但是 Python 进程是怎么回事?没有 Python 服务啊!ps 命令揭示了更多内幕:

清单 5. 跟踪 Python
	 $ ps ax | grep python
	  1825 ?        S      0:00 python ./hpssd.py

对启动脚本进行 grep 处理,能够看出 python 是 hplip 的一部分,hplib 提供了 “HP Linux 图形和打印” 服务。对于有些 HP 打印机和扫描仪来说这可能有用,但在其他地方可能并不需要。所以,如果还没有关闭这个服务,现在请关闭它。

在相当典型的专用开发系统上,最终合计使用的内存是 49,896KB,而开始时则为 213,692KB。可用内存也从 5,500KB 上升到 169,296KB — 对于运行编译器的空间是一个显著的改善。这个改善带来的效果取决于您的工作负载;许多后台守护程序,一旦被交换出内存,就会一直保持换出状态,使得系统的响应性提高。但是,时间一久,编译时间上的微小差异也会累积成明显的差异。

接下来如何?

可以看到,如果愿意牺牲一些不必要或者不使用的特性,那么能够回收大量系统内存,留出足够的内存来运行编译器和开始开发代码。但是,许多用户可能发现完全不使用 X 的代价太大。本系列的下一篇文章将介绍如何获得一个可以使用的 X 环境,执行一些简单的图形工作,同时又不损失执行编译器的能力。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux, Open source
ArticleID=309238
ArticleTitle=在 PlayStation 3 上进行 Linux 开发,第 2 部分: 内存操作
publish-date=05192008