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上运行。

对于CPU i686或PentiumPro、Pentium II、Pentium III

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

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

对于CPU i586或Pentium

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

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

对于CPU i486

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

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

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

export PATH PS1 HOSTNAME HISTSIZE HISTFILESIZE USER LOGNAME MAIL INPUTRC CFLAGS LANG LESSCHARSET

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

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

Redhat 6.1中安装的编译器的版本是egcs 2.91.66,但是,即使你安装的就是Redhat 6.1,在选择编译选项之前也务必检查一下编译器的版本.

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

[root@deep]# egcs --version。

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

现举例说明:

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

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

对于CPU pentium (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’

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

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

-funroll-loops选项

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

-funroll-all-loops

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

-ffast-math

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

-malign-double

GCC把 double, long double, and long long类型变量定界在双字还是单字边界上,由该选项控制。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

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

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

2. “bdflush”参数

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

echo "100 1200 128 512 15 5000 500 1884 2">/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 *32768 61000* > /proc/sys/net/ipv4/ip_local_port_range

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

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

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

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

"hosts: dns files"

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

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

passwd: files
shadow: files
group: files
hosts: dns files
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 =32 32*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 -u unlimited

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

[root@deep]# ulimit -a
core file size (blocks) 1000000
data seg size (kbytes) unlimited
file size (blocks) unlimited
max memory size (kbytes) unlimited
stack size (kbytes) 8192
cpu time (seconds) unlimited
max user processes unlimited * this line.
pipe size (512 bytes) 8
open files 1024
virtual memory (kbytes) 2105343

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

你可能感兴趣的:(linux,.net,框架,redhat,gcc)