linux 系统优化

概述

1.“/etc/profile”文件

2.“bdflush”参数

3.“ip_local_port_range”参数

4.“/etc/nsswitch.conf”文件

5.“/proc”文件系统

6.“ulimit”参数

1.“/etc/profile”文件

“etc/profile”文件含有系统大量的环境和启动程序的配置信息。你在该文件中进行的配置,可以通过申请全局环境变量来实现。因此,在该文件中设置优化标志,是一种明智的选择。要想使x86程序获得最佳性能,可以在编译时,使用最佳的优化选项-O9。许多程序的“Makefile”文件中已经含有-O2选项,而-O9使编译器采用最高级别的优化。尽管它将增加最终程序的大小,但这样可以获得更高的运行速度。编译时,使用“-fomit-frame-pointer”选项,程序运行时,访问变量时将使用堆栈。但是,使用这一选项,生产的代码将无法调试。使用“-mcpu=cpu_type”和“-march=cpu_type”选项,Gcc将针对这种型号CPU进行专门的优化,但生成的代码只能在所指定的CPU或更高系列的CPU上运行。

对于CPUi686或PentiumPro、PentiumII、PentiumIII

在“/etc/profile”文件中,加入一行:

CFLAGS=’-O9-funroll-loops-ffast-math-malign-double-mcpu=pentiumpro-march=pentiumpro-fomit-

frame-pointer-fno-exceptions’

对于CPUi586或Pentium

在“etc/profile”文件中,加入一行:

CFLAGS=’-O3-march=pentium-mcpu=pentium-ffast-math-funroll-loops-fomit-frame-pointer-fforce-

mem-fforce-addr-malign-double-fno-exceptions’

对于CPUi486

在“etc/profile”文件中,加入一行:

CFLAGS=’-O3-funroll-all-loops-malign-double-mcpu=i486-march=i486-fomit-frame-pointer-fno-exceptions’

在进行完以上设置之后,紧接者着把“CFLAGSLANGLESSCHARSET”加入到“etc/profile”文件中的“export”行中:

exportPATHPS1HOSTNAMEHISTSIZEHISTFILESIZEUSERLOGNAMEMAILINPUTRCCFLAGSLANGLESSCHARSET

然后,重新登录,这时,环境变量CFLAGS已经被赋值,编译器和其它配置工具可以使用它。对Pentium(Pro/II/III)的优化必须使用egcs或pgcc编译器。Linux的缺省安装中,已经装上了egcs,所以无需担心。

基准测试结果(按体系结构分类):

由于CPU的体系结构和使用的gcc/egcs的版本不同,优化选项也会不同。下面的图表可以帮助你根据自己的CPU和编译器,选择最佳的编译选项。

Redhat6.1中安装的编译器的版本是egcs2.91.66,但是,即使你安装的就是Redhat6.1,在选择编译选项之前也务必检查一下编译器的版本.

为了确认编译器的版本,使用如下命令:

[root@deep]#egcs--version。

注意:所有的测试结果可以从GCC的主页:http://egcs.cygnus.com/上检索到。

现举例说明:

对于CPUpentiumII/III(i686),安装了egcs-2.91.66,最佳的编译选项是:

CFLAGS=’-O9-funroll-loops-ffast-math-malign-double-mcpu=pentiumpro-march=pentiumpro-fomit-frame-pointer-fno-exceptions’

对于CPUpentium(i586),安装了egcs-2.91.66,最佳的编译选项是:

CFLAGS=’-O3-march=pentium-mcpu=pentium-ffast-math-funroll-loops-fomit-frame-pointer-fforce-mem-fforce-addr-malign-double-fno-exceptions’

对于CPUi486,安装了egcs-2.91.66,最佳的编译选项是:

CFLAGS=’-O3-funroll-all-loops-malign-double-mcpu=i486-march=i486-fomit-frame-pointer-fno-exceptions’

-funroll-loops选项

对“loopunrolling”进行优化,只对在编译或运行时循环次数能确定的循环语句有效。

-funroll-all-loops

对“loopunrolling”进行优化,对所有的循环语句有效,担通常使程序运行变慢。

-ffast-math

该选项使GCC可以不遵从ANSI或IEEE的规则,以获得运行更快的优化代码。例如:它允许编译器假设sqrt()函数的输入参数非负以及所有的浮点数的值都是NaNs。

-malign-double

GCC把double,longdouble,andlonglong类型变量定界在双字还是单字边界上,由该选项控制。double类型变量定界于双字边界时,产生的代码在Pentium机器上可以运行得更快一些,但是会占用更多的内存。

-mcpu=cpu_type

设定在生成指令时缺省的机器和CPU类型,设定好某一特定的CPU类型后,编译器将针对这种芯片产生相应的指令,如果不使用“-march=cpu_type”选项,编译器不会产生任何不能在i386上运行的代码。“i586”等价于“pentium”,“i686”等价于“pentiumpro”,“k6”指明是使用AMD的芯片而非Intel系列。

-march=cpu_type

为指定类型的机器和CPU产生指令。这里的CPU类型与“-mcpu”中列出的相同。而且,使用本选项已经隐含了“-mcpu=cpu_type”选项。

-fforce-mem

对于涉及内存操作的运算,强制把操作数拷贝到寄存器中。这是通过把所有的内存引用转换成潜在的普通子表达式,以获得优化代码。如果,这些内存引用不是普通子表达式,可以通过指令的组合,消除单独的寄存器装载。

-fforce-addr

运算前把内存地址常数拷贝到寄存器中。所产生的优化代码与选项“-fforce-mem”类似。

-fomit-frame-pointer

对于不必要的框架指针(framepointer),不在寄存器中保存。这就避免了相应的用于保存、设置和恢复框架指针所需的指令;这样,许多函数中可以使用额外的寄存器。但是,这一选项使得在大多数机器上无法进行调试。

注意:本书将要讨论的所有优化,缺省都是针对PentiumII/III系列CPU。因此,如有必要,对于某些专门的CPU需要调整编译参数。

2.“bdflush”参数

下文讨论目录“/proc/sys/vm”下的系统控制文件,且只在Linux内核版本2.2下有效。控制该目录下的文件,可以调整Linux内核子系统--虚拟内存(VM)的行为,其中bdflush文件对于硬盘使用有一定影响。该文件控制了bdflush内核守护进程的行为。我们通常使用以下命令来提高文件系统的性能:

echo"100120012851215500050018842">/proc/sys/vm/bdflush

修改某些值,可以使系统响应更快,例如:可以使系统在写入硬盘之前等待更长时间,从而避免了一些硬盘访问的冲突。

把该命令加入文件“etc/rc.d/rc.local”之中,每次重新启动机器时,就不必再次手工敲入这条命令了。

如果需要进一步理解如何改进有关虚拟内存、硬盘缓冲和交换空间(swap)的内核参数,可以参照“/usr/src/linux/Documentation/sysctl/vm.txt”。

3.“ip_local_port_range”参数

下文讨论目录“/proc/sys/net/ipv4/ip_local_port_range”下的系统控制文件,且只在Linux内核版本2.2下有效。

“ip_local_port_range”文件中有两个参数分别定义了用作TCP和UDP本地端口的端口范围。第一个参数是第一个端口号。第二个参数是最后一个本地端口号。对于使用率很高的系统,可以修改为:32768到61000。

echo*3276861000*>/proc/sys/net/ipv4/ip_local_port_range

把该命令加入文件“/etc/rc.d/rc.local”之中,每次重新启动机器时,就不必再次手工敲入这条命令了。

4.“/etc/nsswitch.conf”文件

“etc/nsswitch.conf”文件定义了系统使用哪些服务来解析主机名、获得口令文件和组文件(groupfile)。我们的系统中由于没有使用NIS服务,因此口令文件和组文件我们没有使用。这里,我们只讨论该文件中的hosts这一行。

编辑“nsswitch.conf”文件(vi/etc/nsswitch.conf),把host一行改为:

"hosts:dnsfiles"

含义:当请求解析地址时,首先访问DNS服务器,如果DNS服务器没有响应,则使用“/etc/hosts”文件。

我建议把该文件中每一行中的NIS都删掉。当然,如果你一定要使用NIS,就不能删掉NIS。最后,这个文件会是这样:

passwd:files

shadow:files

group:files

hosts:dnsfiles

bootparams:files

ethers:files

netmasks:files

networks:files

protocols:files

rpc:files

services:files

automount:files

aliases:files

5.“/proc”文件系统

下文讨论目录“proc/sys/fs”下的系统控制文件,且只在Linux内核版本2.2下有效。该目录下的文件可以用来调整和监测Linux内核的一些行为。对这些文件的误操作可能搅乱系统,因此在实际调整系统之前,最好把文档和源代码都读一下。

适当的增加“/proc/sys/fs/file-max”的值:每4M内存对应256,例如:内存为128M的机器,该值可以设为8192(128/4=3232*256=8192)。同理,可以增加“/proc/sys/fs/inode-max”的值,使其值为打开文件数目的3到4倍(8192*4=32768)。这是因为:i节点的数目至少等于打开的文件数,一般而言,对于大文件,i节点数远大于打开的文件数目。

用于改变/proc目录及其子目录下的任意参数的常用命令是(必须以root登录):echo“新的参数值”>“/proc/所需更改的文件”,对于上面所涉及的修改,其命令为:

echo"8192">/proc/sys/fs/file-max

echo"32768">/proc/sys/fs/inode-max

上文所讨论的方法修改了内核源代码的常数。但是,在新的内核源代码树中并不能起作用,因此还不能算是最好的方法。最好的一种方法是把上述命令加入文件“etc/rc.d/rc.local”之中。在该文件的最后加入以下两行(假设系统有128M内存):

echo"8192">/proc/sys/fs/file-max

echo"32768">/proc/sys/fs/inode-max

其中的数值因系统不同,差异很大,应该根据各自系统,按照上述的公式计算。一台文件服务器或WEB服务器需要打开的文件数目就很大,而用于数值的服务器该数值就较小。

对于内存非常多的系统,特别是512M或更多内存的系统,打开的文件数和i节点数最好不要超过50,000和150,000。

“file-max”参数是指Linux内核可以分配的文件句柄的最大数目。当系统经常报错:文件句柄不够时,就需要适当增大该参数的值。系统缺省值为:4096。

“inode-max”参数是指系统i节点句柄的最大数目。其值应该是file-max值的3到4倍。因为标准输入输出文件和网络套接字都要使用i节点来进行处理。如果系统经常性的出现i节点被耗尽的情况,就需要增大其值。

6.“ulimit”参数

Linux本身对每个用户拥有的最大进程数有限制。可以在用户根目录下的“.bashrc”文件或者实际使用与“.bashrc”功能相当的shell的脚本中加入这种限制。编辑“.bashrc”文件(例如:vi/root/.bashrc)并加入下面一行:

ulimit-uunlimited

然后退出,重新登录。为了验证,可以以root身份登录,然后键入:“ulimit–a”,在最大用户进程数一项中应该显示“unlimited”,例如:

[root@deep]#ulimit-a

corefilesize(blocks)1000000

datasegsize(kbytes)unlimited

filesize(blocks)unlimited

maxmemorysize(kbytes)unlimited

stacksize(kbytes)8192

cputime(seconds)unlimited

maxuserprocessesunlimited*thisline.

pipesize(512bytes)8

openfiles1024

virtualmemory(kbytes)2105343

注意:你可能更倾向于在命令行键入“unlimit–u”而不是把它加入到文件“/root/.bashrc”中。但为保险起见,建议还是把它加入文件“/root/.bashrc”中。

相关推荐