linux概念之性能调优

时间:2021-07-19 04:12:08

目前,对系统进行性能调试的工具有很多,
这些可以两大类:一类是标准的分析工具,即所有的UNIX都会带的分析工具;
另一类是不同厂商的UNIX所特有的性能分析工具,比如HP-UX就有自己的增值性能分析工具。

标准的分析工具,即所有的UNIX都会带的分析工具:
sar
iostat
vmstat
time
ps
bdf
top
ipcs
uptime

HP-UX自己的增值性能分析工具:
glance/gpm
puma
xps

按性能分析工具的用途来说,它可以分为:
CPU的使用情况:sar,time,top,ps,puma,xps
内存的使用情况:vmstat,ipcs
文件系统状态:dbf,iostat,sar,swapinfo,nfsstat
I/O子系统状态:iostat
网络性能:netstat

按分析时间点来分,性能分析工具可以分为:
日志型分析工具,如puma,xps,它们将在对系统在某一段时间的运行情况进行取样,然后得出某此结果。这种分析工具非常适合于 针对那些时断时续发生的问题进行分析,因为通过取样,可以得出结论;
实时型分析工具,如glance,它们又称“快照型分析工具”,即它们将实时取出系统运行环境的数据,这种分析工具非常适合于 那些在分析工具正在运行时发生的问题,或一直发生的问题。

1.性能分析的目的

1)找出系统性能瓶颈(包括硬件瓶颈和软件瓶颈);
2)提供性能优化的方案(升级硬件?改进系统系统结构?);
3)达到合理的硬件和软件配置;
4)使系统资源使用达到最大的平衡。(一般情况下系统良好运行的时候恰恰各项资源达到了一个平衡体,任何一项资源的过渡使用都会造成平衡体系破坏,从而造成系统负载极高或者响应迟缓。比如CPU过渡使用会造成大量进程等待CPU资源,系统响应变慢,等待会造成进程数增加,进程增加又会造成内存使用增加,内存耗尽又会造成虚拟内存使用,使用虚拟内存又会造成磁盘IO增加和CPU开销增加)
2.影响性能的因素
1)CPU(cpu的速度与性能很大一部分决定了系统整体的性能,是否使用SMP)
2)内存(物理内存不够时会使用交换内存,使用swap会带来磁盘I0和cpu的开销)
3)硬盘(存储系统)
a.Raid技术使用(RAID0, RAID1, RAID5, RAID0+1)
b.小文件读写瓶颈是磁盘的寻址(tps),大文件读写的性能瓶颈是带宽
c.Linux可以利用空闲内存作文件系统访问的cache,因此系统内存越大存储系统的性能也越好
4)网络带宽。
3.性能分析的步骤
1)对资源的使用状况进行长期的监控和数据采集(nagios、cacti)
2)使用常见的性能分析工具(vmstat、top、free、iostat等)
3)经验积累
a.应用程序设计的缺陷和数据库查询的滥用最有可能导致性能问题
b.性能瓶颈可能是因为程序差/内存不足/磁盘瓶颈,但最终表现出的结果就是CPU耗尽,系统负载极高,响应迟缓,甚至暂时失去响应
c.物理内存不够时会使用交换内存,使用swap会带来磁盘I0和cpu的开销
d.可能造成cpu瓶颈的问题:频繁执Perl,php,java程序生成动态web;数据库查询大量的where子句、order by/group by排序……
e.可能造成内存瓶颈问题:高并发用户访问、系统进程多,java内存泄露……
f.可能造成磁盘IO瓶颈问题:生成cache文件,数据库频繁更新,或者查询大表……

按照传统,Linux不同的发行版本和不同的内核对各项参数及设置均做了改动,从而使得系统能够获得更好的性能。
Red Hat Enterprise Linux AS和SUSE LINUX Enterprise Server系统下,用以下几种技巧进行性能的优化
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。
提示:关闭xfs daemon将导致不能启动X,因此只有在不需要启动GUI图形的时候才可以关闭xfs daemon。使用startx命令前,开启xfs daemon,恢复正常启动X。
如要看到全部的daemons,使用如下命令:
/sbin/chkconfig –list

2 关闭GUI
只要有可能,就不要在Linux server上启动GUI图形,通常在Linux server上,没有必要启动GUI。所有的管理任务均可在命令行方式下完成、或者通过重定向X和Web浏览器界面。
有几个可用的基于Web的工具(例 如webmin, Linuxconf, 和SWAT).
需要的时候启动GUI,用完马上关闭GUI。多数情况,服务器运行在runlevel 3,即在机器启动的时候不进入GUI。命令行方式下,执行startx 来启动Xserver.
缺省情况下,保存了6个控制台:F1……F6。为节省内存,可以减少为3个。使用mingetty ttyx命令来实现
提示:即便是已经关闭了GUI,依然可以远程连接并启动GUI,可以使用ssh -x

3 改变内核参数
Linux内核是操作系统的核心,对所有的Linux发行版本是通用的。内核参数可以改变,在命令行下执行sysctl 命令。
提示:缺省情况下,LINUX内核包括不必重启就可以使用sysctl命令的必要的模块。尽管如此,如果你在安装系统的时候选择移除该功能,那么你只有重新启动LINUX,才可以使得改变生效。
Red Hat也提供了图形界面下更改sysctl参数的方式:
/usr/bin/redhat-config-proc
内核参数保存在/proc(特别是/proc/sys),提供了内核、处理器、内存、网络及其他组件的相关参数。每个执行的进程都有一个以相应PID命名的目录。

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颗处理器。
提示:对于Hyper-Threading:
_ 基于SMP内核的LINUX才可以支持Hyper-Threading
_ 安装的CPU数量越多,从Hyper-Threading获得的性能上的提高就越少。可获得的性能提高大约为:
2颗物理CPU: 15-25%
4颗物理CPU: 1-13%
8颗物理CPU: 0-5%
EM64T 是Intel IA-32处理器的64-bit扩展。意思是,处理器能够支持更多的内存并支持64-bit应用同时完全兼容现存的32-bit应用。
Red Hat Enterprise Linux 3 Update 2 和 SUSE LINUX Enterprise Server 9支持这种新的处理器。
Red Hat Enterprise Linux AS和SUSE LINUX Enterprise Server都包括有若干个内核包,选择合适的内核对性能非常重要。

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

7 文件子系统的调优
总体而言,所有数据都要从磁盘获取并都要保存到磁盘。磁盘访问速度通常以毫秒来计算,比其它组件要慢上千倍(如内存、PCI操作是以纳秒或者微秒来计算的)。
Linux文件系统定义了数据存储和访问的方式。
Linux可用的文件系统有多种,它们的性能和可扩展性各不相同。除了保存和管理磁盘数据,文件系统还负责保证数据的完整性。新版的Linux缺省安装已经包括日志文件系统(journaling file systems),
日志文件系统可防止系统崩溃时导致的数据不一致问题。对文件系统元数据(metadata)的更改都被保存在一份单独的日志里,当发生系统崩溃时可以根据日志正确地恢复数据。
除此之外,日志使系统重新启动时不必进行文件系统的检查,从而缩短了恢复时间。同其他方面的计算一样,性能和完整性是相互平衡的。然而,因Linux服务器多用于企业环境及数据中心,
因此要求具备更高的可用性。这里,我们将介绍Red Hat Enterprise Linux AS和SUSE LINUX Enterprise Server的文件系统及其性能调优。

文件子系统的调优
ulimit -a 用来显示当前的各种用户进程限制。
Linux对于每个用户,系统限制其最大进程数。
暂时地,适用于通过 ulimit 命令登录 shell 会话期间。
永久地,通过将一个相应的 ulimit 语句添加到由登录 shell 读取的文件中,即特定于 shell 的用户资源文件,

解除 Linux 系统的最大进程数和最大文件打开数限制:
vi /etc/security/limits.conf
# 添加如下的行
* soft noproc 11000
* hard noproc 11000
* soft nofile 4100
* hard nofile 4100
修改所有 linux 用户的环境变量文件:
vi /etc/profile

有时候在程序里面需要打开多个文件,进行分析,系统一般默认数量是1024,(用ulimit -a可以看到)对于正常使用是够了,但是对于程序来讲,就太少了。
1./etc/security/limits.conf
2./etc/pam.d/login
3.一般用户的 .bash_profile

磁盘子系统调优
磁盘在 LAMP 架构中扮演着重要的角色。静态文件、模板和代码都来自磁盘,组成数据库的数据表和索引也来自磁盘。对磁盘的许多调优(尤其是对于数据库)集中于避免磁盘访问,
因为磁盘访问的延迟相当高。因此,花一些时间对磁盘硬件进行优化是有意义的。
首先要做的是,确保在文件系统上禁用 atime 日志记录特性。atime 是最近访问文件的时间,每当访问文件时,底层文件系统必须记录这个时间戳。因为
系统管理员很少使用 atime,禁用它可以减少磁盘访问时间。禁用这个特性的方法是,在 /etc/fstab 的第四列中添加 noatime 选项。
/dev/VolGroup00/LogVol00 / ext3 defaults,noatime 1 1
在 /dev/hd 上执行的速度测试
# hdparm -t /dev/hda
不幸的是,对于 Fiber Channel and Small Computer Systems Interface(SCSI)系统,调优依赖于具体的驱动器。

7.1 安装Linux前
硬件方面的考虑
当前Linux的发行版本对CPU、硬盘和内存方面均有明确的安装要求。然而,对于如何设置磁盘子系统的说明远远不够。由于Linux服务器被广泛的应用于各种环境,数据中心的服务器整合,
我们首先要回答的问题就是:“该服务器的功能是什么?”
磁盘子系统可能是整个服务器系统性能的主要方面。了解服务器的功能是判断I/O子系统对性能产生多大影响的关键。
下面几种服务器的磁盘I/O性能是非常重要的:
_ 文件和打印服务器要求在用户和磁盘子系统之间快速地移动数据。因文件服务器的功能是向客户端发送数据,所以要快速读取所有的数据。
_ 数据库服务器的最终目标是从磁盘上的数据仓库里查找和获取数据。即便有足够的内存,多数数据库服务器依然需要大量的磁盘I/O将数据读入内存和更新磁盘数据。
下面几种服务器的磁盘I/O性能不是最重要的:
_ 邮件服务器用于电子邮件的存储和转发,通常产生较大的通信量。对这类服务器来讲,网络性能更为重要。
_ Web服务器用于发布静态和动态的Web页面,网络和内存子系统的性能非常重要。

磁盘技术的选择
除了理解服务器功能,还要了解磁盘容量的部署。
下面是当前几种可选的磁盘技术及其容量、特点:
技术 花费 功能 容量及其限制
EIDE 最低 直连、本地存储 低端服务器,如x305 每控制器最多2块盘
SCSI 低 直连、本地存储 中、高端服务器,如x346、x365 已经使用了10年的标准;对数据线长度、传输带宽和磁盘数量均有限制,单个通道的并发访问的数量也有所限制,限制了群集功能
SATA 低 中端数据存储应用 2002年开始出现,是EIDE技术的延续;点对点协议,每个驱动器都有一个独立的通道,增强扩展能力;连续的磁盘访问性能可与SCSI相比;支持RAID
iSCSI 较低 中端数据存储,如Web/文件服务器 定位于中端存储和远程启动;节省基础架构的开销,提供了TCP/IP/Ethernet的灵活性和可靠性;TCP/IP的高延迟影响性能;目前Red Hat Enterprise Linux还不支持
Fibre Channel 高 高端的企业存储,如数据库服务器 低延迟、高吞吐量,长传输距离可达10公里 2 Gbps传输速率;路径冗余功能提高可靠性;一个光纤环路支持127个设备,共享带宽,实现大规模群集

磁盘数量的选择
磁盘的数量多少会影响到系统性能。对磁盘容量的需求通常是考虑磁盘数量的唯一因素,而忽视了吞吐量的因素。好的性能是依赖于提供I/O读写的磁头数量。
可通过RAID技术来实现,包括软RAID和硬件RAID。许多型号的xSeries服务器提供了硬件RAID支持,Linux 还提供了软RAID功能。2.4 Linux kernel的软RAID是通过md设备驱动实现的,
支持EIDE或SCSI硬盘。支持的RAID级别为RAID-0, RAID-1,和RAID-5,可以在初始安装配置或者用mdadm工具配置。
提示:通常增加硬盘数量是提高磁盘性能的一个最有效方法。

7.2 Ext3: Red Hat的缺省文件系统
从Red Hat 7.2开始,缺省文件系统为Ext3。相对于Ext2,增加了日志。其主要特点为:
_ Availability(可用性):Ext3提供数据的写一致功能。即意外宕机情况下,不需要检查数据的一致性,使系统恢复时间从几小时缩短为几秒钟。
_ Data integrity(数据完整性):通过mount命令定义日志方式:data=journal,所有的数据,包括文件数据和元数据,都被定义为日志型。
_ Speed(速度):通过定义日志方式:data=writeback, 可以选择获得数据完整性还是写速度的优势来满足不同的业务需求。
_ Flexibility(灵活性):从Ext2升级到Ext3非常简单,且不需要重新格式化硬盘。使用命令tune2fs 并编辑文件/etc/fstab,便可完成升级。注意,Ext3可被mount为不带日志属性的ext2文件系统。
另外,许多第三方厂家兼容Ext3 file systems,如PartitionMagic。

7.3 ReiserFS: SUSE LINUX的缺省文件系统
从SUSE LINUX 7.1开始,缺省安装的文件系统即为由Hans Reiser开发的ResierFS。在其设计之初便包括如下性能方面的考虑 From its initial design, key performance aspects have included:
_ 日志文件系统(Journaling)的设计提高了可靠性和恢复速度。
_ 使用平衡树数据结构可以同时存储内容数据和安全元数据,使其获得更快的访问速度。
_ 有效地利用磁盘空间,与其他文件系统不同,ResierFS不依赖于数据块的大小。Efficient use of disk space because, unlike other file systems, this file system does not rely on block sizes.
目前SUSE LINUX Enterprise Server 8的ReiserFS为V3.6,下一代文件系统是Reiser4。Reiser4提供的是不间断的文件系统,通过实现“atomic”文件系统避免系统崩溃,保证完成I/O操作;使用新的访问算法来获取2到5倍的性能提高。
提示: Red Hat Enterprise Linux AS不支持ReiserFS

7.4 通过Linux kernel对文件系统调优
缺省文件系统的设置或许适合大多数应用环境。尽管如此,我们还是提供了如下几个提高磁盘性能的方法:

访问时间更新
linux文件系统当文件被访问,创建,更新的时候会保留纪录。默认的,当文件读写操作的时候,系统会更新last-time-read属性。因为写操作是比较耗费资源的操作,减少不必要的i/o可以整体上提高磁盘性能。
在挂接文件系统的时候,加入noatime参数可以禁止inode节点访问时间的修改。如果文件更新时间对于特定的应用不是很重要的话,比如web服务,就可以把noatime参数加入/etc/fstab文件中
比如:
/dev/sdb1 /mountlocation ext3 defaults,noatime 1 2
推荐利用单独的分区作为挂接点并打开noatime开关

Tuning the elevator algorithm(调整阶梯算法)
磁盘I/O 阶梯算法产生于V2.4 kernel。它是通过控制I/O请求获得服务前在队列中等待时间,来调整块I/O的运算法则。
这是由调整阶梯算法的读写值实现的。通过增加延迟(更大的读、写值),I/O请求在队列中等待更长时间,给I/O scheduler更好地完成I/O操作,改进性能。
对应用于大量磁盘I/O的Linux服务器,要在吞吐量和延迟方面找到一个合理的平衡点。Linux文件系统使用块设备,因此改进块读写的频率可以改进文件系统的性能。
一个准则是,小缓存、平横的长延迟读写有利于大量磁盘I/O的Linux服务器。阶梯算法的调整是一个交互的过程,首先要获得基准性能曲线,
然后改动设置,观察效果。Example 10-1给出了如何用/sbin/elvtune命令显示当前设置以及如何改动读写队列的数值。
提示:Red Hat建议您将读延迟(-r)调整为写延迟(-w)的一半。
做过改动之后,确保/sbin/elvtune call被加到/etc/rc.d/rc.local (Red Hat)或者/etc/init.d/boot.local (SUSE LINUX)中,使设置在系统重新启动后生效。
redhat推荐调整升降算法来让读延迟是写延迟的一半
提示:2.6核心的linux指出elvtune命令已经作废,取而代之的是调整/sys/block结构

选择Ext3文件系统的日志模式
Ext3文件系统可选三种日志模式,使用mount命令来完成:
_ data=journal
文件数据和元数据均设置为日志方式,性能开销比较大
_ data=ordered (缺省设置)
顺序写入,先写文件数据,再写元数据
_ 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/

Tuning ReiserFS (调整ReiserFS)
ReiserFS的优势之一是支持大量的小文件。取代传统Linux文件系统的块结构,ReiserFS使用树型结构,保存小文件的全部内容和大文件的结尾。ReiserFS不使用固定的块大小,
避免出现碎片而浪费磁盘空间。挂载ReiserFS 文件系统时,有一个选项可以改进系统性能,但是会消耗更多的磁盘空间。使用notail来关闭“tail packing”选项

Setting bdflush
通过调整虚拟内存子系统也可以改进文件系统性能。Bdflush内核进程保证dirty buffers (任何当前被修改的只存在于易失性内存的数据)与磁盘一致。修改/proc/sys/vm/bdflush变量,
来改变写入磁盘速率,避免磁盘竞争问题。对/proc下的任何修改即刻生效,但是重新启动后会恢复到原来状态。在/etc/rc.d/rc.local文件中加入echo命令使所做的修改永久生效。
1. 对于2.4 Linux kernels,在/proc/sys/vm/bdflush
包括九个变量:nfract:dirty buffers在buffer cache中的最大百分比。Nfract值越大,写入磁盘的延迟越长。当内存不足时,大量的I/O操作被处理。为使磁盘I/O操作均匀分布,保持较低的值。
2. Ndirty:bdflush process可以一次写入磁盘的最大dirty buffers值。该值过大会导致大量I/O请求,过小会在bdflush daemon执行不够频繁的时候导致内存不足。
3. dummy2 未使用
4. dummy3 未使用
5. interval 唤醒kupdate的最低速率。缺省是5秒,最小0秒,最大600秒。
6. age_buffer操作系统将buffer cache写入磁盘前等待的最长时间。缺省30秒,最小1秒,最大6000秒。
7. nfract_sync 激活bdflush同步的dirty buffers百分比,缺省为60%.
8. nfract_stop 停止bdflush的dirty buffers百分比,却省为20%.
9. dummy5 未使用

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的设置,不必重新编译内核。可以在/etc/modules.conf中添加如下两行内容,指定参数aic7xxx=global_tag_depth:xx

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

分区设置的原则
Linux缺省安装创建三个分区:
_ 一个swap分区(自动设定为2倍内存大小但不超过2 GB)
_ 一个小的boot分区:/boot (例如100 MB)
_ 其它空间给根分区 /
关于Linux磁盘分区的优化存在许多的争论。如果只有一个根分区的话,对于将来要增加新分区时会比较麻烦。而分区太多对文件系统的管理又会变的复杂。Linux安装过程中,允许创建多个分区。
创建多个磁盘分区的好处:
_ 文件系统出色的颗粒度属性使安全性得到改进。例如,允许所有用户和进程容易地访问/var和/tmp分区,并防止恶意访问。通过将这些分区分布到不同的磁盘,可在不影响系统正常运行的情况下对一些分区进行重建和恢复。
_ 某块磁盘故障导致的数据丢失不影响其他磁盘的数据,改进数据完整性。
_ 全新的安装或升级不影响其它分区。
_ 更有效的备份过程
设计分区时要考虑到备份工具,要了解备份工具是以分区为边界或是以更细颗粒度级别,如文件系统为边界。下表列出了要考虑与根分区分开的五个分区,这些分区的划分可以改进性能和灵活性。
要更深层了解Linux文件系统和分区,访问如下关于文件系统层次的网页
http://www.pathname.com/fhs

7.5 交换分区
当物理内存被全部占用,而系统又需要更多的内存时,交换设备发挥作用。这时,系统会将内存中很少使用的数据交换到磁盘的交换分区,释放物理内存。
最初的交换分区在安装系统的过程建立,原则上是两倍的物理内存大小。Linux kernels 2.4 支持每分区24GB的交换分区,32-bit系统理论上支持最大8T分区大小。交换分区存在于独立的磁盘。
对于安装好的系统,增加内存时,需要设置更多的交换空间。两种方法可以实现:
·创建一个新的分区作为交换分区。如果没有空闲空间创建新的分区,可以创建一个交换文件。
·如有选择,最好是创建一个交换分区。
从磁盘I/O到交换分区绕过了文件系统,所有的性能开销都在写文件上,因此使提高了性能。
另外一种改进性能的方法是创建多个交换空间,实现并行读写磁盘。增加了交换分区或交换文件后,/etc/fstab文件包含如Example 10-5所示内容:
通常情况下,Linux首先使用/dev/sda2做为交换分区,然后是/dev/sdb2,依次类推,直到获得足够的交换空间。也就是说,当没有更大空间需求的话,
只有/dev/sda2被使用。将数据分散到更多的交换分区可以改进性能,这是因为所有的读写请求是被并行处理的。如果按照Example 10-6改变文件配置,可以给前三个分区赋予更高的优先级。
交换分区是从最高优先级开始使用的(32767最高,0为最低),给前三个分区赋予相同的优先级使数据被写到三个磁盘中;而不是写满一个再写下一个。三个分区并行使用,以提高性能。
当前三个分区用满之后,第四个分区开始启用。也可以将所有分区设置为同一个优先级,但是假如这里有一块磁盘的速度比其它磁盘慢的话,性能就会下降。
通常的做法是把交换分区放在最快的磁盘中。
提示:交换分区不是物理内存的替代品,它存在于物理磁盘中,性能远远低于内存访问速度。

8 网络子系统的调优
操作系统安装完毕,就要对网络子系统进行调优。对其它子系统的影响:影响CPU利用率,尤其在有大量TCP连接、块尺寸又非常小时,内存的使用会明显增加。

如何预防性能下降
如下的sysctl命令用于改变安全设置,但是它也可以防止网络性能的下降。这些命令被设置为缺省值。
a.关闭如下参数可以防止黑客对服务器IP地址的攻击
b.开启TCP SYN cookies,保护服务器避免受syn-flood攻击,包括服务取决denial-of-service (DoS) 或者分布式服务拒绝distributed denial-of-service (DDoS) (仅适用Red Hat Enterprise Linux AS)
c.以下命令使服务器忽略来自被列入网关的服务器的重定向。因重定向可以被用来进行攻击,所以我们只接受有可靠来源的重定向。
d.另外,你可以配置接受或拒绝任何ICMP重定向。ICMP重定向是路由器传输路由信息的机制。比如,当网关接收到来自所接网络主机的Internet数据报时,
网关可以发送重定向信息到一台主机。网关检查路由表获得下一个网关的地址,第二个网关将数据报路由到目标网络.关闭这些重定向的命令如下:
e.如果这个服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能:
f.配置服务器拒绝接受广播风暴或者smurf 攻击attacks:
g.忽略所有icmp包或者pings:
h.有些路由器针对广播帧发送无效的回应,每个都产生警告并在内核产生日志.这些回应可以被忽略:

针对TCP和UDP的调优
下边的命令用来对连接数量非常大的服务器进行调优.
a.对于同时支持很多连接的服务器,新的连接可以重新使用TIME-WAIT套接字.这对于Web服务器非常有效:
b.如果你使用该命令,还要启动TIME-WAIT 套接字状态的快速循环功能:
图Figure 10-7显示出将这些功能启用,连接数量明显降低.因为每个TCP传输都包含远程客户端的协议信息缓存,所以有利于提高性能.缓存中存放round-trip时间、最大segment大小、拥塞窗口的信息。
c.参数tcp_fin_timeout 是套接字关闭时,保持FIN-WAIT-2状态的时间。一个TCP连接以three-segment SYN序列开始, 以three-segment FIN序列结束.均不保留数据.通过改变tcp_fin_timeout的值,
从FIN序列到内存可以空闲出来处理新连接的时间缩短了,使性能得到改进.改变这个值的前要经过认真的监测,避免因为死套接字造成内存溢出.
d.服务器的一个问题是,同一时刻的大量TCP连接里有很多的连接被打开但是没有使用. TCP的keepalive功能检测到这些连接,缺省情况下,在2小时之后丢掉.
2个小时的可能导致内存过度使用,降低性能.因此改成1800秒(30分钟)是个更好的选择:
e.对于所有协议的队列,设置最大系统发送缓存(wmem) 和接收缓存(rmem)到8MB
这些设置指定了创建TCP套接字时为其分配的内存容量. 另外,使用如下命令发送和接收缓存.该命令设定了三个值:最小值、初始值和最大值.第三个值必须小于或等于wmem_max和rmem_max。
f.(SUSE LINUX Enterprise Server适用) 通过保留路径验证来源数据包。缺省情况下,路由器转发所有的数据包,即便是明显的异常网络流量。通过启动和是的过滤功能,丢掉这些数据包:
g.当服务器负载繁重或者是有很多客户端都是超长延时的连接故障,可能会导致half-open连接数量的增加。这对于Web服务器很来讲很平常,尤其有很多拨号客户时.
这些half-open连接保存在 backlog connections 队列中.将这个值最少设置为4096 (缺省为1024). 即便是服务器不接收这类连接,设置这个值还能防止受到denial-of-service (syn-flood)的攻击.
h.设置ipfrag参数,尤其是NFS和Samba服务器。这里,我们可以设置用于重新组合IP碎片的最大、最小内存。当ipfrag_high_thresh值被指派,碎片会被丢弃直到达到ipfrag_low_thres值。
当TCP数据包传输发生错误时,开始碎片整理。有效的数据包保留在内存,同时损坏的数据包被转发。例如,设置可用内存范围从256 MB到384 MB:

以上所做的这些优化在某种程度上会增强服务器的负载性能。但请注意,最佳的配置是实践出来的。

典型的,提供大量静态文件访问的web服务器,缓存服务器(如squid), 均要注意这个问题
网上的教程,大约只是简单说明了如何设置ulimit和file-max, 但并没有说清楚这两者之间的差别,让人一头雾水

1. file-max的含义
man proc,可得到file-max的描述:
/proc/sys/fs/file-max
              This  file defines a system-wide limit on the number of open files for all processes.  (See
              also setrlimit(2),  which  can  be  used  by  a  process  to  set  the  per-process  limit,
              RLIMIT_NOFILE,  on  the  number  of  files it may open.)  If you get lots of error messages
              about running out of file handles, try increasing this value:

这个值在kernel的文档里是这样描述的:

The value  in  file-max  denotes  the  maximum number of file handles that the Linux kernel will allocate. When you get a lot of error messages about running out of  file handles, you might want to raise this limit. The default value is 10% of  RAM in kilobytes.  To  change it, just  write the new number  into the file:
意思是file-max一般为内存大小(KB)的10%来计算,如果使用shell,可以这样计算:
grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}'
一般我们不需要主动设置这个值,除非这个值确实较小(可能有各种其他原因导致file-max没有设置为内存的10%)
如何查看当前kernel的句柄;
cat /proc/sys/fs/file-nr
file-nr在内核文档里得解释如下:
Historically, the three values in file-nr denoted the number of allocated file
handles,  the number of  allocated but  unused file  handles, and  the maximum
number of file handles. Linux 2.6 always  reports 0 as the number of free file
handles -- this  is not an error,  it just means that the  number of allocated
file handles exactly matches the number of used file handles.

即file-max是设置 系统所有进程一共可以打开的文件数量 。同时一些程序可以通过setrlimit调用,设置每个进程的限制。如果得到大量使用完文件句柄的错误信息,是应该增加这个值。也就是说,这项参数是系统级别的。
echo  6553560 > /proc/sys/fs/file-max
或修改 /etc/sysctl.conf, 加入
fs.file-max = 6553560 重启生效

2. ulimit的
Provides control over the resources available to the shell and to processes started by it, on systems that allow  such control.
即设置当前shell以及由它启动的进程的资源限制。
显然,对服务器来说,file-max, ulimit都需要设置,否则就可能出现文件描述符用尽的问题,为了让机器在重启之后仍然有效,强烈建立作以下配置,以确保file-max, ulimit的值正确无误:
1. 修改/etc/sysctl.conf, 加入
fs.file-max = 6553560
2.系统默认的ulimit对文件打开数量的限制是1024,修改/etc/security/limits.conf并加入以下配置,永久生效
* soft nofile 65535
* hard nofile 65535
修改完之后,重启即可生效