首先一个基本概念: 存储系统存储速度的快->慢: 内存->闪存->磁盘
因为内存的价格限制以及操作系统支持的限制,我们只能从磁盘这块来看,可见磁盘正是存储系统的最大瓶颈所在。
**下面具体提出我们的优化方案
优化方案1.缓存机制: 我们在磁盘里嵌入一小块高速的内存,用以保持常用的数据,我们称它为缓存。这样既可以使用磁盘,也能提高性能
缓存分为3类 Filestem cache、Diskcache、Disk controller cache。这里从磁盘部分来看,它包括了缓存数据。预读。回写。
缓存尝试用LRU算法、即近最少使用算法顾名思义。
写入缓存,即IO命令并不立刻的去执行,而是先在缓存中合并,相同的合为一个连续的合为一体,把随机写IO变成连续写。这样做的直接作用减少了寻址浪费时间从而有效提高效率
缓存的大小设置问题:不能太大了因为成本!!硬伤所在。。
小了呢他相对于大的存储系统就显的不够看,而且你要找一个东西他不在缓存里系统还要去缓存寻址一次。这样做的太多自然降低了效率。
[#1#root@localhost ~]#free -m
Total// used free shared buffers cache
物理内存总量 已使用内存量 空闲内存 多个进程的共享内存 元数据缓存 块数据缓存
Mem: 490 132 357 0 7 38
-/+ buffers/cache: 87 402
从应用程序角度看 used 系统本身占用87=132(实际已使用)-buffer(7)- cache(38)
Free 系统当前空闲的内存量=就是free的把缓存的都算上
----------------------------------------------------------------------------------------------------
Swap: 511 0 511 //swap空闲内存够用所以都是free
个人总结:从应用程序上看,在他们眼里只是单纯的可用就好,觉得缓存是更快的内存的所以他认为可用内存包括缓存。所以他么也并不知道系统实际占用的内存。而同样因为可用就好,他认为系统本身占的 就是已使用内存减去可以利用的缓存,也就是系统运行必要的内存,他们不能触碰。 --觉得自己可能简单问题复杂化了可真是想的很晕。
简单记住公式 used-缓存 free+缓存就好了
linux系统中buffer 和cache的区别,首先粗略的认为cache是第一次读取后才有的,而buffer是系统为你预先准备好的。
缓存(cached)是把读取过的数据 保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
缓冲(buffers)是根据磁盘的读写 设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
以下是手动清空缓存的方法:(缓存被占用是正常的系统现象,清空缓存空间会
造成系统IO 异常,慎用。)
清空page cache
#echo 1 > /proc/sys/vm/drop_caches
清空buffer cache
#echo 2 > /proc/sys/vm/drop_caches
清空所有cache
#echo 3 > /proc/sys/vm/drop_caches
优化方案2.使用swap分区:
以前都说swap是物理内存的两倍,可是现在的内存都很大 什么16G啊 32G啊。你整64G swap?那样做只是并没有什么用。。。。。
优化方案3.合理分区:
根据磁盘的特点,我们知道越是靠磁盘外部的柱面,旋转越快,而且每次旋转时,磁盘读写头可以覆盖较多的区域,也就意味着靠外部的柱面可以得到较好的性能。所以在分区时,我们应该考虑将访问频率高的,对系统性能影响相对较大的分区置于磁盘的靠外部分。同时,为了减少磁盘碎片,应将内容经常改变的目录放在单独的分区。从方便备份数据的角度考虑,因为很多备份工具对整个分区进行备份的效率要高,所以我们应将Linux系统的几个主要的目录作为单独的文件系统,为它们各自分配一个区。推荐的分区策略如图一:
如果你的系统有多块硬盘,可以考虑使用多个交换分区。每个磁盘上划分一个交换分区。通过在/etc/fstab文件中设置pri 选项,可使多个交换分区具有同样的优先级。Linux系统即可并行地使用它们。这样即可提高交换分区的性能。
/dev/hda5 swap swap defaults,pri=5 0 0
/dev/hdc5 swap swap defaults,pri=5 0 0
当然,如果你的系统内存足够大,而你的系统又远远用不了那么多的内存,那也就用不到什么虚存了。分区时你就可以考虑去掉交换分区。不过作为一个Linux服务器,即使你的内存足够大,还是应该设置交换分区。
优化方案4、文件方面:raid、文件块的大小、去掉文件的atime、缓冲区刷新参数、文件句柄和innode数量、使用内存文件系统、使用日志文件系统:
raid不做详述。
块大小
创建文件系统时,可以指定块的大小。如果将来在你的文件系统中是一些比较大的文件的话,使用较大的块大小将得到较好的性能。将ext2文件系统的块大小调整为4096byte而不是缺省的1024byte,可以减少文件碎片,加快fsck扫描的速度和文件删除以及读操作的速度。另外,在ext2的文件系统中,为根目录保留了5%的空间,对一个大的文件系统,除非用作日志文件,5%的比例有些过多。可以使用命令"# mke2fs -b 4096 -m 1 /dev/hda6"将它改为1%并以块大小4096byte创建文件系统。
使用多大的块大小,需要根据你的系统综合考虑,如果系统用作邮件或者新闻服务器,使用较大的块大小,虽然性能有所提高,但会造成磁盘空间较大的浪费。比如文件系统中的文件平均大小为2145byte,如果使用4096byte的块大小,平均每一个文件就会浪费1951byte空间。如果使用1024byte的块大小,平均每一个文件会浪费927byte空间。在性能和磁盘的代价上如何平衡,要看具体应用的需要。
不使用atime属性
我们知道文件的创建,修改,访问会有保存时间信息,我们的频繁反复操作会对系统负载有一部分开销。为了提高系统的性能,我们可以在读取文件时不修改文件的atime属性。可以通过在加载文件系统时使用notime选项来做到这一点。当以noatime选项加载(mount)文件系统时,对文件的读取不会更新文件属性中的atime信息。设置noatime的重要性是消除了文件系统对文件的写操作,文件只是简单地被系统读取。由于写操作相对读来说要更消耗系统资源,所以这样设置可以明显提高服务器的性能。注意wtime信息仍然有效,任何时候文件被写,该信息仍被更新。
比如在你的系统中,要为/home文件系统设置notime选项,可以修改/etc/fstab文件相应的行如下:
LABEL=/home /home ext2 noatime 1 2
要使该设置立即生效,可运行命令"#mount -oremount /home"。这样以后系统读取/home下的文件时将不会再修改atime属性。
调整缓冲区刷新参数
Linux内核中,包含了一些对于系统运行态的可设置参数。缓冲刷新的参数可以通过调整 /proc/sys/vm/bdflush文件来完成,这个文件的格式是这样的:
# cat /proc/sys/vm/bdflush
30 64 64 256 500 3000 60 0 0
每一栏是一个参数,其中最重要的是前面几个参数。第一个数字是在"dirty"缓冲区达到多少的时候强制唤醒bdflush进程刷新硬盘,第二个数字是每次让bdflush进程刷新多少个dirty块。所谓dirty块是必须写到磁盘中的缓存块。接下来的参数是每次允许bd flush将多少个内存块排入空闲的缓冲块列表。 以上值为RedHat Linux 7.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文件系统高效的重要原因之一,如果性能对你真的很重要,应该考虑调整这个参数。
调整文件句柄数和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倍。
使用内存文件系统
在Linux中可以将一部分内存当作分区来使用,我们称之为RamDisk。对于一些经常被访问的文件,而它们又不会被更改,可以将它们通过RamDisk放在内存中,即可明显地提高系统的性能。当然你的内存可要足够大了。RamDisk有两种,一种可以格式化,加载,在Linux内核2.0/2.2就已经支持,其不足之处是大小固定。另一种是内核2.4才支持的,通过Ramfs或者tmpfs来实现,它们不能被格式化,但是用起来灵活,其大小随所需要的空间而增加或减少。这里主要介绍一下Ramfs和Tmpfs。
Ramfs顾名思义是内存文件系统,它工作于虚拟文件系统(VFS)层。不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。如果你的Linux已经将Ramfs编译进内核,你就可以很容易地使用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,首先你编译内核时得选择"虚拟内存文件系统支持(Virtual memory filesystem support)" ,然后就可以加载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,必须明白的是,一旦系统重启,它们中的内容将会丢失。所以那些东西可以放在内存文件系统中得根据系统的具体情况而定。
使用日志文件系统
如果Linux系统由于意外情况而没有正常关机,则可能引起文件系统中某些文件的元数据(meta-data即和文件有关的信息,例如:权限、所有者以及创建和访问时间)遭到破坏。文件系统需要维护文件的元数据来保证文件的可组织和可存取,如果元数据处于不合理或不一致的状态,那么就不能访问和存取文件。当系统重新启动时,fsck将扫描/etc/fstab文件中所列出的所有文件系统,确保它们的元数据处于可用的状态。如果发现元数据不一致,fsck将扫描和检测元数据,并纠正错误。如果文件系统很大,这个过程将需要很长的时间。为解决这个问题,可以使用日志文件系统。日志文件系统用独立的日志文件跟踪磁盘内容的变化,在写入文件内容的同时写入文件的元数据。每次修改文件的元数据时,都要先向称为"日志"的数据结构登记相应的条目。这样,日志文件系统就维护了最近更改的元数据的记录。当加载日志文件系统时,如果发现了错误,不会扫描整个文件系统的元数据,而是根据日志检查最近被更改的元数据。所以相对于传统的文件系统(如ext2),日志文件系统大大地加快了扫描和检测的时间。
Linux下可用的日志文件系统很多,如XFS,JFS,Reiserfs,ext3等等。日志文件系统主要被设计为服务器环境提供出色性能和高可用性。当然, Linux 工作站和家用机器也可从具有高性能的可靠日志文件系统中获益。安装日志文件系统,一般需要下载相应的压缩包、为内核打补丁、重新配置和重新编译内核。 详细的安装过程可访问相应文件系统的官方网站。
其它方面的调优
调优buffermem
文件buffermen和内核虚拟内存子系统密切相关。文件/proc/sys/vm/buffermem控制多大内存被用于缓冲区(百分数表示)。内核2.4的缺省值为:: "2 10 60"。可以按如下方法修改:
# echo "70 10 60" >/proc/sys/vm/buffermem
并将之加到脚本文件/etc/rc.d/rc.local 中。或者在/etc/sysctl.conf文件中加入
vm.buffermem = 70 10 60
第一个参数 70意味着至少分配70%的内存用作缓冲区。后两个参数保持系统的默认值。第一个参数设置为多大合适,依赖于系统的内存大小和系统高负载时内存的使用情况(可用free监视)。
进程限制
Linux对于每个用户,系统限制其最大进程数。为提高性能,可以设置超级用户root的最大进程数为无限。编辑.bashrc文件(vi /root/.bashrc)增加行"ulimit -u unlimited"即可消除超级用户的进程限制。
核心和系统对用户进程其它的一些限制也可以通过ulimit命令来查看和更改。"ulimit -a" 用来显示当前的各种用户进程限制。一些更改用户限制的例子如下:
ulimit -n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024
ulimit -m 4096 限制每个进程使用的内存数。
优化gcc编译
将优化标志放在/etc/profile文件中。在pentium III级的处理器上使用以下优化标志将得到最优的应用程序:
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编译的程序将得到最佳的性能。
编译内核优化
编辑/usr/src/Linux/Makefile文件,可以根据具体的cpu优化内核编译。以下的参数设置将得到优化的内核性能。
① vi +18 /usr/src/Linux/Makefile ,将HOSTCC =gcc改为 HOSTCC =egcs.
② vi +25 /usr/src/Linux/Makefile
将CC =$(CROSS_COMPILE)gcc D__KERNEL__ -I$(HPATH)
改为 CC =$(CROSS_COMPILE)egcs D__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文件重新编译内核将得到较优的性能。
结束语
Linux是一个灵活而又开放的系统。用户可以针对具体的应用环境,从系统的外围到系统的 内核进行调优。系统的外围的调优包括系统硬件的配置到系统安装和系统服务的优化等。系统内核的调优包括参数的修改和改进系统的源代码。我们在针对用作db2数据库服务器的Linux系统的调优中,针对db2数据库的特点,按照本文的各个调优方面,另外还包括网络的调优,对系统性能进行了综合调优。在对调优后的系统的综合测试来看,系统的性能有很大的改进。
改编自--51cto 原创作者 -邓延军
来源:oschina
链接:https://my.oschina.net/u/2342806/blog/495553