[转]自己动手提高ubuntu/Linux系统的性能(一)
[转]迁移linux到另一块硬盘(分区),首战告捷

[转]自己动手提高ubuntu/Linux系统的性能(二)

獨立的圓 posted @ 2008年1月19日 05:33 in Linux with tags linux , 6888 阅读

 本站文章已轉移,敬請移步:http://www.xxb.me/ ,謝謝!

实战演练

在经过上面基础知识的介绍,就算是超级新手,也大概应该明白一些东西了。好,下面我们就进入实际调整的环节。同样,所有内容都是基于我的ubuntu feisty系统,如果你的不是这个系统,请仔细核对后再实践,我不对任何内容做“肯定可行”的保证。

加快系统启动速度

刚才我们已经介绍过了,每次开机启动的时候,启动脚本都放在/etc/rc*.d/目录下,这个*取决于你的运行级别。但是,并不是所有的脚本都是 你目前这个系统需要的。如果把那些你不需要的启动进程都去除,那么不仅仅是系统启动速度会变快,开机后分配给你使用的资源也会增多。

所以现在,我会告诉你一些常见的可禁止的启动进程。在此之前,我得提醒各位,对于那些我没有提及的进程,除非你很清楚知道自己在干什么,否则最好不 要去动它们,比如gdm(Gnome桌面)或者module-init-tools(内核模块)这种,要是误操作了,系统错误可别怪我……

事实上,我们可以通过系统–》管理–》服务的图形界面来做这种活,但是在这里,它并没有列出所有的服务,因此,为了对所有的启动进程都能进行自定义,我们选择sysv-rc-conf工具来进行操作。可以通过

$ sudo apt-get install sysv-rc-conf

命令来安装它。然后以root权限打开,界面如下:

sysv-rc-conf(点击缩放)

第一行的一排数字表示你的系统运行级别,对应的列就是该级别对应的启动进程,具体打开和关闭启动进程的操作方式很简单,下面就有说明。

好了,介绍一下常见的可以考虑去除的进程吧

* anacron — 这是一个一个自动化运行任务守护进程。你可以把它屏蔽,然后用cron来安排计划任务。

* atd and cron — 如果你根本就不会使用计划任务功能,那么可以连这个也不要。不过它占用的资源极少,不是特殊情况也没有必要禁止它。

* apmd — 这是一个电源管理方面的服务,专门用于监视那些不支持ACPI的旧系统的电池。如果你使用的笔记本比较新,或者使用的是台式机,就没有必要要它。

* acpid — 这个服务用于监视电池电量,以及那些键盘上的特殊功能键,比如屏幕亮度调整键,音量控制键,无线网卡开关等等,也可以监视台式机键盘上一些网络应用等类似快捷键。如果你使用的不是笔记本,也不需要这些快捷键,就可以禁止它。

* bluez-utiles — 提供蓝牙服务的支持,怎么操作就取决于你有没有蓝牙设备了。

* dns-clean, ppp, 和pppd-dns — 这些服务用于动态拨号连接。如果你使用的不是拨号,就可以禁止。

* hplip — 提供对HP Linux 图像和打印系统的支持。建议禁止,因为就算没有它,也可以通过lpr这些来实现打印。

* fetchmail - 接受邮件的守护程序,建议关闭。

* nvidia-kernel- ATI显卡用户可以关闭,自己编译显卡驱动的用户也可以关闭。

* hwtools - 优化irqs的工具,不用irqs的话就可以关闭

* mdadm, mdadm-raid, and lvm — 用于支持RAID的文件系统和逻辑卷管理(lvm)。如果没有使用它们,就可以禁止。不过笔者建议在熟悉基本操作后可以自己尝试学习一些LVM相关的知识,还是挺有意义的。关不关看自己吧。

* nfs-common, nfs-kernel-server, and portmap — NFS(Network File System)是一种分布式文件系统,允许网络中的安装不同操作系统的计算机间共享文件和外设。如果你不是经常需要NFS服务,就可以先禁止它,等要使用时,再用下面的命令来启动它们:

$ sudo /etc/init.d/portmap start
$ sudo /etc/init.d/nfs-common start
$ sudo /etc/init.d/nfs-kernel-server start

* pcmcia and pcmciautils — 提供对笔记本上PCMCIA设备的支持。如果没有PCMCIA插槽,还要它干吗?

* powernowd and powernowd.early — 用于控制可变速CPU的服务。现在新的计算机CPU大部分都是可自动变速来节省电量了,所以只有那些很老机器的用户才建议关闭它。事实上,这部分用户已经很少很少,所以我个人建议还是保持开启。

* readahead and readahead - 一般只有内存非常小的用户,才建议关闭这个启动进程,因为它会预加载一些库,让一些程序在启动时更快,这样会消耗一些内存。如果你内存比较大,就没有必要管它。

* rsync— 用于在计算机之间同步文件的服务,极少人用到,基本都可以禁止。

* vbesave — rvices monitors the 监视Video BIOS实时配置的服务。它是ACPI的功能之一,通常是笔记本需要在屏幕显示或者外接显示(投影仪之类)之间切换时才起作用。如果你的计算机不支持 ACPI或者没有这种应用的需求,就可以禁止。

调整内核参数

查看参数

不要把内核参数想象得太神秘,事实上,有很多参数是你自己就可以调整的。用下面这个命令在终端中执行试试看,结果是什么?

$ sudo sysctl -a | sort | more

是的,显示的就是一系列内核参数。即使你不用sudo,也可以看见大多数参数设置。这些显示的参数都很好理解,比如kernel.threads- max = 16379,就表示同时运行的最大进程数是16379个。也许你会奇怪,PID的最大值不是65536么?怎么这个设置小这么多?是的,这就是我在这里介 绍调整内核参数的原因。我们完全可以通过调整这个值来适应不同的系统,比如如果你的cpu频率很低,内存很小,就可以把这个值缩小一些。如果你的cpu很 棒,内存很足,就可以不用管它,甚至调大也行。这完全取决于你的机器配置,和你自己的想法。事实上,在你安装ubuntu的时候,它就会自动根据可用资源 来调整这个参数,所以不同机器上,这个参数可能是不同的。但是记住,机器调整的毕竟没有人调整的好,无法最大限度发挥系统的性能。

调整参数

好,我们现在已经可以看到很多内核参数了,那么,接下来的事情就是根据自己机器的情况来调整。通常有两种方法来调整参数,一种是在命令行下,通过类似命令

$ sudo sysctl -w kernel.threads-max=16000

这样来调整。这种方法调整过的参数会立刻生效,但是不会永久生效。什么意思呢?也就是说一旦你重新启动,所有改动就会消失。那这样岂不是毫无意义 么?所以还有第二种方法,就是直接修改/etc/sysctl.conf文件。这个文件本身没有任何内容,有的东西全部是注释,就等着你来修改。比如,你可以将

kernel.threads-max=16000

这行命令加进去,这样,在重新启动之后,threads-max的值就会变成16000了。

通常,我们应该配合这两种办法来进行内核参数调整。首先用命令行形式调整,看看并测试直观的效果,如果比较满意,再把调整写入文件中。命令行调整的好处就是,不管你怎么胡乱修改,甚至导致系统错误,没关系,只要重新启动,一切就将恢复原样。

修改共享内存

在linux下,不同的应用程序可以共享同一块虚拟内存地址,这样方便不同程序之间的通信和信息共享,通常有两种共享内存的分配方式:临时和永久。 临时分配的意思就是在所有共享的应用程序都释放内存句柄,不再需要它时,内存就会被收回。而永久分配的意思就是即使没有任何应用程序使用它,这些共享内存 也会继续保持,这就有利于将状态保存于其中。

我们可以通过ipcs命令来查看进程间通信的状态。输入ipcs -m来浏览内存使用情况,显示结果为

    —— Shared Memory Segments ——–
    key shmid owner perms bytes nattch status
    0×00000000 131073 windstorm 600 393216 2 dest
    0×00000000 393218 windstorm 600 393216 2 dest
    0×00000000 425987 windstorm 600 393216 2 dest
    0×00000000 229380 windstorm 600 393216 2 dest
    0×00000000 262149 windstorm 600 393216 2 dest
    0×00000000 294918 windstorm 600 393216 2 dest
    0×00000000 327687 windstorm 600 393216 2 dest
    0×00000000 360456 windstorm 600 393216 2 dest
    0×00000000 458761 windstorm 600 393216 2 dest
    0×00000000 3964938 windstorm 600 393216 2 dest
    0×00000000 524299 windstorm 600 393216 2 dest
    ……..

是不是有点晕了?我们可以看到一些共享内存的信息,包括共享内存ID,所有者,状态等等,但是这对于普通用户来说是不够的。你总得让我知道是谁在用吧?所以,我们应该使用下面这个命令

$ ipcs -m -p

来看看输出结果:

—— Shared Memory Creator/Last-op ——–
shmid owner cpid lpid
131073 windstorm 5473 4790
393218 windstorm 5568 4790
425987 windstorm 5566 4790
229380 windstorm 5413 5513
262149 windstorm 5490 8277
294918 windstorm 5512 4790
327687 windstorm 5496 7300
360456 windstorm 5496 7300
……..

好了,现在我们知道这些共享内存块分别是谁创建的(cpid),谁最近一次访问(lpid)。有时候,你会发现一些被遗弃的共享内存,就可以用ipcrm -m|-q|-s shm_id来删除共享内存信息。

但是通常情况下,如果所用的系统是作为数据库或者高性能网络服务器使用,我们更加关心的是如何分配更多的共享内存,而不是清除废弃的共享内存。那么首先,我们可以通过sysctl kernel | grep shm命令看看当前共享内存的分配情况。

$ sysctl kernel | grep shm

我的机器上果如下:

kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmax = 33554432

这是什么意思呢?这些数据表示,当前总共有33,554,432 bytes (32 MB)可用共享内存,每一个单独的程序最高能够分配到2,097,152 bytes,也就是2 MB,而最小的分配单元是4096 bytes。这些数据对于常用的应用来说完全足够了,但是如果是那种类似于数据库的高性能应用,可能你就需要考虑增大它们的数值了。修改方法?请参考“调 整参数”小节。

ipcs还有很多其他的查看方式,比如ipcs -m –t能够显示最近一次共享内存的访问的时间,ipcs -m –c则可以显示访问权限,请man ipcs来自行查阅更多用法。

修改个人用户设置

在内核设置层面之上,还有很多个人用户配置的参数,ulimit命令就是bash下提供的,查看对指定应用的限制值的工具。你可以通过ulimit –a命令显示当前设置:

core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) unlimited
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

上面的信息什么意思?举个例子,

open files (-n) 1024

表示一个用户shell最多可以打开1024个文件,想增加怎么办?ulimit -n num即可。

    core file size (blocks, -c) 0

表示core dumps功能关闭。想打开怎么办?ulimit -c num即可。
如果你只是普通身份用户,则只能对数值进行减少的修改。如果想增加数值,需要用root权限修改。而且,一些参数的上限是和内核参数对应的,比如你可以增 加打开文件句柄的数目,但数目的最大值不能超过内核参数fs.file-max设置的值(sysctl fs.file-max看看)。

修改日志数据

好吧,我知道这招有些冒险,但是确实很有作用。为了避免一些朋友在使用后出问题又无法解决,我在后面也附上了问题解决方法。

我们知道,无论是Ext3还是ReiserFS,都有三种日志方式:
1) Journal Data Writeback
2) Journal Data Ordered
3) Journal Data

三者的不同点,简单得说就是实际数据被写入文件系统以及相关日志的时间不同。默认系统采用的是Journal Data Ordered方式。如果采用Journal Data Writeback方式,能够有效提高系统速度,只不过这是有代价的:一旦系统崩溃,在通过日志恢复后,你可能只能得到一些旧的数据,而不是最新数据。所 以,在修改前,请三思,如果你是对当前工作进度的备份要求非常苛刻的人,最好不要使用这个办法。

那么,接下来就介绍一些具体的修改办法,首先, 如果你是Ext3系统,需要进行以下步骤,否则可能在重新启动时出错:

$ sudo tune2fs -o journal_data_writeback /dev/hda1

这是人工在重启之前把文件系统设置为writeback模式。用下面这个命令来确认是否得到了执行:

$ sudo tune2fs -l /dev/hda1

千万注意,ReiserFS文件系统不用这样。

然后sudo vim /etc/fstab,在你的root分区mount属性中增加

data=writeback

这一句,使其看起来是这样的:

/dev/hda1 / ext3 defaults,errors=remount-ro,atime,auto,rw,dev,exec,suid,nouser,data=writeback 0 1

保存,然后sudo vim /boot/grub/menu.lst,在下面两行加上粗体属性:

# defoptions=quiet splash rootflags=data=writeback
# altoptions=(recovery mode) single rootflags=data=writeback

这样的话,即使升级内核,增加的标志也会保持,不会被覆盖。最后运行sudo update-grub即可。

ok,再提醒一句,这样做是比较冒险的。我知道你很有冒险心理,所以一旦重新启动出问题时,请用一下方法解决:
将系统重新启动到恢复模式下,在命令行下输入

$ mount -o remount,rw /dev/sdXX/

这个sdXX就是你的硬盘分区,这样就允许你修改硬盘上的fstab和menu.lst文件,将改变还原,然后在正确的系统中再去思考到底哪里出了问题。

杂项

1. 上面已经介绍,/etc/init.d/下面的都是启动脚本,默认这些脚本是按顺序启动的,实际上,如果你使用的是SATA 或SCSI,可以并行启动这些脚本程序,加速启动过程。而如果你的机器配置较老,则最好还是不要修改。修改方法是通过命令

$ sudo vim /etc/init.d/rc

找到并修改该行:
CONCURRENCY=none
为:
CONCURRENCY=shell

2. 长期使用 Ubuntu 后有一种感觉,那就是在 GNOME 中启动应用程序时,速度越来越慢。在 Ubuntu 英文论坛那边看到一个技巧,可以对这个问题起到改善作用。打开 /etc/hosts 文件,可以看到类似下面的内容:

    127.0.0.1 localhost
    127.0.1.1 windstorm

现在,只需在第一行的末尾加上主机名即可

127.0.0.1 localhost windstorm
127.0.1.1 windstorm

保存后,重启系统,更改生效。

3. Pango是一个着重于国际化的,用于输出和文本渲染的库,但是这个库可能导致firefox等一些程序有着过高的cpu占用资源。我们可以

$ sudo vim /etc/environment

然后在其中添加:

MOZ_DISABLE_PANGO="1"

这样就可以禁用Pango了。

自己动手提高ubuntu系统的性能(一)

参考文章:
1. Hacking Ubuntu to Improve Performance
2. HOWTO: Tweak your ext3 filesystem for a performance boost

转载自http://www.forwind.cn/2007/05/10/ubuntu-howto-improve/


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter