Linux 性能调优的几种方法
副标题:
作者:未知 文章来源:互联网 点击数: 215 更新时间:2006-2-11
按照传统,Linux不同的发行版本和不同的内核对各项参数及设置均做了改动,从而使得系统能够获得更好的性能。下边将分四部分介绍在Red Hat Enterprise Linux AS和SUSE LINUX Enterprise Server系统下,如何用以下几种技巧进行性能的优化:

  QUOTE:
1、Disabling daemons (关闭 daemons)
2、Shutting down the GUI (关闭GUI)
3、Changing kernel parameters (改变内核参数)
4、Kernel parameters (内核参数)
5、Tuning the processor subsystem(处理器子系统调优)
6、Tuning the memory subsystem (内存子系统调优)
7、Tuning the file system(文件系统子系统调优)
8、Tuning the network subsystem(网络子系统调优)

1 关闭daemons

有些运行在服务器中的daemons (后台服务),并不是完全必要的。关闭这些daemons可释放更多的内存、减少启动时间并减少CPU处理的进程数。减少daemons数量的同时也增强了服务器的安全性。缺省情况下,多数服务器都可以安全地停掉几个daemons。
Table 10-1列出了Red Hat Enterprise Linux AS下的可调整进程.
Table 10-2列出了SUSE LINUX Enterprise Server下的可调整进程



注意:关闭xfs daemon将导致不能启动X,因此只有在不需要启动GUI图形的时候才可以关闭xfs daemon。使用startx命令前,开启xfs daemon,恢复正常启动X。



可以根据需要停止某个进程,如要停止sendmail 进程,输入如下命令:
Red Hat: /sbin/service sendmail stop
SUSE LINUX: /etc/init.d/sendmail stop
也可以配置在下次启动的时候不自动启动某个进程,还是sendmail:
Red Hat: /sbin/chkconfig sendmail off
SUSE LINUX: /sbin/chkconfig -s sendmail off
除此之外,LINUX还提供了图形方式下的进程管理功能。对于Red Hat,启动GUI,使用如下命令: /usr/bin/redhat-config-services 或者鼠标点击 Main Menu -> System Settings ->
Server Settings -> Services.



提示:并非所有的daemons都会显示在该配置界面,如要看到全部的daemons,使用如下命令:
/sbin/chkconfig –list

对于SUSE LINUX,图形界面是YaST2, 可用如下命令来启动
/sbin/yast2 runlevel 或者如Figure 10-2所示用鼠标点击
Browse: YaST/ −> YaST modules −> System −> Runlevel editor



2 关闭GUI


只要有可能,就不要在Linux server上启动GUI图形,通常在Linux server上,没有必要启动GUI。,所有的管理任务均可在命令行方式下完成、或者通过重定向X和Web浏览器界面。有几个可用的基于Web的工具(例如webmin, Linuxconf, 和SWAT).
需要的时候启动GUI,用完马上关闭GUI。多数情况,服务器运行在runlevel 3,即在机器启动的时候不进入GUI。命令行方式下,执行startx 来启动Xserver.

1. 查看runlevel的命令:runlevel
会显示出上次和当前的runlevel (如N 5 表示没有上次的runlevel (N) ,当前的runlevel是5).
2. 在不同的runlevels之间切换,使用命令 init
如切换到run level 3,键入命令init 3

下边是对Linux中不同runlevels的简要描述
– 0 – Halt 停机(不要将0设置为缺省,否则服务器启动后就会马上关闭)
– 1 - Single user mode 单用户模式
– 2 - Multi-user 不带NFS的多用户模式 (如果没有网络,相当与3)
– 3 - Full multi-user mode 完全多用户模式
– 4 – Unused 未使用
– 5 - X11
– 6 – Reboot 重启(不要将6设置为缺省,否则服务器会不断地重启)

修改文件/etc/inittab 来设置机器启动的runlevel,如Figure 10-3。



对于SUSE LINUX Enterprise Server, 执行YaST runlevel 命令改变缺省runlevel值.
如图Figure 10-2。

缺省情况下,保存了6个控制台:F1……F6。为节省内存,可以减少为3个。使用mingetty ttyx命令来实现,如图Figure 10-3
提示:即便是已经关闭了GUI,依然可以远程连接并启动GUI,可以使用ssh-x

3 改变内核参数


Linux内核是操作系统的核心,对所有的Linux发行版本是通用的。内核参数可以改变,在命令行下执行sysctl 命令。

提示:缺省情况下,LINUX内核包括不必重启就可以使用sysctl命令的必要的模块。尽管如此,如果你在安装系统的时候选择移除该功能,那么你只有重新启动LINUX,才可以使得改变生效。

SUSE LINUX 提供了图形界面下的修改方式。使用如下命令来启动powertweak工具:
/sbin/yast powertweak
使用如下命令启动基于字符的管理菜单:
/sbin/yast2 powertweak



Red Hat也提供了图形界面下更改sysctl参数的方式:
/usr/bin/redhat-config-proc如图Figure 10-5



Parameter storage locations
内核参数保存在/proc(特别是/proc/sys),提供了内核、处理器、内存、网络及其他组件的相关参数。每个执行的进程都有一个以相应PID命名的目录。Figure 10-3列出了一些包括内核信息的文件。




4 内核的参数


Table 10-5 列出了Red Hat V2.4与性能关系密切的一些内核参数。





4 内核的参数


Table 10-5 列出了Red Hat V2.4与性能关系密切的一些内核参数。




5 处理器子系统调优


处理器对于应用和数据库服务器来讲是最重要的硬件子系统之一。然而在这些系统中,CPU经常是性能的瓶颈。
在配有Xeon处理器的高端服务器中,你可以启用或者关闭Hyper-Threading(超线程功能)。Hyper-Threading在操作系统里将一颗处理器虚拟化为两颗使用。Red Hat Enterprise Linux AS和SUSE LINUX Enterprise Server都支持该功能,从而可以使处理器在同一时刻执行两个线程或者进程。对于支持Hyper-Threading的操作系统和软件来说,不需要增加CPU时钟频率即可使性能得到明显的改进。例如,在4路的服务器上起用Hyper-Threading功能并使用性能监测工具(如top)来检测,可以看到8颗处理器。如图Figure 10-6



提示,对于Hyper-Threading:
_ 基于SMP内核的LINUX才可以支持Hyper-Threading
_ 安装的CPU数量越多,从Hyper-Threading获得的性能上的提高就越少。可获得的性能提高大约为:
– 2颗物理CPU: 15-25%
– – 4颗物理CPU: 1-13%
– – 8颗物理CPU: 0-5%
– 如需更多的关于Hyper-Threading信息,可浏览:
http://www.intel.com/business/bss/products/hyperthreading/server/
EM64T是Intel IA-32处理器的64-bit扩展。意思是,处理器能够支持更多的内存并支持64-bit应用同时完全兼容现存的32-bit应用。Red Hat Enterprise Linux 3 Update 2 和 SUSE LINUX Enterprise Server 9支持这种新的处理器。如需更多的EM64T信息,可浏览:
http://www.intel.com/technology/64bitextensions/
选择正确的内核
Red Hat Enterprise Linux AS和SUSE LINUX Enterprise Server都包括有若干个内核包,如Table 10-6所列。选择合适的内核对性能非常重要。




6 内存子系统的调优


内存子系统的调优不是很容易,需要不停地监测来保证内存的改变不会对服务器的其他子系统造成负面影响。如果要改变虚拟内存参数(在/proc/sys/vm),建议您每次只改变一个参数然后监测效果。对与虚拟内存的调整包括以下几个项目:
_ 配置Linux内核如何更新dirty buffers到磁盘。磁盘缓冲区用于暂存磁盘的数据。相对于内存来讲,磁盘缓冲区的速度很慢。因此,如果服务器使用这类内存,性能会成问题。当缓冲区内的数据完全dirty,使用:sysctl -w vm.bdflush="30 500 0 0 500 3000 60 20 0"
vm.bdflush有9个参数,但是建议您只改变其中的3个:
1 nfract, 为排队写入磁盘前,bdflush daemon允许的缓冲区最大百分比
2 ndirty, 为bdflush即刻写的最大缓冲区的值。如果这个值很大,bdflush需要更多的时间完成磁盘的数据更新。
7 nfract_sync, 发生同步前,缓冲区变dirty的最大百分比。
配置kswapd daemon,指定Linux的内存交换页数量
sysctl -w vm.kswapd="1024 32 64"
三个参数的描述如下:
– tries_base 相当于内核每次所交换的“页”的数量的四倍。对于有很多交换信息的系统,增加这个值可以改进性能。
– tries_min 是每次kswapd swaps出去的pages的最小数量。
– swap_cluster 是kswapd 即刻写如的pages数量。数值小,会提高磁盘I/O的性能;数值大可能也会对请求队列产生负面影响。
如果要对这些参数进行改动,请使用工具vmstat检查对性能的影响。其它可以改进性能的虚拟内存参数为:
_ buffermem
_ freepages
_ overcommit_memory
_ page-cluster
_ pagecache
_ pagetable_cache


8 网络子系统的调优


操作系统安装完毕,就要对网络子系统进行调优。对其它子系统的影响:影响CPU利用率,尤其在有大量TCP连接、块尺寸又非常小时,内存的使用会明显增加。
如何预防性能下降
如下的sysctl命令用于改变安全设置,但是它也可以防止网络性能的下降。这些命令被设置为缺省值。

◆关闭如下参数可以防止***对服务器IP地址的***



◆开启TCP SYN cookies,保护服务器避免受syn-flood***,包括服务取决denial-of-service (DoS) 或者分布式服务拒绝distributed denial-of-service (DDoS) (仅适用Red Hat Enterprise Linux AS)



◆以下命令使服务器忽略来自被列入网关的服务器的重定向。因重定向可以被用来进行***,所以我们只接受有可靠来源的重定向。



另外,你可以配置接受或拒绝任何ICMP重定向。ICMP重定向是路由器传输路由信息的机制。比如,当网关接收到来自所接网络主机的Internet数据报时,网关可以发送重定向信息到一台主机。网关检查路由表获得下一个网关的地址,第二个网关将数据报路由到目标网络.关闭这些重定向得命令如下:  



◆如果这个服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能:



◆配置服务器拒绝接受广播风暴或者smurf ***attacks:



◆忽略所有icmp包或者pings:



◆有些路由器针对广播祯发送无效的回应,每个都产生警告并在内核产生日志.这些回应可以被忽略:



针对TCP和UDP的调优

下边的命令用来对连接数量非常大的服务器进行调优.

◆对于同时支持很多连接的服务器,新的连接可以重新使用TIME-WAIT套接字. 这对于Web服务器非常有效:



如果你使用该命令,还要启动TIME-WAIT 套接字状态的快速循环功能:



图Figure 10-7显示出将这些功能启用,连接数量明显降低.因为每个TCP传输都包含远程客户端的协议信息缓存,所以有利于提高性能.缓存中存放round-trip时间、最大segment大小、拥塞窗口的信息。



◆参数tcp_fin_timeout 是套接字关闭时,保持FIN-WAIT-2状态的时间。一个TCP连接以three-segment SYN序列开始, 以three-segment FIN序列结束.均不保留数据.通过改变tcp_fin_timeout的值, 从FIN序列到内存可以空闲出来处理新连接的时间缩短了,使性能得到改进.改变这个值的前要经过认真的监测,避免因为死套接字造成内存溢出.



◆服务器的一个问题是,同一时刻的大量TCP连接里有很多的连接被打开但是没有使用. TCP的keepalive功能检测到这些连接,缺省情况下,在2小时之后丢掉. 2个小时的可能导致内存过度使用,降低性能.因此改成1800秒(30分钟)是个更好的选择:



◆对于所有协议的队列,设置最大系统发送缓存(wmem) 和接收缓存(rmem)到8MB



这些设置指定了创建TCP套接字时为其分配的内存容量. 另外,使用如下命令发送和接收缓存.该命令设定了三个值:最小值、初始值和最大值:



第三个值必须小于或等于wmem_max和rmem_max。

◆(SUSE LINUX Enterprise Server适用) 通过保留路径验证来源数据包。缺省情况下,路由器转发所有的数据包,即便是明显的异常网络流量。通过启动和是的过滤功能,丢掉这些数据包:



◆当服务器负载繁重或者是有很多客户端都是超长延时的连接故障,可能会导致half-open连接数量的增加。这对于Web服务器很来讲很平常,尤其有很多拨号客户时.这些half-open连接保存在 backlog connections 队列中.将这个值最少设置为4096 (缺省为1024). 即便是服务器不接收这类连接,设置这个值还能防止受到denial-of-service (syn-flood)的***.



◆设置ipfrag参数,尤其是NFS和Samba服务器。这里,我们可以设置用于重新组合IP碎片的最大、最小内存。当ipfrag_high_thresh值被指派,碎片会被丢弃直到达到ipfrag_low_thres值。
当TCP数据包传输发生错误时,开始碎片整理。有效的数据包保留在内存,同时损坏的数据包被转发。例如,设置可用内存范围从256 MB到384 MB: