近些年来,世界上许多大软件公司纷纷推出各类Linux服务器系统及Linux下的应用软件。目前,Linux已可以与各类传统的商业操作系统分庭抗礼,在服务器市场,抢占了相当大的份额。本文分别从c盘调优,文件系统,显存管理以及编译优化等方面来阐述Linux系统的优化调优策略。
1.序言
实践证明Linux是高性能、稳定可靠而又相当灵活的操作系统,近些年来,世界上许多大软件公司纷纷推出各类Linux服务器系统及Linux下的应用软件。目前,Linux已可以与各类传统的商业操作系统分庭抗礼,在服务器市场,抢占了相当大的份额。Linux的服务器系统多种多样,可用作web服务器,短信服务器,ftp服务器,文件服务器以及数据库服务器等等。针对不同的系统以及具体的应用环境,可以对Linux的性能进行相应的调优。下边分别从c盘调优,文件系统,显存管理以及编译优化等方面来阐述Linux系统的优化调优策略。
2.c盘调优
2.1优化的分区
在安装Linux系统之初,就应当考虑如何使Linux系统得到最好的性能。在Linux系统中,我们可以自由地组织c盘分区。一个优化的分区策略,可以挺好地改进Linux系统的性能,降低c盘碎片,提升c盘I/O能力。
按照c盘的特征,我们晓得越是靠c盘外部的柱面,旋转越快,但是每次旋转时,c盘读写头可以覆盖较多的区域,也就意味着靠外部的柱面可以得到较好的性能。所以在分区时,我们应当考虑将访问频度高的,对系统性能影响相对较大的分区放在c盘的靠外部份。同时,为了降低c盘碎片,应将内容常常改变的目录放在单独的分区。从便捷备份数据的角度考虑,由于好多备份工具对整个分区进行备份的效率要高,所以我们应将Linux系统的几个主要的目录作为单独的文件系统,为它们各自分配一个区。推荐的分区策略如图一:
在上图中,c盘还有一部份未分区的空间,为何不在安装系统时,将整个c盘分区呢?现今的硬碟空间比较大,而在安装系统时,其实你所安装的文件加上之后下降所须要的空间用不到整个c盘储存空间。保留一部份未分区空间,当之后有新的须要时,就可以用fdisk重新将之分区。在分区时,须要注意的是,根据系统将来运行的须要或过去的经验来恐怕各个分区的大小,以免将来空间不够。
假如你的系统有多块硬碟,可以考虑使用多个交换分区。每位c盘上界定一个交换分区。通过在/etc/fstab文件中设置pri选项,可使多个交换分区具有同样的优先级。Linux系统即可并行地使用它们。这样即可提升交换分区的性能。
/dev/hda5 swap swap defaults,pri=5 0 0 /dev/hdc5 swap swap defaults,pri=5 0 0
其实,假如你的系统显存足够大,而你的系统又远远用不了这么多的显存,那也就用不到哪些虚存了。分区时你就可以考虑除去交换分区。不过作为一个Linux服务器,虽然你的显存足够大,还是应当设置交换分区。
2.2使用hdparm改善Linux系统性能
假如你的Linux系统运行于IDE硬碟,可以使用hdparm工具来提升c盘I/O的性能。不过使用hdparm要当心,由于可能破坏硬碟上的数据。所以在使用hdparm之前,仔细阅读你的硬碟指南。按照你具体的硬碟尺寸来使用相应的hdparm开关参数。对一块UltraATA/66EIDE硬碟,其控制芯片支持多PIO模式和DMA,我们使用以下命令来调优c盘性能:
# /sbin/hdparm -x66 -d1 -u1 -m16 -c3 /dev/hda
选项说明:
查看以上的修改情况可以使用命令:
# /sbin/hdparm /dev/hda
测试c盘I/O性能可以使用命令:
# /sbin/hdparm -tT /dev/hda
假如c盘的性能有改进的话,可以使用以下命令来保存设置:
# /sbin/hdparm -k1 /dev/hda
2.3Linux下使用软RAID
RAID(c盘冗余阵列)是通过将数据分布在多个c盘上来提高c盘性能和可靠性的技术。假如你的系统没有硬件RAID控制器的话,在Linux下可以通过软件来实现RAID。RAID的有好多的级别,不同的级别对硬件有不同的要求,相应也会得到不同的性能和可靠性。RAID0为数据分割,数据块被交替讲到c盘,可以得到最好的读写性能,并且不提供数据冗余。RAID1为c盘镜像,讲到c盘1中的一切也讲到c盘2中,从任何一个c盘都可以读取。RAID3不仅数据分割之外,还指定一个c盘驱动器来储存奇偶信息。
在Linux下通过软件来实现RAID,须要Linux的内核支持,可以通过编译新内核来添加对RAID的支持。之后还需编译并安装raidtools软件包。raidtools是可以初始化、启动、停止及控制RAID阵列的用户级工具。下边是我们用两块IDE硬碟在Linux内核2.4上实现RAID0的方式。
设置分区使用RAID0起码须要两个分区,它们坐落不同的c盘。最好做RAID0的两个分区有相同的大小。创建分区时,将分区类型指定为"FD"。以使Linux内核能将它们辨识为RAID分区,这样,这种分区就可在每次引导时手动被测量并启动。假如您没有以这些方法标记RAID分区,则在每次引导以后,必须首先输入"raidstart--all"能够挂载RAID阵列。我们弄成RAID0的两个分区为hda5和hdc5。
编辑/etc/raidtab文件创建/etc/raidtab文件以描述RAID阵列的配置信息。Linux内核使用这种信息在引导时手动检查并启动RAID阵列,因而必须对创建的每位RAID阵列进行这些配置。将分区hda5和hdc5组成md0RAID0阵列的配置文件如下:
raiddev /dev/md0 raid-level0 nr-raid-disks2 persistent-superblock 1 chunk-size32 device/dev/hda5 raid-disk0 device/dev/hdc5 raid-disk1
在raidtab文件中,"raiddev"条目指明要创建的RAID阵列;"nr-raid-disks"指定阵列中的c盘数量;"persistent-superblock"设置为1,告诉raid工具何时创建该卷;"chunk-size"以K字节指定RAID0使用的块大小;最后,要指定的是组成该阵列的设备即分区。
mkraid和创建文件系统使用命令"#mkraid/dev/md0"命令初始化/dev/md0分区,同时将启动md0RAID0阵列。接出来,即可在md0上创建你想要得文件系统。我们在Linux服务器上使用的是Reiserfs日志文件系统,创建的命令为"#mkreiserfs/dev/md0"。
这样,就可以像其它文件系统那样来加载新创建的基于RAID0的文件系统了。
2.4使用elvtune调谐c盘I/O
在Linux内核2.4之后的版本中,可以通过c盘I/O的调度操作,来控制c盘I/O的响应时间和吞吐量。通过调整I/O恳求在队列中的最大等待时间,可以在响应时间和吞吐量之间调优。假如要求较少的响应时间,这么吞吐量将增加,反之,较长的响应时间则可以得到较大的吞吐量。可以使用工具"/sbin/elvtune"来改变最大的响应时间值。使用方式如下:
查看当前的设置
# /sbin/elvtune /dev/hda1
更改当前的配置
# /sbin/elvtune -r 2000 -w 4000 /dev/hda
其中-r参数针对读操作,-w参数针对写操作.
可以通过命令"iostat-d-x/dev/hda1"得到的平均信息(包括平均恳求大小和平均队列宽度)来监视以上I/O配置的疗效,并调整配置,以得到最佳的性能。通常来讲,对于读写频繁,但操作的数据量较少的Linux服务器,且对实时性要求较高,这么可以将参数调小。反之假如对于读写不频繁,但要求具有较大的吞吐量的Linux服务器,可以将参数调大,以获得较大的吞吐量。
3.文件及文件系统调优
3.1块大小
创建文件系统时,可以指定块的大小。假如将来在你的文件系统中是一些比较大的文件的话,使用较大的块大小将得到较好的性能。将ext2文件系统的块大小调整为4096byte而不是缺省的1024byte,可以降低文件碎片,推动fsck扫描的速率和文件删掉以及读操作的速率。另外,在ext2的文件系统中,为根目录保留了5%的空间,对一个大的文件系统,除非用作日志文件,5%的比列有些过多。可以使用命令"#mke2fs-b4096-m1/dev/hda6"将它改为1%并以块大小4096byte创建文件系统。
使用多大的块大小,须要依照你的系统综合考虑,假如系统用作电邮或则新闻服务器,使用较大的块大小,尽管性能有所提升,但会导致c盘空间较大的浪费。例如文件系统中的文件平均大小为2145byte,假如使用4096byte的块大小,平均每一个文件才会浪费1951byte空间。假如使用1024byte的块大小,平均每一个文件会浪费927byte空间。在性能和c盘的代价上怎么平衡,要看具体应用的须要。
3.2不使用atime属性
当文件被创建,更改和访问时,Linux系统会记录那些时间信息。记录文件近来一次被读取的时间信息,当系统的读文件操作频繁时,将是一笔不少的开销。所以,为了提升系统的性能,我们可以在读取文件时不更改文件的atime属性。可以通过在加载文件系统时使用notime选项来做到这一点。当以noatime选项加载(mount)文件系统时,对文件的读取不会更新文件属性中的atime信息。设置noatime的重要性是清除了文件系统对文件的写操作,文件只是简单地被系统读取。因为写操作相对读来说要更消耗系统资源,所以这样设置可以显著提升服务器的性能。注意wtime信息依然有效linux系统如何支持虚存,任何时侯文件被写,该信息仍被更新。
例如在你的系统中,要为/home文件系统设置notime选项,可以更改/etc/fstab文件相应的行如下:
LABEL=/home /home ext2 noatime 1 2
要使该设置立刻生效,可运行命令"#mount-oremount/home"。这样之后系统读取/home下的文件时将不会再更改atime属性。
3.3调整缓冲区刷新参数
Linux内核中,包含了一些对于系统运行态的可设置参数。缓冲刷新的参数可以通过调整/proc/sys/vm/bdflush文件来完成,这个文件的格式是这样的:
# cat /proc/sys/vm/bdflush 30 64 64 256 500 3000 60 0 0
每一栏是一个参数,其中最重要的是上面几个参数。第一个数字是在"dirty"缓冲区达到多少的时侯强制唤起bdflush进程刷新硬碟,第二个数字是每次让bdflush进程刷新多少个dirty块。所谓dirty块是必须讲到c盘中的缓存块。接出来的参数是每次容许bdflush将多少个显存块排入空闲的缓冲块列表。以上值为RedHatLinux7.1中的缺省值。怎样更改它们呢?对不同的系统有以下两种方式
(1)# echo "100 128 128 512 5000 3000 60 0 0">/proc/sys/vm/bdflush 并将这条命令加到/etc/rc.d/rc.local文件中去。 (2)在/etc/sysctl.conf 文件中加入如下行: vm.bdflush = 100 128 128 512 5000 3000 60 0 0
以上的设置加强了缓冲区大小,增加了bdflush被启动的频率,同时也降低了万一系统崩溃遗失数据的危险性。VFS的缓冲刷新是Linux文件系统高效的重要诱因之一,倘若性能对你真的很重要,应当考虑调整这个参数。
3.4调整文件句柄数和i-节点数
在一个小型的网站服务器其中,可能Linux默认的同时可打开最大文件数不能满足系统须要,我们可以通过调整文件句柄数和i-节点数来降低系统的缺省的限制。不同的Linux内核版本有不同的调整方式。
在Linux内核2.2.x中可以用如下命令更改:
# echo '8192' > /proc/sys/fs/file-max # echo '32768' > /proc/sys/fs/inode-max
并将以上命令加到/etc/rc.c/rc.local文件中,以使系统每次重新启动时配置以上值。
在Linux内核2.4.x中须要更改源代码,之后重新编译内核才生效。编辑Linux内核源代码中的include/Linux/fs.h文件,将NR_FILE由8192改为65536,将NR_RESERVED_FILES由10改为128。编辑fs/inode.c文件将MAX_INODE由16384改为262144。
通常情况下,最大打开文件数比较合理的设置为每4M化学显存256,例如256M显存可以设为16384,而最大的使用的i节点的数量应当是最大打开文件数量的3倍到4倍。
3.5使用显存文件系统
在Linux中可以将一部份显存当成分区来使用,我们称之为RamDisk。对于一些常常被访问的文件,而它们又不会被修改linux解压rar,可以将它们通过RamDisk置于显存中,即可显著地提升系统的性能。其实你的显存可要足够大了。RamDisk有两种,一种可以低格,加载,在Linux内核2.0/2.2就早已支持,其不足之处是大小固定。另一种是内核2.4才支持的,通过Ramfs或则tmpfs来实现,它们不能被低格,并且用上去灵活,其大小随所须要的空间而降低或降低。这儿主要介绍一下Ramfs和Tmpfs。
Ramfs顾名思义是显存文件系统,它工作于虚拟文件系统(VFS)层。不能低格,可以创建多个,在创建时可以指定其最大能使用的显存大小。假如你的Linux早已将Ramfs编译进内核linux系统如何支持虚存,你就可以很容易地使用Ramfs了。创建一个目录,加载Ramfs到该目录即可。
# mkdir -p /RAM1 # mount -t ramfs none /RAM1
缺省情况下,Ramfs被限制最多可使用显存大小的一半。可以通过maxsize(以kbyte为单位)选项来改变。
# mkdir -p /RAM1 # mount -t ramfs none /RAM1 -o maxsize=10000
以上即创建了一个限定了最大使用显存大小为10M的ramdisk。
Tmpfs是一个虚拟显存文件系统,它不同于传统的用块设备方式来实现的ramdisk,也不同于针对化学显存的Ramfs。Tmpfs可以使用物理显存,也可以使用交换分区。在Linux内核中,虚拟显存资源由化学显存(RAM)和交换分区组成,这种资源是由内核中的虚拟显存子系统来负责分配和管理。Tmpfs就是和虚拟显存子系统来"打交道"的,它向虚拟显存子系统恳求页来储存文件,它同Linux的其它恳求页的部份一样,不晓得分配给自己的页是在显存中还是在交换分区中。Tmpfs同Ramfs一样,其大小也不是固定的,而是随着所须要的空间而动态的增减。使用tmpfs,首先你编译内核时得选择"虚拟显存文件系统支持(Virtualmemoryfilesystemsupport)",之后就可以加载tmpfs文件系统了。
# mkdir -p /mnt/tmpfs # mount tmpfs /mnt/tmpfs -t tmpfs
为了避免tmpfs使用过多的显存资源而导致系统的性能增长或关机,可以在加载时指定tmpfs文件系统大小的最大限制。
# mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m
以上创建的tmpfs文件系统就规定了其最大的大小为32M。不管是使用ramfs还是tmpfs,必须明白的是,一旦系统重启,它们中的内容将会遗失。所以这些东西可以置于显存文件系统中得依据系统的具体情况而定。
3.6使用日志文件系统
假如Linux系统因为意外情况而没有正常死机,则可能导致文件系统中个别文件的元数据(meta-data即和文件有关的信息,比如:权限、所有者以及创建和访问时间)受到破坏。文件系统须要维护文件的元数据来保证文件的可组织和可存取,假如元数据处于不合理或不一致的状态,这么就不能访问和存取文件。当系统重新启动时,fsck将扫描/etc/fstab文件中所列举的所有文件系统,确保它们的元数据处于可用的状态。假如发觉元数据不一致,fsck将扫描和检查元数据,并纠正错误。假如文件系统很大,这个过程将须要很长的时间。为解决这个问题,可以使用日志文件系统。日志文件系统用独立的日志文件跟踪c盘内容的变化,在写入文件内容的同时写入文件的元数据。每次更改文件的元数据时,都要先向称为"日志"的数据结构登记相应的条目。这样,日志文件系统就维护了近来修改的元数据的记录。当加载日志文件系统时,假若发觉了错误,不会扫描整个文件系统的元数据,而是按照日志检测近来被修改的元数据。所以相对于传统的文件系统(如ext2),日志文件系统大大地推进了扫描和检查的时间。
Linux下可用的日志文件系统好多,如XFS,JFS,Reiserfs,ext3等等。日志文件系统主要被设计为服务器环境提供出众性能和高可用性。其实,Linux工作站和家用机器也可从具有高性能的可靠日志文件系统中受益。安装日志文件系统,通常须要下载相应的压缩包、为内核打补丁、重新配置和重新编译内核。详尽的安装过程可访问相应文件系统的官方网站。
4.其它方面的调优
4.1调优buffermem
文件buffermen和内核虚拟显存子系统密切相关。文件/proc/sys/vm/buffermem控制多大显存被用于缓冲区(百分率表示)。内核2.4的缺省值为::"21060"。可以按如下方式更改:
# echo "70 10 60" >/proc/sys/vm/buffermem
并将之加到脚本文件/etc/rc.d/rc.local中。或则在/etc/sysctl.conf文件中加入
vm.buffermem = 70 10 60
第一个参数70意味着起码分配70%的显存用作缓冲区。后两个参数保持系统的默认值。第一个参数设置为多大合适,依赖于系统的显存大小和系统高负载时显存的使用情况(可用free监视)。
4.2进程限制
Linux对于每位用户,系统限制其最大进程数。为提升性能,可以设置超级用户root的最大进程数为无限。编辑.bashrc文件(vi/root/.bashrc)降低行"ulimit-uunlimited"即可清除超级用户的进程限制。
核心和系统对用户进程其它的一些限制也可以通过ulimit命令来查看和修改。"ulimit-a"拿来显示当前的各类用户进程限制。一些修改用户限制的反例如下:
4.3优化gcc编译
将优化标志置于/etc/profile文件中。在pentiumIII级的处理器上使用以下优化标志将得到最优的应用程序:
CFLAGS=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions
再将如下行加到/etc/profile更靠后的位置:
export PATH PS1 HOSTNAME HISTSIZE HISTFILESIZE USER LOGNAME MAIL INPUTRC CFLAGS LANG LESSCHARSET
使用以上的优化,gcc或则egcs编译的程序将得到最佳的性能。
4.4编译内核优化
编辑/usr/src/Linux/Makefile文件,可以按照具体的cpu优化内核编译。以下的参数设置将得到优化的内核性能。
①vi+18/usr/src/Linux/Makefile,将HOSTCC=gcc改为HOSTCC=egcs.
②vi+25/usr/src/Linux/Makefile
将CC=$(CROSS_COMPILE)gccD__KERNEL__-I$(HPATH)
改为CC=$(CROSS_COMPILE)egcsD__KERNEL__-I$(HPATH).
③vi+90/usr/src/Linux/Makefile
将CFLAGS=-Wall-Wstrict-prototypes-O2-fomit-frame-pointer
改为CFLAGS=-Wall-Wstrict-prototypes-O9-funroll-loops-ffast-math-malign-double-mcpu=pentiumpro-march=pentiumpro-fomit-frame-pointer-fno-exceptions
④vi+19/usr/src/Linux/Makefile
将HOSTCFLAGS=-Wall-Wstrict-prototypes-O2-fomit-frame-pointer
改为HOSTCFLAGS=-Wall-Wstrict-prototypes-O9-funroll-loops-ffast-math-malign-double-mcpu=pentiumpro-march=pentiumpro-fomit-frame-pointer-fno-exceptions
按照以上更改后的makefile文件重新编译内核将得到较优的性能。
5.结束语
Linux是一个灵活而又开放的系统。用户可以针对具体的应用环境,从系统的外围到系统的内核进行调优。系统的外围的调优包括系统硬件的配置到系统安装和系统服务的优化等。系统内核的调优包括参数的更改和改进系统的源代码。我们在针对用作db2数据库服务器的Linux系统的调优中,针对db2数据库的特征,根据本文的各个调优方面,另外还包括网路的调优,对系统性能进行了综合调优。在对调优后的系统的综合测试来看,系统的性能有很大的改进。
关于作者
邓延军,男linux系统日志,河南永州人,南京电子科技学院软件工程研究所硕士研究生,主要研究方向多播合同,系统调优。您可以通过电子电邮和他联系。