RedHat Enterprise Linux在IBM System x服务器上的调优

5月 24th, 2009 | Posted by | Filed under 操作系统

本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
网址: http://www.penglixun.com/tech/system/tuning_redhat_enterprise_linux_in_ibm_system_x_server.html

一.理解Linux的性能我们可以在文章的开始就列出一个列表,列出可能影响Linux操作系统性能的一些调优参数,但这样做其实并没有什么价值。因为性能调优是一个非常困难的任务,它要求对硬件、操作系统、和应用都有着相当深入的了解。如果性能调优非常简单的话,那些我们要列出的调优参数早就写入硬件的微码或者操作系统中了,我们就没有必要再继续读这篇文章了。当面对一个使用单独IDE硬盘的有20000用户的数据库服务器时,即使我们使用数周时间去调整I/O子系统也是徒劳无功的,通常一个新的驱动或者应用程序的一个更新却可以使这个服务器的性能得到明显的提升。正如我们前面提到的,不要忘记系统的性能是受多方面因素影响的。理解操作系统管理系统资源的方法将帮助我们在面对问题时更好的判断应该对哪个子系统进行调整。 

下面的部分对Linux操作系统的架构进行了简单的介绍,对Linux内核的完整的分析超出了我们这本红皮书的内容,感兴趣的读者可以寻找相关文档做更深入的研究。本书对Linux性能的调整主要针对Red Hat发行版本。

1.Linux的CPU调度

任何计算机的基本功能都十分简单,那就是计算。为了实现计算的功能就必须有一个方法去管理计算资源、处理器和计算任务(也被叫做线程或者进程)。非常感谢Ingo Molnar,他为Linux内核带来了O(1)CPU调度器,区别于旧有的O(n)调度器,新的调度器是动态的,可以支持负载均衡,并以恒定的速度进行操作。
新调度器的可扩展性非常好,无论进程数量或者处理器数量,并且调度器本身的系统开销更少。新调取器的算法使用两个优先级队列。
·活动运行队列
·过期运行队列

调度器的一个重要目标是根据优先级权限有效地为进程分配CPU 时间片,当分配完成后它被列在CPU的运行队列中,除了 CPU 的运行队列之外,还有一个过期运行队列。当活动运行队列中的一个任务用光自己的时间片之后,它就被移动到过期运行队列中。在移动过程中,会对其时间片重新进行计算。如果活动运行队列中已经没有某个给定优先级的任务了,那么指向活动运行队列和过期运行队列的指针就会交换,这样就可以让过期优先级列表变成活动优先级的列表。通常交互式进程(相对与实时进程而言)都有一个较高的优先级,它占有更长的时间片,比低优先级的进程获得更多的计算时间,但通过调度器自身的调整并不会使低优先级的进程完全被饿死。新调度器的优势是显著的改变Linux内核的可扩展性,使新内核可以更好的处理一些有大量进程、大量处理器组成的企业级应用。新的O(1)调度器包含仔2.6内核中,但是也向下兼容2.4内核。

按此在新窗口浏览图片

新调度器另外一个重要的优势是体现在对NUMA(non-uniform memory architecture)和SMP(symmetric multithreading processors)的支持上,例如INTEL@的超线程技术。

改进的NUMA支持保证了负载均衡不会发生在CECs或者NUMA节点之间,除非发生一个节点的超出负载限度。Linux的CPU调度器没有使用大部分UNIX和Windows操作系统使用的进程-线程模式,它只使用了线程。在Linux中一个进程表示为一组线程,可以用线程组ID或者TDGID代替标准UNIX中的进程ID或者PID。然而大多数Linux命令例如ps和top都使用PIDs表达,因此在下面的文章中我们会经常使用进程和线程组。

2.Linux的内存架构

今天我们面对选择32位操作系统还是64位操作系统的情况。对企业级用户它们之间最大的区别是64位操作系统可以支持大于4GB的内存寻址。从性能角度来讲,我们需要了解32位和64位操作系统都是如何进行物理内存和虚拟内存的映射的。

在下面图示中我们可以看到64位和32位Linux内核在寻址上有着显著的不同。探究物理内存到虚拟内存的映射超出了本文研究的范围,因此这里我们只是着重研究一下Linux内存架构的特点。

在32位架构中,比如IA-32,Linux内核可以直接寻址的范围只有物理内存的第一个GB(如果去掉保留部分还剩下896MB),访问内存必须被映射到这小于1GB的所谓ZONE_NORMAL空间中,这个操作是由应用程序完成的。但是分配在ZONE_HIGHMEM中的内存页将导致性能的降低。
在另一方面,64位架构比如x86-64(也称作EM64T或者AMD64)。ZONE_NORMAL空间将扩展到64GB或者128GB(实际上可以更多,但是这个数值受到操作系统本身支持内存容量的限制)。正如我们看到的,使用64位操作系统我们排除了因ZONE_HIGHMEM部分内存对性能的影响的情况。

按此在新窗口浏览图片

3.虚拟内存管理

因为操作系统将内存都映射为虚拟内存,所以操作系统的物理内存结构对用户和应用来说通常都是不可见的。如果想要理解Linux系统内存的调优,我们必须了解Linux的虚拟内存机制。应用程序并不分配物理内存,而是向Linux内核请求一部分映射为虚拟内存的内存空间。如下图所示虚拟内存并不一定是映射物理内存中的空间,如果应用程序有一个大容量的请求,也可能会被映射到在磁盘子系统中的swap空间中。

另外要提到的是,通常应用程序不直接将数据写到磁盘子系统中,而是写入缓存和缓冲区中。Bdflush守护进程将定时将缓存或者缓冲区中的数据写到硬盘上。

Linux内核处理数据写入磁盘子系统和管理磁盘缓存是紧密联系在一起的。相对于其他的操作系统都是在内存中分配指定的一部分作为磁盘缓存,Linux处理内存更加有效,默认情况下虚拟内存管理器分配所有可用内存空间作为磁盘缓存,这就是为什么有时我们观察一个配置有数G内存的Linux系统可用内存只有20MB的原因。

同时Linux使用swap空间的机制也是相当高效率的,如下图所示虚拟内存空间是由物理内存和磁盘子系统中的swap空间共同组成的。如果虚拟内存管理器发现一个已经分配完成的内存分页已经长时间没有被调用,它将把这部分内存分页移到swap空间中。经常我们会发现一些守护进程,比如getty,会随系统启动但是却很少会被应用到。这时为了释放昂贵的主内存资源,系统会将这部分内存分页移动到swap空间中。上述就是Linux使用swap空间的机制,当swap分区使用超过50%时,并不意味着物理内存的使用已经达到瓶颈了,swap空间只是Linux内核更好的使用系统资源的一种方法。

按此在新窗口浏览图片

4.模块化的I/O调度器

就象我们知道的Linux2.6内核为我们带来了很多新的特性,这其中就包括了新的I/O调度机制。旧的2.4内核使用一个单一的I/O调度器,2.6内核为我们提供了四个可选择的I/O调度器。因为Linux系统应用在很广阔的范围里,不同的应用对I/O设备和负载的要求都不相同,例如一个笔记本电脑和一个10000用户的数据库服务器对I/O的要求肯定有着很大的区别。

(1)Anticipatory

anticipatory I/O调度器创建假设一个块设备只有一个物理的查找磁头(例如一个单独的SATA硬盘),正如anticipatory调度器名字一样,anticipatory调度器使用“anticipatory”的算法写入硬盘一个比较大的数据流代替写入多个随机的小的数据流,这样有可能导致写I/O操作的一些延时。这个调度器适用于通常的一些应用,比如大部分的个人电脑。

(2)Complete Fair Queuing (CFQ)

Complete Fair Queuing(CFQ)调度器是Red Hat Enterprise Linux使用的标准算法。CFQ调度器使用QoS策略为系统内的所有任务分配相同的带宽。CFQ调度器适用于有大量计算进程的多用户系统。它试图避免进程被饿死和实现了比较低的延迟。

(3)Deadline

deadline调度器是使用deadline算法的轮询的调度器,提供对I/O子系统接近实时的操作,deadline调度器提供了很小的延迟和维持一个很好的磁盘吞吐量。如果使用deadline算法请确保进程资源分配不会出现问题。

(4)NOOP

NOOP调度器是一个简化的调度程序它只作最基本的合并与排序。与桌面系统的关系不是很大,主要用在一些特殊的软件与硬件环境下,这些软件与硬件一般都拥有自己的调度机制对内核支持的要求很小,这很适合一些嵌入式系统环境。作为桌面用户我们一般不会选择它。

5.网络子系统

新的网络中断缓和(NAPI)对网络子系统带来了改变,提高了大流量网络的性能。Linux内核在处理网络堆栈时,相比降低系统占用率和高吞吐量更关注可靠性和低延迟。所以在某些情况下,Linux建立一个防火墙或者文件、打印、数据库等企业级应用的性能可能会低于相同配置的Windows服务器。

在传统的处理网络封包的方式中,如下图蓝色箭头所描述的,一个以太网封包到达网卡接口后,如果MAC地址相符合会被送到网卡的缓冲区中。网卡然后将封包移到操作系统内核的网络缓冲区中并且对CPU发出一个硬中断,CPU会处理这个封包到相应的网络堆栈中,可能是一个TCP端口或者Apache应用中。

这是一个处理网络封包的简单的流程,但从中我们可以看到这个处理方式的缺点。正如我们看到的,每次适合网络封包到达网络接口都将对CPU发出一个硬中断信号,中断CPU正在处理的其他任务,导致切换动作和对CPU缓存的操作。你可能认为当只有少量的网络封包到达网卡的情况下这并不是个问题,但是千兆网络和现代的应用将带来每秒钟成千上万的网络数据,这就有可能对性能造成不良的影响。

按此在新窗口浏览图片

正是因为这个情况,NAPI在处理网络通讯的时候引入了计数机制。对第一个封包,NAPI以传统的方式进行处理,但是对后面的封包,网卡引入了POLL的轮询机制:如果一个封包在网卡DMA环的缓存中,就不再为这个封包申请新的中断,直到最后一个封包被处理或者缓冲区被耗尽。这样就有效的减少了因为过多的中断CPU对系统性能的影响。同时,NAPI通过创建可以被多处理器执行的软中断改善了系统的可扩展性。NAPI将为大量的企业级多处理器平台带来帮助,它要求一个启用NAPI的驱动程序。在今天很多驱动程序默认没有启用NAPI,这就为我们调优网络子系统的性能提供了更广阔的空间。

6.Linux文件系统

Linux作为一个开源操作系统的优势之一就是为用户提供了多种操作系统的支持。现代Linux内核几乎可以支持所有计算机系统常用的文件系统,从基本的FAT到高性能的文件系统例如JFS。因为Red Hat Enterprise Linux主要支持两种文件系统(ext2和ext3),我们将主要介绍它们的特点,对其他Linux文件系统我们仅做简要介绍。

(1)ext2

ext2文件系统是ext3文件系统的前身。是一个快速、简便的文件系统,它与目前大部分文件系统的显著不同就是ext2不支持日志。

(2)ext3,Red Hat默认的文件系统

自从Red Hat 7.2开始,安装默认的文件系统就是ext3。Ext3是应用广泛的ext2文件系统的更新版本,它加入了对日志的支持。下面列举了这个文件系统的一些特性。
·可用性:ext3可以保证数据写入磁盘的一致性,万一出现了非正常的关机(电源的失效或者系统的崩溃),服务器不需要花费时间去校验数据的一致性,因此极大的减少了系统恢复的时间。

·数据完整性:加入特殊的日志功能,所有数据,包括文件数据和元数据都是有日志记录的。
·速度:通过data=writeback参数,你可以根据应用的需要来调整数据的写入速度。
·灵活性:从ext2转换到ext3文件系统是非常简单的并且不需要重新格式化硬盘。通过执行tune2fs命令和编辑/etc/fstab文件,你可以非常容易的将ext2文件系统更新到ext3文件系统。Ext3文件系统也可以禁用日志后作为ext2使用。利用一些第三方的工具软件可以更灵活的使用ext3文件系统,比如PartitionMagic可以编辑ext3分区。

(3)ReiserFS

ReiserFS是一个快速的日志文件系统,它优化了磁盘空间的使用、加快了故障恢复速度。今天ReiserFS是SUSE Linux默认的文件系统。

(4)JFS

JFS是一个完全64位的文件系统,它可以支持非常大的文件和分区。JFS是由IBM为AIX系统开发的,现在在GPL license下以及可以使用了。JFS对大容量的分区和文件,尤其是HPC和数据库应用来说是一种理想的操作系统。如果你想了解更多关于JFS的信息,请访问下面链接
http://jfs.sourceforge.net

(5)XFS 
XFS是SGI为IRIX系统开发的高性能的日志文件系统。它的特点和应用都和JFS相当接近。

7.Proc文件系统

proc文件系统不是一个实时文件系统,但是它的作用却非常大。它提供了一个运行中的内核的接口,并不存储实际的数据。Proc文件系统使系统管理员可以监控和调整内核运行状态。下图描述了一个proc文件系统的示例,大部分Linux性能调优工具都需要借助proc文件系统的信息来进行工作。

按此在新窗口浏览图片

在proc文件系统中,我们可以看到分别记录不同信息的多个子目录,但是proc目录下的大部分文件可读性都不是很强,建议最好使用可读性更强的工具例如vmstat等来查看proc中记录的信息。请牢记proc目录的相应目录结构。

·在/proc目录下的文件

proc根目录下保存着一些记录了系统信息的文件,这些文件你可以通过vmstat和cpuinfo等工具来读取。

·数字1到X

各个以数字为名称的文件夹,代表的是运行进程的PID。例如,目录1记录了init进程的一些统计信息。

·acpiapci是一个现代桌面和笔记本电脑的电源配置和管理接口,因为apci主要是一个个人电脑的技术,所以在一些服务器系统上经常被禁用。可以访问下面链接获得更多acpi的相关信息http://www.apci.info

·bus

这个子目录记录了系统的总线子系统的信息,例如pci总线或者usb接口。

·irq

irq子目录下记录了系统的中断信息。

·net

net子目录记录了一些关于你的网卡的重要信息,比如接收的多点广播封包或者每个网卡的路由。

·scsi

scsi子目录包含了关于系统的scsi子系统的信息,例如连接的设备或者驱动的版本。ips子目录是记录关于IBM ServerRAID阵列卡信息的。

·sys

sys目录下包含了一些可以调整的内核参数。

·tty

tty子目录包含了系统虚拟终端的信息。

8.理解Linux调优参数

在我们介绍Linux系统的各种调优参数和性能监测工具之前,需要先讨论一些关于性能调优的参数。因为Linux是一个开源操作系统,所以又大量可用的性能监测工具。对这些工具的选择取决于你的个人喜好和对数据细节的要求。所有的性能监测工具都是按照同样的规则来工作的,所以无论你使用哪种监测工具都需要理解这些参数。下面列出了一些重要的参数,有效的理解它们是很有用处的。

(1)处理器参数

·CPU utilization

这是一个很简单的参数,它直观的描述了每个CPU的利用率。在xSeries架构中,如果CPU的利用率长时间的超过80%,就可能是出现了处理器的瓶颈。

·Runable processes

这个值描述了正在准备被执行的进程,在一个持续时间里这个值不应该超过物理CPU数量的10倍,否则CPU方面就可能存在瓶颈。

·Blocked

描述了那些因为等待I/O操作结束而不能被执行的进程,Blocked可能指出你正面临I/O瓶颈。

·User time

描述了处理用户进程的百分比,包括nice time。如果User time的值很高,说明系统性能用在处理实际的工作。

·System time

描述了CPU花费在处理内核操作包括IRQ和软件中断上面的百分比。如果system time很高说明系统可能存在网络或者驱动堆栈方面的瓶颈。一个系统通常只花费很少的时间去处理内核的操作。

·Idle time

描述了CPU空闲的百分比。

·Nice time

描述了CPU花费在处理re-nicing进程的百分比。

·Context switch

系统中线程之间进行交换的数量。

·Waiting

CPU花费在等待I/O操作上的总时间,与blocked相似,一个系统不应该花费太多的时间在等待I/O操作上,否则你应该进一步检测I/O子系统是否存在瓶颈。

·Interrupts

Interrupts值包括硬Interrupts和软Interrupts,硬Interrupts会对系统性能带来更多的不利影响。高的Interrupts值指出系统可能存在一个软件的瓶颈,可能是内核或者驱动程序。注意Interrupts值中包括CPU时钟导致的中断(现代的xServer系统每秒1000个Interrupts值)。

(2)内存参数

·Free memory

相比其他操作系统,Linux空闲内存的值不应该做为一个性能参考的重要指标,因为就像我们之前提到过的,Linux内核会分配大量没有被使用的内存作为文件系统的缓存,所以这个值通常都比较小。

·Swap usage

这个值描述了已经被使用的swap空间。Swap usage只表示了Linux管理内存的有效性。对识别内存瓶颈来说,Swap In/Out才是一个比较又意义的依据,如果Swap In/Out的值长期保持在每秒200到300个页面通常就表示系统可能存在内存的瓶颈。

·Buffer and cache

这个值描述了为文件系统和块设备分配的缓存。注意在Red Hat Enterprise Linux 3和更早一些的版本中,大部分空闲内存会被分配作为缓存使用。在Red Hat Enterprise Linux 4以后的版本中,你可以通过修改/proc/sys/vm中的page_cache_tuning来调整空闲内存中作为缓存的数量。

·Slabs

描述了内核使用的内存空间,注意内核的页面是不能被交换到磁盘上的。

·Active versus inactive memory

提供了关于系统内存的active内存信息,Inactive内存是被kswapd守护进程交换到磁盘上的空间。

(3)网络参数

·Packets received and sent

这个参数表示了一个指定网卡接收和发送的数据包的数量。

·Bytes received and sent

这个参数表示了一个指定网卡接收和发送的数据包的字节数。

·Collisions per second

这个值提供了发生在指定网卡上的网络冲突的数量。持续的出现这个值代表在网络架构上出现了瓶颈,而不是在服务器端出现的问题。在正常配置的网络中冲突是非常少见的,除非用户的网络环境都是由hub组成。

·Packets dropped

这个值表示了被内核丢掉的数据包数量,可能是因为防火墙或者是网络缓存的缺乏。

·Overruns

Overruns表达了超出网络接口缓存的次数,这个参数应该和packets dropped值联系到一起来判断是否存在在网络缓存或者网络队列过长方面的瓶颈。

·Errors

这个值记录了标志为失败的帧的数量。这个可能由错误的网络配置或者部分网线损坏导致,在铜口千兆以太网环境中部分网线的损害是影响性能的一个重要因素。

(4)块设备参数

·Iowait

CPU等待I/O操作所花费的时间。这个值持续很高通常可能是I/O瓶颈所导致的。

·Average queue length

I/O请求的数量,通常一个磁盘队列值为2到3为最佳情况,更高的值说明系统可能存在I/O瓶颈。

·Average wait

响应一个I/O操作的平均时间。Average wait包括实际I/O操作的时间和在I/O队列里等待的时间。

·Transfers per second

描述每秒执行多少次I/O操作(包括读和写)。Transfers per second的值与kBytes per second结合起来可以帮助你估计系统的平均传输块大小,这个传输块大小通常和磁盘子系统的条带化大小相符合可以获得最好的性能。

·Blocks read/write per second

这个值表达了每秒读写的blocks数量,在2.6内核中blocks是1024bytes,在早些的内核版本中blocks可以是不同的大小,从512bytes到4kb。

·Kilobytes per second read/write

按照kb为单位表示读写块设备的实际数据的数量。

 

二.性能监测工具Linux开放和灵活的特性使得它有很多的性能监测软件,这些工具中有的是传统UNIX系统的Linux版本,其他是专门为Linux设计的工具,大部分Linux性能监测工具都是基于proc虚拟文件系统的。在这一章里我们介绍一些常用性能监测工具和讨论一些有用的命令。所有我们讨论的工具,除了Capacity Manager,都是Red Hat Enterprise Linux (RHEL)所提供的,不需要从网络下载或者其他途径得到。

 

1.uptime

Uptime命令的显示结果包括服务器已经运行了多长时间,有多少登陆用户和对服务器性能的总体评估(load average)。load average值分别记录了上个1分钟,5分钟和15分钟间隔的负载情况,load average不是一个百分比,而是在队列中等待执行的进程的数量。如果进程要求CPU时间被阻塞(意味着CPU没有时间处理它),load average值将增加。另一方面,如果每个进程都可以立刻得到访问CPU的时间,这个值将减少。

load average的最佳值是1,这说明每个进程都可以立刻被CPU处理。在不同的系统间这个值也是不同的,例如一个单CPU的工作站,load average为1或者2都是可以接受的,但是在一个多CPU的系统中这个值通常为8或者10。

你可以使用uptime判断一个性能问题是出现在服务器上还是网络上。例如,如果一个网络应用运行性能不理想,运行uptime检查系统负载是否比较高,如果不是这个问题更可能出现在你的网络上。

Uptime命令执行示例

按此在新窗口浏览图片

Tip:你可以用w命令代替uptime,w命令也可以提供目前登陆用户的信息。

2.Dmesg

Dmesg的主要功能是显示内核信息,当硬件或者内核中加载的模块出现问题的时候dmesg可以提供一些有用的信息。另外,利用dmesg你可以查看有哪些硬件安装在你的服务器上。在每次启动的时候,Linux检查硬件并且记录这些信息。你可以使用/bin/dmesg命令来查看这些信息。

按此在新窗口浏览图片

3.Top

Top命令显示了实际CPU使用情况,默认情况下,它显示了服务器上占用CPU的任务信息并且每5秒钟刷新一次。你可以通过多种方式分类它们,包括PID、时间和内存使用情况。
下图是一个top命令结果的示例,

按此在新窗口浏览图片

你可以使用renice命令为一个进程分配新的优先级。如果一个进程宕掉或者占用了太多的内存,可以使用kill命令杀死进程。下面是输出值的介绍,
PID:进程标识
USER;进程所有者的用户名
PRI:进程的优先级
NI:nice级别
SIZE:进程占用的内存数量(代码+数据+堆栈)
RSS;进程使用的物理内存数量
SHARE;该进程和其他进程共享内存的数量
STAT:进程的状态:S=休眠状态,R=运行状态,T=停止状态,D=中断休眠状态,Z=僵尸状态
%CPU:共享的CPU使用
%MEM;共享的物理内存
TIME:进程占用CPU的时间
COMMAND:启动任务的命令行(包括参数)

Top命令有下面几个有用的热键,包括
t:是否显示概要信息
m:是否显示内存信息
A:通过不同的系统资源情况分类显示结果,对快速判断系统中影响性能的进程十分有效
f:输入一个top的交互式的配置画面
o:激活交换式的分类的选择

进程的优先级和nice级别

进程优先级是一个决定进程被CPU执行优先顺序的参数,内核会根据需要调整这个值。Nice值是一个对优先权的限制。进程优先级的值不能低于nice值。(nice值越低优先级越高)

进程优先级是无法去手动改变的,只有通过改变nice值去间接的调整进程优先级。如果一个进程运行的太慢了,你可以通过指定一个较低的nice值去为它分配更多的CPU资源。当然,这意味着其他的一些进程将被分配更少的CPU资源,运行更慢一些。Linux支持nice值的范围是19(低优先级)到-20(高优先级),默认的值是0。如果需要改变一个进程的nice值为负数(高优先级),必须使用su命令登陆到root用户。下面是一些调整nice值的命令示例,
以nice值-5开始程序xyz
#nice –n -5 xyz
改变已经运行的程序的nice值
#renice level pid
将pid为2500的进程的nice值改为10
#renice 10 2500

僵尸进程

当一个进程被结束,在它结束之前通常需要用一些时间去完成所有的任务(比如关闭打开的文件),在一个很短的时间里,这个进程的状态为僵尸状态。在进程完成所有关闭任务之后,会向父进程提交它关闭的信息。有些情况下,一个僵尸进程不能关闭它自己,这时这个进程状态就为z(zombie)。不能使用kill命令杀死僵尸进程,因为它已经标志为“dead”。如果你无法摆脱一个僵尸进程,你可以杀死它的父进程,这个僵尸进程也就消失了。然而,如果父进程是init进程,你不能杀死init进程,因为init是一个重要的系统进程,这种情况下你只能通过一次重新启动来摆脱僵尸进程。

4.iostat

iostat是sysstat的一部分,如果你没有安装这个包,在Red Hat Enterprise Linux光盘中找到sysstat的rpm包进行安装。Iostat显示自系统启动后的平均CPU时间(与uptime类似),它也可以显示磁盘子系统的使用情况,iostat可以用来监测CPU利用率和磁盘利用率。下图是一个命令输出的示例,

按此在新窗口浏览图片

CPU利用率分四个部分:
%user:user level(应用)的CPU占用率情况
%nice:加入nice优先级的user level的CPU占用率情况
%sys:system level(内核)的CPU占用情况
%idle:空闲的CPU资源情况
磁盘占用率有下面几个部分:
Device:块设备名
Tps:设备每秒进行传输的数量(每秒的I/O请求)。多个单独的I/O请求可以被组成一个传输操作,因为一个传输操作可以是不同的容量。
Blk_read/s, Blk_wrtn/s:该设备每秒读写的块的数量。块可能为不同的容量。块的大小一般为1024、2048、4048byte。例如,块设备/dev/sda1的块大小可以通过下面命令查看
# dumpe2fs -h /dev/sda1 |grep -F ”Block size”
会得到类似下面的输出
dumpe2fs 1.34 (25-Jul-2003)
Block size: 1024

Blk_read, Blk_wrtn:自系统启动以来读写的块设备的总量。

5.Vmstat

Vmstat命令提供了对进程、内存、页面I/O块和CPU等信息的监控,vmstat可以显示检测结果的平均值或者取样值,取样模式可以提供一个取样时间段内不同频率的监测结果。下面是一个vmstat命令的输出结果的示例。
注:在取样模式中需要考虑在数据收集中可能出现的误差,将取样频率设为比较低的值可以尽可能的减小误差的影响。

按此在新窗口浏览图片

下面介绍一下各列的含义
·process(procs)
r:等待运行时间的进程数量
b:处在不可中断睡眠状态的进程
w:被交换出去但是仍然可以运行的进程,这个值是计算出来的
·memoryswpd:虚拟内存的数量
free:空闲内存的数量
buff:用做缓冲区的内存数量
·swap
si:从硬盘交换来的数量
so:交换到硬盘去的数量
·IO
bi:向一个块设备输出的块数量
bo:从一个块设备接受的块数量
·system
in:每秒发生的中断数量, 包括时钟
cs:每秒发生的context switches的数量
·cpu(整个cpu运行时间的百分比)
us:非内核代码运行的时间(用户时间,包括nice时间)
sy:内核代码运行的时间(系统时间)
id:空闲时间,在Linux 2.5.41之前的内核版本中,这个值包括I/O等待时间
等待I/O操作的时间,在Linux 2.5.41之前的内核版本中这个值为0

Vmstat命令提供了大量的附加参数,可以参考vmstat的man手册去查询所有的参数,下面列举几个十分有用的参数。
·m:显示内核的内存利用率
·a:显示内存页面信息,包括活跃和不活跃的内存页面
·n:显示报头行,这个参数在使用取样模式并将命令结果输出到一个文件时非常有用。例如root#vmstat –n 2 10以2秒的频率显示10输出结果
·当使用-p {分区}时,vmstat提供对I/O结果的统计

6.ps和pstree

ps和pstree命令是系统分析最常用的基本命令,ps命令提供了一个正在运行的进程的列表,列出进程的数量取决于命令所附加的参数。例如ps –A 命令列出所有进程和它们相应的进程ID(PID),进程的PID是使用其他一些工具之前所必须了解的,例如pmap或者renice。
在运行java应用的系统上,ps –A 命令的输出很容易就会超过屏幕的显示范围,这样就很难得到所有进程的完整信息。这时,使用pstree命令可以以树状结构来显示所有的进程信息并且可以整合子进程的信息。Pstree命令对分析进程的来源十分有用。下面是命令的示例,

按此在新窗口浏览图片

7.Numastat

随着NUMA架构的不断发展,例如eServer xSeries 445及其后续产品eServer xSeries 460,现在NUMA架构已经成为了企业级数据中心的主流。然而,NUMA架构在性能调优方面面临了新的挑战,例如内存分配的问题在NUMA系统之前并没人感兴趣,Red Hat Enterprise Linux 4提供了一个监测NUMA架构的工具。Numastat命令提供了本地内存与远程内存使用情况的对比和各个节点的内存使用情况。Numa_miss列显示分配失败的本地内存,numa_foreign列显示分配远程内存(访问速度慢)信息,过多的调用远程内存将增加系统的延迟从而影响整个系统的性能。使运行在一个节点上的进程都访问本地内存将极大的改善系统的性能。

按此在新窗口浏览图片

8.sar

sar程序是sysstat安装包的一部分,如果你没有安装这个包,在Red Hat Enterprise Linux的源文件中寻找这个rpm包进行安装,sar命令用于收集、报告和保存系统的信息。Sar命令由三个应用组成:sar,用与显示数据;sa1和sa2,用于收集和存储数据。关于sar工具的详细参数说明可以参考man手册。

为了以后分析日志,可以使用sa1和sa2配置系统获得并且记录日志信息。为了实现这个目的,如下图例所示向/etc/crontab中加入相应的内容。注意默认的情况下cron每天都会定时的运行sar命令,如果系统安装了sar相应的安装包。

按此在新窗口浏览图片

sar命令所生成的数据保存在/var/log/sa/目录下,数据按照时间保存,可以根据时间来查询相应的性能数据。例如,显示21号的网络信息使用下面的命令sar -n DEV -f sa21|less,命令结果如下,

按此在新窗口浏览图片

你也可以使用sar在命令行下得到一个实时的执行结果,收集的数据可以包括CPU利用率、内存页面、网络I/O等等。如下例所示,

按此在新窗口浏览图片

9.KDE System Guard

KDE System Guard (KSysguard)是一个KDE的任务管理器和性能监测工具。它是一个客户端/服务器结构的应用,因此可以监测本地或者远程主机。

按此在新窗口浏览图片

图形界面中可以用左侧的Sensor选择显示的信息,一个Sensor可以返回一个简单的值或者更复杂的信息例如表格。针对每一类信息都提供了一个或多个显示信息,这些显示信息可以保存或者互相独立的在工作表中加载。
KSysguard窗口中包括菜单栏、工具栏和状态栏,页面浏览和工作区。当你第一次打开时,可以看到默认的情况:本地主机做为localhost列在Sensor浏览里,在工作区中有两个表格。每个Sensor监测某些系统参数,所有的Sensor显示可以在工作区中以拖拽的形式操作,有下面三个选项:
·可以在工作区中删除和代替Sensor
·可以编辑工作表的属性以增加显示的行数和列数
·可以建立新的工作表并且加入新的Sensor以满足应用的需要

下面介绍一下工作区,如下图所示工作区中显示两张表,
·system load:在启动KSysguard中默认显示的
·process Table

按此在新窗口浏览图片

System load工作表中包括四个Sensor窗口,cpu负载、平均负载、物理内存和交换空间。多个Sensor可以被显示在一个窗口中,如果想查看窗口中正在监测的分Sensor信息,将鼠标移到图标上,相应的说明会显示出来。也可以在图标上点鼠标右键选择Properties,然后选择页面表,就可以看到相应的说明信息。

按此在新窗口浏览图片

点击Process Table表将显示所有在服务器上运行进程的信息,这个表默认显示的是系统CPU的利用率,但是它可以通过选择其他分页来显示其他信息。

按此在新窗口浏览图片

因为环境或者应用的需要,你可能有多种不同的Sensor需要监测,实现这个最好的方法就是自定义一个工作表。下面就简单的指导一下如何根据需要建立自定义的工作表。
(1).创建一个空的工作表,点击File → New。

按此在新窗口浏览图片

(2).输入标题、工作表的行数和列数,也就是监测窗口的数量,在例子中是4个。当信息输入完成后,点击ok建立空工作表。

按此在新窗口浏览图片

(3).在窗口左边将需要的Sensor拖到右边的窗口中。
(4).点击File → Save保存新的工作表。

按此在新窗口浏览图片

如果想要了解关于KDE System Guard的更多信息请访问下面的链接
http://docs.kde.org/en/3.2/kdebase/ksysgaurd

10.Gnome System Monitor

虽然没有KDE System Guard那么强大的功能,Gnome桌面环境也有自己的图形化的性能监测工具。Gnome System Monitor可以图形化的显示系统性能相关的参数,所有的统计结果都是实时的,如果需要长时间的统计结果需要通过其他的性能监测工具来实现。

11.free

free命令显示系统的所有内存的使用情况,包括空闲内存、被使用的内存和交换内存空间。Free命令显示也包括一些内核使用的缓存和缓冲区的信息。下面是命令结果的示例,

按此在新窗口浏览图片

当使用free命令的时候,需要记住linux的内存结构和虚拟内存的管理方法,比如空闲内存数量的限制,还有swap空间的使用并不标志一个内存瓶颈的出现。
Free命令有用的参数:
·-b,-k,-m和-g分别按照bytes, kilobytes, megabytes, gigabytes显示结果。
·-l区别显示low和high内存
·-c {count}显示free输出的次数

12.Pmap

pmap命令显示一个或者多个进程使用内存的数量,你可以用这个工具来确定服务器上哪个进程占用了过多的内存从而导致内存瓶颈。
命令格式:pmap 
关于pmap命令的详细语法可以使用下面命令查询
pmap -?

按此在新窗口浏览图片

13.Strace

strace截取和记录进程的系统调用信息,还包括进程接受的命令信号。这是一个有用的诊断和调试工具,系统管理员可以通过strace来解决程序上的问题。
命令格式,需要指定需要监测的进程ID,下图是一个命令结果的示例。
strace -p 
使用下面命令可以获得关于strace的完整语法信息
strace -?
注:当针对某个进程执行strace命令时,对该进程的运行性能将产生很大的影响,所以这个命令仅仅应该用在收集数据的时候。

按此在新窗口浏览图片

14.ulimit

这个命令是基于bash的,可以通过ulimit来控制系统资源的使用,使用-a参数列出所有可调的参数。
ulimit –a

按此在新窗口浏览图片

-H和-S参数可以对指定的资源进行软限制和硬限制,如果超过了软限制,系统管理员会接收到一个警告,在达到硬限制的时候命令就会提示报错。
例如,为系统打开文件的数量设定一个硬限制
ulimit -Hn 4096
为打开文件设定一个软限制
ulimit -Sn 1024
查看硬限制和软限制的值
ulimit -Hn
ulimit -Sn
这是一个很有用的命令,例如现在想在系统启动时对Oracle用户进行限制,在/etc/security/limits.conf中加入如下两行:
soft nofile 4096
hard nofile 10240
另外确保/etc/pam.d/system-auth文件有下面内容
session required /lib/security/$ISA/pam_limits.so
这一行确保系统会执行这个限制。
如果要查看ulimit命令的详细语法,可以执行
ulimit -?

15.Mpstat

mpstat命令是sysstat包的一部分,如果没有安装sysstat包,可以在Red Hat Enterprise Linux安装源文件中找到并且安装这个rpm包。Mpstat命令用于监测一个多CPU系统中每个可用CPU的情况。Mpstat命令可以显示每个CPU或者所有CPU的运行情况,同时也可以像vmstat命令那样使用参数进行一定频率的采样结果的监测。下面是使用mpstat -P ALL命令的显示结果的示例,

按此在新窗口浏览图片

关于完整的命令语法请用下面命令查看
mpstat -?

16. Capacity Manager

Capacity Manager是IBM Director系统管理的一个附加组件,可以提供对不同平台下的多个系统进行长期的性能监测。除了对性能的监测,Capacity Manager还包括对容量的计划,提供对系统将来可能的容量的分析和建议。Capacity Manager可以输出多种文件格式包括HTMLXMLGIF。IBM Director可以被应用在不同操作系统平台下,这样就为在异构环境下对数据的收集和分析提供了有力的工具。

如果使用Capacity Manager,必须在系统中安装相关的rpm包。安装完成后在IBM Director Console中选择Capacity Manager →Monitor Activator

按此在新窗口浏览图片

拖拽Monitor Activator图标到一个单独的或者一组已经安装相应程序的系统,在接下来的窗口中可以选择多种子系统进行监测。Capacity Manager在Linux下会有少部分功能受一些参数的限制。

按此在新窗口浏览图片

Monitor Activator窗口在右边的窗口中显示相关系统目前的状态,在左边的窗口中显示显示可用的性能监测。添加一个新的监测,选择相应的监测图标点击On。改变将在Monitor Activator窗口关闭后马上生效,配置完成后,IBM Director将开始收集并且存储所要求的性能数据。如果要为收集的信息创建一个报告,选择Capacity Manager → Report Generator并且拖拽操作你想监测的单个或者一组系统,IBM Director将显示下面的界面,

按此在新窗口浏览图片

在这里根据你的需要选择是立刻执行或者指定时间执行。在生产环境中,在固定的时间收集Capacity Manager报告是一个比较好的方法,我们可以选择在每周末系统并不繁忙的时候产生一次系统报告。一旦报告收集完成将存储在IBM Director服务器上,可以通过Report Viewer任务来查看。
下图是一个报告结果的示例

按此在新窗口浏览图片

在Report Viewer窗口中可以选择需要查看的不同性能参数,Capacity Manager的结果可以被输出为HTML或者XML文件,为了分析需要可以被显示在内部的web服务器上。

 

三.操作系统的调优Linux发行版本和Linux内核提供了大量的参数和设定来帮助系统管理员调优系统使之发挥最大的性能。这一章描述了调优Red Hat Enterprise Linux AS系统的步骤和理解使用Linux系统的一些技能,包括
·Linux的内存管理
·Linux的页面管理
·文件系统和它对性能的影响
·禁用非必须的守护进程
·使用sysctl调优参数

3.1 调优之前准备

在我们没有开始讨论调优工作之前,一些好的调优的手段对我们是很重要的,下面列出一些相关的提示。
·在调优任何Linux系统之前,计划一个适合的调优进程。
·不要在一个生产系统上进行调优测试。
·在调优进程中不要同时改变多个调优参数。
·反复测试可能改变系统性能的参数,有时可以用统计数据来验证结果。
·记录成功的参数并且和社区分享它们,无论你认为它们多么繁琐。

3.2 安装

在理想的情况下,对一个系统的调优应该开始在一个非常早的阶段,一个系统应该按照应用预想的工作量来设计。我们能理解大多数情况下系统管理员都是在一个已经安装的系统遇到性能瓶颈的情况下才开始性能调优工作的,但我们还是要介绍下在系统初始化安装的过程中可能的调优操作。

理想情况下,下面问题应该在Linux系统开始安装之前考虑
·需要什么版本的Red Hat Linux?
在收集商业和应用的需求之后,我们需要决定选择哪种Linux版本。企业版做为一种特殊的Linux发行版本通常有商业的合约。如果你选择Red Hat Enterprise Linux还需要考虑下面几点:
选择企业版本Linux还是自定义版本Linux?
在某些科学实验环境中,通常可以接收运行一个没有支持的Linux版本,例如Fedora。但是对一个企业级的应用来说,我们强烈推荐一个有支持的Linux版本,例如Red Hat Enterprise Linux。
企业级Linux版本?
Red Hat Enterprise Linux有两个不同的版本:Enterprise Server和Advanced Server。这两个版本的区别主要在扩展性方面,Enterprise Server限制在支持2个CPU和16GB内存,因此当使用一些类似web服务器和分布式架构时Enterprise Server是一个正确的选择。Red Hat Enterprise Linux 的Advanced Server版本支持32个CPU和64GB内存。
随着x86-64架构的到来(包括AMD64和EM64T),客户也面对着选择32bit或者64bit操作系统的问题。我们的基准测试结果显示Linux系统在x86-64CPU上运行64bit系统会有着更出色的性能表现,除了性能,我们还应该考虑到扩展性和未来应用的需要。使用64bit操作系统还提供了可以同时运行32bit应用(i386)和64bit(x86-64)应用的优势。考虑到上述方面,我们通常建议用户在x86-64架构上使用64bit操作系统,除非因为应用的原因导致不能部署在64bit系统上。
·如何进行分区的规划?
在Linux社区中,对磁盘子系统的分区经常引起很大的讨论。磁盘子系统分区的规划通常都是由应用的需要、系统管理的考虑和个人喜好决定的,基本没有性能的考虑。在这里我们唯一给出的建议就是如果可能尽量使用swap分区,swap分区相对于swap文件的性能会有提升,因为不需要文件系统方面的开销。Swap分区建立很简单并且可以添加附加的swap分区甚至swap文件。

·应该使用什么文件系统?
Red Hat Enterprise Linux在安装时提供文件系统的选择很有限,默认只有两种可用的文件系统:ext2和ext3。Red Hat Enterprise Linux安装程序默认选择的文件系统是ext3,这在大多数情况下都是可以接收的,但我们也鼓励你考虑使用ext2文件系统。对一些比较小的文件系统可能并不过分的关注数据一致性(例如:web群集服务器),或者系统对性能提出了严格的要求(例如:高性能计算环境),在上述情况下使用ext2文件系统可能会带来性能上的帮助,因为ext2不需要维护日志的系统开销,即使ext3文件系统在这方面进行了很大的改变,这仍然是一个显著的不同。同时也可以考虑到ext2文件系统可以很容易的升级到ext3文件系统。

·安装包的选择:最小安装或者完全安装?
在Red Hat Enterprise Linux安装过程中,系统管理员面对选择最小安装或者完全安装。有些人更愿意选择完全安装为了避免在以后安装rpm包时面对依存关系的问题。但需要考虑到下面的问题,与性能无关,很重要的一点是在选择完全安装或者几乎完全安装会对系统的安全产生负面的影响。在生产系统上安装一些开发工具会对系统的安全产生负面的影响。安装比较少的安装包,可以节省更多的磁盘空间,磁盘的空余空间越大性能越好。一些智能的软件包安装工具会自动的解决安装包的依存问题,例如Red Hat Packet Manager、rpm或者yum。所以我们建议仅仅安装与应用相关的必需安装的软件包。

·SELinux(仅针对Red Hat Enterprise Linux 4)
在Red Hat Enterprise Linux安装过程中,Anaconda安装程序默认选择安装SELinux,然而SELinux会对系统的性能产生负面的影响,所以要谨慎的决定你的系统是否需要SELinux所提供的附加的安全支持。在后面会对SELinux做进一步的介绍。

·运行级别的选择
安装阶段最后一个选择是系统默认的运行级别。我们强烈建议你为服务器系统选择默认运行级别为3,除非你有特殊的需要将默认的运行级别设为5(图形用户模式)。通常在数据中心的服务器不需要GUI图形用户界面进行操作,因为考虑到运行级别5的GUI带来的系统开销。

3.3 守护进程

Red Hat Enterprise Linux默认安装完成后,一些可能并不是必须的守护进程会启用。禁用非必要的进程会减少系统的内存开销,同时也可以减少系统的安全隐患,可以释放更多的内存空间、减少系统的启动时间、减少CPU处理的进程数量。
默认情况下,很多守护进程可以安全的在系统下停止和禁用。下表列出了Red Hat Enterprise Linux安装的一些守护进程,如果不是必须的你可以考虑禁用这些进程,注意下表列出的对Red Hat Enterprise Linux3和4的区别。

按此在新窗口浏览图片

注:关闭xfs服务后,服务器上的X window将不能被启动。在使用startx命令启动X window之前应该首先启动xfs进程。

在Red Hat Enterprise Linux系统中,系统管理员可以使用/sbin/chkconfig命令很方便的修改各种守护进程的启动选项,下面命令列出了所有当前运行的守护进程
/sbin/chkconfig –list|grep on

如果你想某个守护进程在下次服务器启动时不再自动启动,使用root执行下面两个命令可以达到相同的效果,不同之处是第二个命令在所有运行级别都会禁用此进程,而使用–level参数可以指定选择的运行级别。
/sbin/chkconfig –level 2345 sendmail off
/sbin/chkconfig sendmail off
注:大家经常以为使用chkconfig做出改变之后必须在下一次重新启动才能生效,其实改变执行运行级别的操作可以实现同重新启动一样的效果。代替浪费时间的重新启动,简单的改变运行基本到1再改变回3或者5就可以改变配置。

还有另外一个有用的命令/sbin/service,通过这个命令系统管理员可以立刻更改已注册服务的状态。下面的例子是查看sendmail服务的状态,
/sbin/service sendmail status
立刻停止sendmail服务
/sbin/service sendmail stop
service命令在需要立刻改变服务状态的情况下是非常有效的,因为使用chkconfig命令必须在改变运行级别或者重新启动后才能生效,但是使用service命令关闭的守护进程在重新启动服务器后又会启动。

如下图所示系统还提供了基于GUI的修改守护进程的工具,图形界面中点击Main Menu → System Settings → Server Settings →Services或者执行下面命令
/usr/bin/redhat-config-services

按此在新窗口浏览图片

3.4 改变运行级别

如果可能,尽量不要在Linux服务器上运行图形用户界面,通常大多数系统管理员都喜欢更有效的通过命令行方式完成系统的管理任务。如果你喜欢使用图形界面,一些有用的基于web的工具可以帮助你,例如webmin,Linuxconf和SWAT。
Tip:即使GUI在本地禁用了,你仍然可以使用ssh加-X参数远程连接到服务器上。

如果必须要使用GUI图形用户界面,在需要使用时启动GUI然后关闭比一直启动GUI更合适一些。在大多数情况下运行级别都设为3,即在机器启动的时候不运行X window。如果需要启动X window,在命令提示符下使用startx命令。
查看当前运行级别可以使用runlevel命令,命令结果显示前一个运行级别和当前运行级别。
在运行级别之间进行切换,使用init命令。例如,切换到运行级别3,使用init 3命令。

Linux常用的运行级别:

0 关机,不要将默认运行级别设为0,否则机器启动进程完成后马上就会关机。
1 单用户模式
2 多用户,没有NFS,和运行级别3的区别是没有网络连接支持
3 完全多用户模式
4 未用
5 X11图形用户界面模式
6 重新启动,不要将默认运行级别设为6,否则机器将不停的重新启动。

编辑/etc/inittab文件中下面内容可以改变系统默认的运行级别,
id:3:initdefault:

按此在新窗口浏览图片

3.5 限制本地终端

默认的情况下,系统打开了六个本地虚拟终端:通过F1到F6可以访问不同的终端。虚拟终端所占用的内存数量可以忽略不计,然而我们试图得到系统最大的性能,另外减少运行进程的数量可以简化解决问题和进程分析的过程,所以这里建议将本地终端的数量限制为两个。可以通过在/etc/inittab中将mingetty相关行注释掉来实现限制本地终端,下图是将本地终端限制为2个的示例。

按此在新窗口浏览图片

3.6 SELinux

Red Hat Enterprise Linux 4引入了一个新的安全模型Security Enhanced Linux(SELinux),在面对高级别的安全需求的时候它是一个有效的手段。SELinux提供了新的强制认证的安全策略,替代了传统Linux所使用的有局限性的标准访问安全策略。SELinux强制进行用户和进程级别的安全认证,因此任何一个进程的安全漏洞都只会影响此进程所占有的资源,而不会影响整个系统。SELinux的工作与虚拟机有些相似,例如如果一个恶意攻击者用root权限嵌入了Apache应用,也仅仅只有Apache进程的资源会被影响。

按此在新窗口浏览图片

然而加强安全策略也会对系统的性能产生影响,用户或者进程对系统资源的每次访问都必须被SELinux控制,对访问权限的检查可能会造成大约10%的系统开销。SELinux对一些对安全方面有很高要求的服务器比如防火墙和web服务器会有很高的价值,但是对一些对性能要求比较高的服务器就不会选择启用SELinux,例如数据库服务器。
通常最容易的方法就是在安装系统的时候选择不安装SELinux。但经常是系统已经按照默认的参数安装好了,忽略了SELinux对系统性能的影响。在系统安装完成后,可以通过在GRUB boot loader中的运行内核行中加入selinux=0参数来禁用SELinux.。下图是示例,

按此在新窗口浏览图片

如果你决定在Linux服务器上使用SELinux,可以通过调整参数来使它更适合应用环境。在一个运行的系统上,检查是否Linux Security Modules(LSM)缓存允许超过默认的Access Vector Cache(AVC)。检查/selinux/avc/hash_stats中最长chain的长度,任何超过10个signals的都可能是存在的瓶颈。
如果系统面临一个Access Vector Cache的瓶颈(例如,一个很大量的防火墙负载),尝试修改/selinux/avc/cache_threshold的值,稍微来加大这个值来重新检查hash状态。

3.7 编译内核

创建和编译自定义的内核对系统性能的影响通常比我们想象的小的多,现代的Linux发行版本的内核通常都是模块化的,加载的内核可能只使用其中的一部分。重新编译内核可以减少内核的大小和内核的系统开销,修改源码中的某些参数也可能对系统的性能产生影响。然而使用自己编译的非标准内核是不在Red Hat Enterprise Linux支持范围内的,很多ISV的应用和IBM硬件对Red Hat Enterprise Linux的支持对非标准内核也是无效的。这里我们要说的是,通过自定义内核可以获得一些性能上的提升,但是你同时需要面对在非支持内核下运行企业级应用说带来的风险。当然这些都是针对一些商业应用来说的,如果你感兴趣的是一个科学实验性质的应用比如高性能运算,那么选择自定义内核也是选择之一。
另外不要试图使用一些特殊的编译器来进行编译内核,比如-C09。因为Linux内核的源码已经手工调整为适于GNU C编译器。用特殊的编译器可能会降低内核运行的效率并且导致一些错误的代码。注意除非你真的清楚你在做什么,否则对内核参数的不当修改反而可能导致系统性能的下降。

3.8 改变内核参数
虽然对大多数用户我们不建议更改和重新编译内核源代码,但是Linux内核提供了另一种方法来调整内核参数。Proc文件系统提供了一个运行的内核的接口,可以被用来检测和修改内核参数。
如果要查看目前的内核的参数,可以在/proc/sys目录下用cat命令选择相应的文件。下面的例子里我们查看系统目前的内存overcommit strategy参数。输出0代表在应用分配到内存之前系统一直检测可用内存信息,我们可以通过echo命令来改变默认的值,值1在例子中的含义是内核在分配内存之前不进行检查确认内存分配情况。

例子中用cat和echo改变内核参数是快速和有效的,可以用在任何有proc文件系统的系统中,但这种方法有下面两个不足
·echo命令不能执行参数的一致性检查。
·所有对内核的改变在系统重新启动后都会失去。
Sysctl命令可以帮助系统管理员克服上述的问题,
另外,Red Hat Enterprise Linux 3和4提供了一个图形化的工具来修改sysctl参数,执行下面的命令启动此工具
/usr/bin/redhat-config-proc

注:默认情况下内核已经加载了不需要重新启动系统生效sysctl修改结果的模块,然而如果你在安装系统时去掉了对此模块的支持,那么在使用sysctl修改后就不得不重新启动系统来使所做的修改生效。

3.8.1 内核参数对应目录
控制内核运行的参数存储在/proc目录下,可以简单通过查看/proc目录树下的文件来查看关于内核、处理器、内存、网络和其他部分的内核参数的配置情况。系统下运行的每个进程在proc下都有一个对应的以PID命名的目录。下表列出了一些目录存储的内核信息

文件/目录 信息
/proc/sys/abi/* 用于提供对外部二进制的支持,不是传统的Linux,比如SCO UnixWare 7、SCO OpenServer和SUN Solaris 2。默认情况下是安装的,也可以在安装过程中移除。
/proc/sys/fs/* 用于增加操作系统支持的文件系统和控制磁盘配额。
/proc/sys/kernel/* 为了调优目的,你可以启用热添加、操作共享内存、指定PID文件最大数量和syslog中的debug级别。
/proc/sys/net/* 调优网络,IPV4和IPV6。
/proc/sys/vm/* 管理缓存和缓冲区。

3.8.2 使用sysctl命令
sysctl命令使用/proc/sys目录树下的文件名做为参数,例如,改变内核参数shmmax的值,可以通过对/proc/sys/kernel/shmmax文件使用cat命令显示当前值并且使用echo命令进行修改。
#cat /proc/sys/kernel/shmmax
33554432
#echo 33554430 > /proc/sys/kernel/shmmax
#cat /proc/sys/kernel/shmmax
33554430

然而使用上述命令容易出现错误,所以我们建议使用sysctl命令因为sysctl命令在更改之前会进行一致性的检查,示例如下
#sysctl kernel.shmmax
kernel.shmmax = 33554432
#sysctl -w kernel.shmmax=33554430
kernel.shmmax = 33554430
#sysctl kernel.shmmax
kernel.shmmax = 33554430

这个改变必须在一次重新启动后才会生效,如果你想长期改变参数,可以通过修改/etc/sysctl.conf文件加入附加的行来实现
kernel.shmmax = 33554439

在下一次重新启动后,改变的参数文件将被读取,如果你不想重新启动系统可以通过执行下面命令来使改变生效
#sysctl -p
3.9 内核参数
Linux 2.4和2.6内核包括了一些可以优化系统性能的内核参数,下表列出了一些与性能相关的内核参数

参数 描述和例子
net.ipv4.inet_peer_gc_maxtime 在较低的内存压力下garbage collector(gc)忽略存储内存池的频率,默认值是120
sysctl -w net.ipv4.inet_peer_gc_maxtime=240
net.ipv4.inet_peer_gc_mintime 设置garbage collector可以清除内存的最小时间,如果你的服务器负载比较重,可以尝试增加这个值,默认值是10
sysctl -w net.ipv4.inet_peer_gc_mintime=80
net.ipv4.inet_peer_maxttl Inet入口的最大存活时间,在这个时间之后新入口将过期,默认值是600
sysctl -w net.ipv4.inet_peer_maxttl=500
net.ipv4.inet_peer_minttl Inet入口的最小存活时间,这个时间必须比net.ipv4.inet_peer_threshold参数小,默认值是120
sysctl -w net.ipv4.inet_peer_minttl=80
net.ipv4.inet_peer_threshold 设定inet的存储容量,当这个限制达到后,入口将被丢掉,使用net.ipv4.inet_peer_gc_mintime限制超时限制,默认值是65644
sysctl -w net.ipv4.inet_peer_threshold=65644
vm.hugetlb_pool 通常在使用Oracle或者DB2等数据库时会用到这个值,默认值是0
sysctl -w vm.hugetlb_pool=4608
vm.inactive_clean_percent 指定应该被清除的非活动内存的百分比,默认值是5%
sysctl -w vm.inactive_clean_percent=30
vm.pagecache 指定多少内存应该被用为页面缓存,这个参数对Oracle和DB2等数据库来说是很重要的,默认值是1 15 100。
参数的三个值的含义:
·做为页面缓存的最小内存百分比,默认是1%
·缓存的初始化数量,默认是15%
·做为页面缓存的最大内存百分比,默认是100%
sysctl -w vm.pagecache=1 50 100

下表是一些不常使用的性能相关的内核参数

参数 描述和例子
kernel.panic_on_oops 启用内核对crash进程的检测和处理,kernel.panic参数必须设为1。该参数默认值为1(启用)
sysctl -w kernel.panic_on_oops=0
kernel.pid_max 可以分配的最大的PID,默认值是32768
sysctl -w kernel.pid_max=65536
net.ipv4.tcp_tw_recycle 主要的tcp连接状态有ESTABLISHED,TIME_WAIT和CLOSED,这个参数可以快速的再生TIME_WAIT连接,默认是0(禁用)
sysctl -w net.ipv4.tcp_tw_recycle=0
vm.overcommit_ratio 允许过载使用的内存百分比,默认是50%。
sysctl -w vm.overcommit_ratio=17

3.10 调优处理器子系统
在一个hand-held设备或者一个科学运算群集环境中,处理器子系统是性能优劣的关键。在过去的十年中莫尔定律使处理器子系统比其他子系统或者了更快的发展,所以现在很少有性能瓶颈出现在处理器子系统上,除非特殊情况下处理器的数量是系统唯一的性能目标。我们经常看到一些intel架构的服务器的CPU利用率一直低于10%,这里我们要说的是了解处理器级别的性能瓶颈和了解可以改变CPU性能的调优参数是十分重要的。
在高端Xeon服务器上,我们可以选择是否启用超线程技术(Hyper-Threading)。超线程意味着每个物理CPU在操作系统下将被认成两个CPU,这个技术是基于并行多线程技术(symmetric multithreading,SMT)的完全被Linux内核所支持。使用SMT技术可以在一个CPU上同时执行两个进程或者线程(也被称为线程级别的并行)。如果操作系统和应用软件都支持并行操作,那么在不增加CPU时钟频率的情况下也可以提高系统的性能。
例如在一个启用了超线程的4路服务器上,使用像top这样的监测工具可以看到8个CPU

关于超线程注意以下几点
·启用超线程需要SMP内核支持
·安装在服务器上的CPU越多,超线程对性能带来的提高就越少。
-两个物理CPU:性能提高15-25%
-四个物理CPU:性能提高1-13%
-八个物理CPU:性能提高0-5%
关于超线程的更多信息可以在下面链接查询
http://www.intel.com/business/bss/products/hyperthreading/server/
EM64T是基于Intel IA-32架构的CPU64bit扩展技术,这意味着CPU可以扩展寻址更多的内存空间并且可以同时支持64bit应用和现存的32bit应用。关于EM64T的更详细的信息可以查看下面链接
http://www.intel.com/technology/64bitextensions/

3.10.1 正确的选择内核
Red Hat Enterprise Linux AS包括几个内核版本,为了性能方面的考虑,请确认为系统选择了最合适的内核

内核类型 描述
SMP 内核支持SMP和超线程
Hugemem 支持超过12GB的内存,包括支持NUMA
Standard 单处理器机器

3.10.2 中断处理
CPU处理的优先级最高的任务之一就是中断。中断可以被一个子系统发起,例如一个网卡。硬中断使CPU停止目前的工作并且执行一个context switch,这个操作令CPU必须将缓存清空来执行新的任务(我们可以认为CPU的缓存是一个工作区,当新任务需要被执行时必须清空缓存)。下面两个原则会让中断处理更有效,
·绑定中断到CPU
系统管理员可以将中断和一个或者一组CPU进行绑定(当然这个操作对于一个单CPU系统是没有作用的)。为了改变IRQ的关联,需要进入/proc/irq/%{相应中断号}目录中修改smp_affinity文件的内容,例如讲IRQ19与第三个CPU进行关联,可以使用下面命令服务

·使用物理CPU来处理中断
在SMT系统中,例如支持超线程的Inter Xeon CPU,建议绑定中断到物理CPU从而避免中断使用虚拟CPU。在一个开启超线程功能的两路系统中,物理CPU通常被分配较低的CPU编号,CPU ID 0和2更可能是物理CPU,而CPU ID 1和3通常是超线程技术的虚拟CPU。如果你不使用smp_affinity标识,你可能要担心中断处理会被分配给虚拟CPU。

3.10.3 NUMA系统
非一致性内存访问(NUMA)系统已经获得了越来越大的市场份额,虽然现在的Linux发行版本的内核可以更好的适应NUMA系统,但是应用程序并不都适用与NUMA系统。一个非NUMA系统可能导致性能的降低。在numactl安装包中的新的numastat程序可以帮助你检查进程在NUMA架构下的运行情况。为了帮助定位瓶颈,numastat工具提供了统计信息存储在/sys/devices/system/node/%节点数/numastat中。

3.11 调优内存子系统
调优内存子系统是一个艰难的工作,它要求持续的监控系统的性能并且确保对参数的调整不会对其他子系统产生消极影响。如果你选择修改虚拟内存参数(在/proc/sys/vm中),我们建议你每次只改变一个参数然后检测调优效果如何。大多数Linux系统下的应用都不直接将数据写入磁盘,而是写入由虚拟内存管理器维护的文件系统缓存中,并且最终会刷新数据。当使用IBM ServeRAID控制器或者IBM TotalStorage磁盘系统时,你应该尝试减少刷新的次数,有效的增加每个刷新的I/O流量。高性能的磁盘控制器可以有效的处理更大的I/O流量。
3.11.1 配置bdflush
调优虚拟内存子系统可以帮助改善整个文件系统的性能。内核进程bdflush是负责处理缓冲区里的dirty数据。再/proc系统中改变参数将立刻生效但是再下一次重启后将被恢复。为了长期有效的改变内核参数可以通过使用echo或者sysctl命令来修改/etc/rc.d/local中的文件来实现。
配置Linux内核如何刷新缓冲区中的dirty数据可以使刷新算法可以适用不同的磁盘子系统。磁盘缓冲区是用来缓存要存储在硬盘上的数据,相比内存访问速度比较慢。因此如果服务器使用这类存储会对洗头的性能产生影响。通过修改/proc/sys/vm/bdflush参数可以更改磁盘缓冲区刷新频率,可以避免磁盘冲突问题。编辑bdflush参数可以使用echo命令或者sysctl命令,下面主要介绍使用sysctl的方法,sysctl命令示例,

在Linux 2.4内核中/proc/sys/vm/bdflush中的九个参数含义如下
nfract:dirty缓冲在缓冲区中的最大百分比。超过这个值将bdflush进程刷新硬盘。当可用内存比较少的情况下,将引发大量的磁盘I/O。为了均衡磁盘I/O,可以保持一个比较低的值。
Ndirty:bdflush进程一次写入磁盘的最大dirty缓冲块数量。这个值比较大将导致I/O急剧增加,如果这个比较小,bdflush进程执行不够从而可能导致内存的瓶颈。
Dummy2 :未使用
Dummy3:未使用
Interval:kupdate工作和刷新的最小频率,默认值是5秒。最小值是0秒最大值是600秒。
Age_buffer:缓冲数据写到磁盘之前操作系统等待的最大时间。默认值是30秒,最小值是1秒最大值是6000秒。
Nfract_sync:dirty缓存激活bdflush进程同步的百分比。默认值是60%。
Nfract_stop:dirty缓存停止bdflush进程的百分比。默认值是20%。
Dummy5:未使用

3.11.2 配置kswapd
配置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

3.11.3 设定内核的交换动作
在Linux 2.6内核的虚拟内存管理器中为管理员提供了简单的调整交换空间的方法。调整交换分区的参数存储在/proc/sys/vm/swappiness中,可以通过这个参数来定义如何将内存页面交换到磁盘上。在1.3章节中我们讨论了Linux虚拟内存管理器和交换空间的使用,描述了Linux即使在依然有足够可用内存的情况下依然会移动不被接受的内存页面到swap空间。通过改变/proc/sys/vm/swappiness中的百分比你可以根据系统配置的需要控制这个操作。如果不想频繁的进行页面交换可以设置较低的值。但是对一些保持sleep状态很长时间的进程来说,页面交换将带了性能的提升。改变这个参数可以使用echo或者sysctl命令,示例如下:

3.11.4 HugeTLBfs
这个内存管理特性对需要使用大量虚拟地址空间的应用是非常有价值的,尤其是对数据库应用。
CPU的Translation Lookaside Buffer (TLB)是一个小的缓存用来存储虚拟到物理地址的映射信息。通过使用TLB,一次交换可以在不经过内存页面表入口的情况下完成。然而为了保持交换尽可能快,TLB容量通常都十分小,大内存应用需要更多的TLB空间。HugeTLBfs特性允许应用使用比平时更大的内存空间,以便单独的TLB可以映射更大的地址空间。一个HugeTLBfs登陆的大小是可变的。例如,在Itanium@2系统中,一个大页面可能是普通系统的1000倍。这个特性启用了TLB可以映射1000倍的虚拟地址空间在没有TLB缓存失败的情况下。简单的说,这个特性为应用程序提供了一个文件系统接口。

3.12 调优文件系统
最终所有数据都是要存储在硬盘上的,硬盘访问的速度通常都是毫秒级别的,这个速度与内存和PCI设备纳秒和微秒级别的访问速度要慢上千倍。Linux文件系统是在硬盘上进行数据存储和管理的方法。
Linux有多种可用的文件系统,它们的性能和可扩展性各有特点。除了存储和管理硬盘上的数据,文件系统也负责保持数据的一致性。新的Linux发行版本包括日志文件系统做为默认安装的一部分。日志可以在系统宕机时保持数据的一致性,所有对文件系统元数据的修改都被维护在一个单独的日志中,并且可以在系统宕机后恢复数据的一致状态。日志也可以加快恢复时间,因为在系统重新启动不需要进行文件系统检查的操作。另一方面,你也需要平和性能和数据完整性之间的关系,但使用在数据中心或者企业级应用中的Linux服务器对高可用性是有着严格的要求的。在这部分我们介绍Red Hat Enterprise Linux AS默认的和其他文件系统的一些简单的调优方法。

3.12.1 安装Linux系统前的硬件准备
目前的Linux发行版本都有文档来要求安装系统的硬件配置的最小要求,比如最小的CPU频率和内存大小,也会提供完全安装系统所需的最小的磁盘空间。然而这些文档都没有提供如何初始化磁盘子系统,因为Linux服务器可以适应各种不同的应用环境,所以我们需要面对的第一个问题是:需要安装的Linux服务器的应用环境是什么?
服务器的磁盘子系统是系统性能的主要组成部分,判断I/O子系统是否会对系统性能产生直接影响首先需要理解服务器所运行的应用。下面例子帮助我们理解I/O子系统和应用的关系,
磁盘I/O对性能影响很大的服务器例子:
·一个文件和打印服务器必须快速的在用户和磁盘子系统间移动数据,因为文件服务器的目
的就是分发文件到各个客户端,服务器对磁盘上的数据有大量的访问操作。
·一个数据库服务器最终目的是查找和处理存储在磁盘上的数据。即使有足够的内存,大多数数据库服务器还是需要执行大量的磁盘I/O操作来进行内存和硬盘之间的数据交换。
磁盘I/O对性能影响很小的服务器例子:
·一个邮件服务器的功能是对电子邮件进行存储和发送,通常会产生大量的网络通信负载,在这样的服务器里网络是更重要的参数。
·一个web服务器的功能是提供对web页面的访问支持(包括静态的、动态的或者两者都有),对这样的服务器来讲,网络和内存子系统是更好的调优选择。

磁盘技术的选择
在安装部署服务器之前需要了解应用的规模,目前不同磁盘子系统技术所适合的应用环境也是不相同的,下表列出了在ibm xSeries服务器上所用到的磁盘技术和相关特性。

技术 价格 功能 限制和容量
EIDE 低价格 直连存储;例如低端服务器的本地硬盘(x305) 是用来连接内部存储的增强型IDE,每个EIDE控制器支持两个硬盘
SCSI 低价格 直连存储:中端或者高端服务器的本地存储(x346,x365) 虽然scsi标准有超过10年的发展历史,但目前高端服务器的I/O需求已经超过了scsi的能力,scsi技术的限制包括线缆长度,总线上连接服务器数量,传输速度,总线上可访问的设备数量等,这些都影响了集群系统的可扩展性。
Serial ATA(SATA) 低价格 中端数据存储应用 从2002年发展起来的SATA新标准在硬盘/主板接口上继承了EIDE的技术,是点对点的传输协议,为每个设备提供了一个单独的通道。在顺序磁盘访问应用上SATA可以与SCSI相比,在随机磁盘访问上稍逊于SCSI技术,SATA技术也支持RAID功能。
iSCSI 适中的价格 中端存储,例如文件或者web服务器 iSCSI技术主要适合中端存储和远程启动需要,主要的优点是相对较低的成本和无盘服务器,也提供了基于TCP/IP/以太网的可扩展性和可靠性。同时TCP/IP的高延迟也对性能产生了一些影响。
Fibre Channel 高价格 企业级存储,例如数据库 提供了低延迟和高吞吐量能力并且克服了scsi技术的一些限制,通过光纤链路线缆距离可以扩展到10km,2Gbps传输速度,提供冗余链路改善可靠性,理论上可以连接1600万个设备,在loop拓扑中,127个存储设备或者服务器可以共享同一个光纤通道连接,允许部署更大规模的集群。

关于ibm存储的更多信息请访问下面链接
http://www.ibm.com/storage

磁盘的数量
磁盘的数量会对系统的性能产生重要的影响,因为每个硬盘都会对整个系统的吞吐量做出贡献。在配置服务器硬盘数量的时候,磁盘的容量要求通常被作为唯一的参考。吞吐量要求经常没有被很好的考虑甚至被完全忽略。一个性能良好的磁盘子系统的关键是最优化可以提供I/O请求的读写操作。
通过RAID(redundant array of independent disks)技术,可以将I/O请求分成条带化处理,在Linux环境下部署RAID有两种选择:软件RAID和硬件RAID。你可以通过Linux发行版本自带的软件RAID来配置,如果需要,也能升级使用更有效率的硬件RAID解决方案。在Linux 2.4内核中,软件阵列的实现是通过md设备驱动来实现的,这个驱动的实现是不依靠设备类型的,因此可以灵活的部署多种磁盘子系统,比如EIDE或者SCSI磁盘都可以配置软件阵列。软件RAID支持的阵列级别有RAID-0(条带化),RAID-1(镜像)和RAID5(带校验位的条带化),可以在初始化安装的过程中或者使用mdadm工具进行配置。
如果必须部署一个硬件RAID阵列,你的系统需要一个RAID控制器,在这种情况下磁带子系统包括物理磁盘和控制器,IBM提供了完整的磁盘控制器产品线。
注:通常增加硬盘是最有效的改变服务器性能的方法之一。
3.12.2 其他日志文件系统
下面是Linux可用的文件系统,但在Red Hat Enterprise Linux安装过程中并不可用。
·ReiserFS
ReiserFS是一个快速日志文件系统,特点是可以提供优化的磁盘利用率和快速的crash恢复,是SUSE LINUX默认的文件系统。
·JFS
JFS是一个全64bit的文件系统可以支持更大的文件和分区。JFS是由IBM为AIX系统开发的,现在可用于GPL license。在HPC和数据库应用中JFS是一个理想的文件系统,因为可以提供更大的分区和文件容量。
·XFS
XFS是一个SGI开发的高性能的日志文件系统。特性和使用与IBM的JFS很相似。

3.12.3 在2.4内核中调整elevator算法
磁盘I/O elevator算法是Linux 2.4内核的一个特性,通过调整elevator算法的读写值可以增加延迟时间使I/O请求在队列中等待更多的时间,从而使得I/O调度器可以有更多的时间来完成I/O操作,可以提高系统的吞吐量。

如果你的Linux服务器应用于大量的磁盘I/O操作的环境,在吞吐量和延迟方面找到一个合理的平衡点是很重要的。Linux文件系统使用块设备,因此改变块读写的频率可以改善未经系统的性能。一个方针是,较小的缓存和平衡的高延迟读写对I/O操作比较重的服务器是有益的。
像其他系统的调优参数一样,对elevator算法的调整是一个重复的过程。你需要对现有磁盘性能做出评估,然后做出改变,最后再测试出改变参数所产生的影响。下面是使用/sbin/elvtune命令去查看当前参数值随后做出改变的例子:
Red Hat建议您将读延迟(-r)调整为写延迟(-w)的一半。如果对算法进行的调整,需要把/sbin/elvtune调用加到/etc/rc.d/rc.local文件中以确定在下次系统重新启动后改变依然生效。
下面是查看默认值并且做出改变的示例

3.12.4在Linux 2.6内核中选择正确的I/O elevator算法
对大多数应用来说,complete fair queuing(CFQ) elevator算法是一个合适的选择,它已经对一个典型的多用户、多处理器环境做了相应的优化。但是,一些特定的环境下选择其他的I/O elevator可能会获得更好的效果。
·智能的磁盘子系统
benchmark测试结果显示NOOP elevator在高端服务器环境下可以给性能带来有趣的变化,当使用IBM ServeRAID或者TotalStorage DS系列磁盘子系统的情况下,缺少命令能力的NOOP elevator显示出了它的优势,因为智能磁盘子系统例如IBM ServeRAID和TotalStrrage DS系统磁盘子系统用自己的I/O命令能力弥补了NOOP elevator的缺点。企业级的磁盘子系统通常包括多个SCSI或者光纤通道磁盘,每个磁盘都有独立的磁盘头和数据条带。对操作系统来说正确的处理如此复杂的I/O特性子系统是很困难的,因此你会观察到在获得性能相同的情况下使用NOOP I/O elevator会带来更少的系统资源开销。
·数据库系统
因为大多数数据库应用需要进行大量的寻址操作,所以在选择deadline elevator的情况下会获得更好的性能体现。
·虚拟机
虚拟机系统,无论是VMware或者zSeries上的VM都只在虚拟层和下面的硬件层进行通信,因此虚拟机不知道它被指派的磁盘设备是一个单独的SCSI磁盘设备或者是多个光纤磁盘组成的磁盘阵列设备。虚拟层只关注必需的I/O记录和与物理设备之间的通信。因此,我们建议为虚拟机选择使用NOOP elevator以确保更少的系统资源开销。
·单独ATA或者SATA磁带子系统
如果你选择使用单独ATA或者SATA的磁盘子系统,考虑使用anticipatory I/O elevator会获得比较好的性能。

3.12.5 访问时间更新
Linux文件系统当文件被创建、更新和访问的情况下都会进行记录,默认情况操作包括更新最近读取时间属性(last-time-read)当文件被读写的时候,因为写操作是一个“昂贵”的操作,排除不必要的I/O操作可以提升整个系统的性能。Mount文件系统的时候加入noatime和nodirtime选项可以避免inode时间访问记录被更新,如果文件和目录的更新时间对你的应用来说并不关键,比如一个web服务器环境,系统管理员应该选择mount文件系统附上noatime和nodirtime选项来改善性能,可以将改变写入/etc/fstab来实现长期的改变,下面是一个更新/etc/fstab的示例:

tips:通常为/var建立独立的分区并且mount附上noatime选项是一个好的建议。

3.12.6 增加操作文件数量
系统有一个重要的参数就是允许操作文件的数量,标准的Linux配置的数量可能过低从而影响性能。查看/proc/sys/file-nr对比全部指派文件数量和最大文件操作数量(第一个或最后一个值)。可以通过改变/proc/sys/fs/file-max来改变这个参数的值。

3.12.7 选择ext3文件系统的目录模式
ext3文件系统有三个可选的日志模式,可以通过在mount命令的附加data项来进行改变。
·data=journal
journal选项通过将文件数据和元数据都设置为日志模式,提供了最高级别的数据一致性保障。同时也带来了较高的性能开销。
·data=ordered(default)
顺序方式写入,文件数据先写入然后是元数据。
·data=writeback
提供最快的访问速度,但是牺牲了数据的一致性。元数据仍然被记录到日志,从而确保元数据的完整。文件数据会在系统崩溃之后恢复到原先的状态。

三种方法可以改变日志模式:
·使用mount 命令:
mount -o data=writeback /dev/sdb1 /mnt/mountpoint 这里/dev/sdb1 是挂载的文件系统

·在/etc/fstab文件的选项中:
/dev/sdb1 /testfs ext3 defaults,journal=writeback 0 0

·更改root分区的data=ordered,更改上述/etc/fstab 文件,执行mkinitrd命令来扫描/etc/fstab 文件并创建新的印象文件。升级grub或lilo指向新的印象文件。更多有关Ext3的介绍,请参考下面链接:
http://www.redhat.com/support/wpapers/redhat/ext3/

3.12.8 SCSI设备的Tagged command queuing(TCQ)
SCSI磁盘的Tagged command queuing (TCQ),产生于SCSI-2标准,是一种将到达SCSI驱动器的指令序列进行打标签和重新排序的方法。对于繁重、随机访问的I/O负荷,这种方法通过对I/O请求的重排序,使驱动器磁头位置最优化,改进I/O性能。
一些IBM xSeries服务器集成了Adaptec AIC-7xxx SCSI控制器。执行命令:cat /proc/scsi/aic7xxx/0来检查当前TCQ的设置,可以在/usr/src/linux-2.4/drivers/scsi/README.aic7xxx中查看scsi设备设定的细节。
不必重新编译内核。可以在/etc/modules.conf中添加如下两行内容,指定参数aic7xxx=global_tag_depth:xx,
注:如果在/etc/modules.conf里更改了initrd中的模块,需要使用mkinitrd命令重新生成initrd image。

3.12.9 Block sizes大小
数据块大小是对磁盘读写的最小单位,直接影响服务器性能。如果服务器处理的多为小文件,那么较小的数据块尺寸会更有效。反之,如果服务器处理的多为大文件,大的数据尺寸块会提高系统性能。如果要改变数据块的大小必须重新格式化磁盘。做了RAID的磁盘,stripe size 就是数据块的容量(光纤盘采用segment)。根据应用的不同合理选择正确的块大小,通常的原则是顺序读写应使用大的块容量,象数据库这样的随机读写操作使用等同于记录大小的块容量更合适。
Red Hat Enterprise Linux允许的block sizes有1K,2K和4K。

3.12.10 分区设置的原则
一个分区是磁盘上一组连续的数据块,就好像是独立的磁盘一样。Red Hat Enterprise Linux 3默认只安装三个简单的分区,在Red Hat Enterprise Linux 4中通过使用逻辑卷提供了更灵活的分区划分。
关于Linux磁盘分区的优化存在许多的争论。如果只有一个根分区的话,对于将来要增加新分区时会比较麻烦。而分区太多对文件系统的管理又会变的复杂。Linux安装过程中,允许创建多个分区。
创建多个磁盘分区的好处:
·文件系统出色的颗粒度属性使安全性得到改进。例如,允许所有用户和进程容易地访问/var和/tmp分区,并防止恶意访问。通过将这些分区分布到不同的磁盘,可在不影响系统正常运行的情况下对一些分区进行重建和恢复。
·某块磁盘故障导致的数据丢失不影响其他磁盘的数据,改进数据完整性。
·全新的安装或升级不影响其它分区。
·更有效的备份过程

目前还没有任何评论.