优化虚拟内存子系统

优化内存子系统需要持续的观察,确保所做出的修改不会对服务器上的其它子系统产生不良影响。如果你要修改/proc/sys/vm下的虚拟内存参数,建议你一次只修改一个参数,然后观察服务器性能变化。

Linux上的大多数应用并不直接把数据写入磁盘,它们先写入由虚拟内存管理器维护的文件系统缓存中,最后刷入数据到磁盘。如果你使用了IBM ServerRAID控制器或者IBM TotalStorage磁盘子系统,你应该降低刷入的频率,增加每次I/O的效率。因为,高性能磁盘控制器处理大的I/O流比多个小I/O流更加高效。

Linux内核2.6的改进虚拟内存子系统,管理员可以使用简单的接口调整内核的交换操作。

  • /proc/sys/vm/swappiness 中的参数可以用来定义如何把内存页交换到磁盘。前面已经介绍过了Linux的虚拟内存管理器和Linux的swap空间的大致用法。Linux会把一段时间没有使用的内存移动到是swap中,即使在还有可用内存的情况下。通过修改/proc/sys/vm/swappiness中的百分比,你可以控制swap行为。如果不希望发生交换,/proc/sys/vm/swappiness应该是很小的值。在存限制严格的运行批量任务的系统(程序休眠很长时间)上,交换行为是很有用的。可以使用echo和sysctl命令改变交换行为。

    1. # sysctl -w vm.swappiness=100
  • 特别是对于快的磁盘子系统,可能会希望发生脏内存页大刷新。/proc/sys/vm/dirty_background_ratio中定义了达到内存的占用百分比时,pdflush守护进程把数据写入到磁盘。如果希望更大写入,把默认值增加到10%,值越大,写入的频率越低。可是使用如下的命令操作:

    1. # sysctl -w vm.dirty_background_ratio=25
  • 另外一个和虚拟内存子系统相关的设置是应用程序生成的脏页被刷入磁盘的百分比。前面章节已经说过,写入行为并不是直接发生,而是先写入页缓存,以后再刷入到磁盘子系统。/proc/sys/vm/dirty_ratio中是主内存的百分比。10的意思是,在文件系统缓存达到服务器内存的10%时,数据会写入系统。和之前的例子一样,设置写入磁盘脏页面百分比的20%的方法是:

    1. # sysctl -w vm.dirty_ratio=20

Swap分区

在物理内存用完,系统需要额外的内存的时候,就会使用swap。系统还会把一段时间内没有使用的内存存放到swap空间。当系统上没有空闲内存,会把最少使用的内存换出到磁盘中。swap空间在系统安装的时候创建,大小应该是物理内存的两倍。Linux内核2.4支持每个分区的swap最大为24G,32位系统上,理论的最大swap是8TB。交换分区应该分散在不同的磁盘中。

如果服务器上添加了内存,也应该配置额外的swap空间。在系统安装完成之后,还有如下的办法配置swap空间。

  • 磁盘上空闲的分区可以创建为swap分区。如果磁盘子系统上没有空闲的地方,会比较难办,那种情况下,我们可以创建swap文件。

  • 如果可以选择,swap分区是优于swap文件的。swap分区的I/O可以绕过文件系统,节省了写入文件的开销,比写入swap文件的性能更好。

另外一种提升swap分区和文件性能的办法是建立多个swap分区。Linux可以并行的读写多个swap分区。在创建了额外的swap分区或文件之后,/etc/fstab可能包含如下的内容:

/etc/fstab文件

在正常的情况下,Linux首先把/dev/sda2作为swap分区,然后是/dev/sdb2,依次往下等等,直到具有足够的swap空间。这意味着,如果不需要更大的swap空间,那可能只有/dev/sda2被使用。

因为所有的读写是同时对所有选定的分区的,所有把数据分散在多个swap分区可以提升性能。按照下图修改/etc/fstab文件,给前三个swap分区分配更高的优先级。

修改/etc/fstab让swap并发使用

swap分区是从最高优先级到最低优先级使用的(32767优先级最高,0的优先级最低)。给头三个磁盘分配相同的优先级,数据就会写入这三个磁盘,系统不会等第一个磁盘写满才使用第二个。由于系统并行的使用3个swap分区,会提升整体的性能。

只有在前三个swap分区都满了之后,还需要额外的swap,系统才会使用第四个swap分区/dev/sdd2。也可以把给所有的分区分配相同的优先级,把数据分散在所有swap分区,但面临的问题是,如果其中一个分区很慢比其它分区慢,性能会降低。最好的最法是,在最快的磁盘上配置swap分区。

重要:尽管这是优化内存子系统的手段,但是应该尽力避免经常的page out。swap分区不是内存的替代品,因为swap的速度会比内存慢很多。所以,page out(或者swap out)不是什么好事情。在调整swap之前,首先确定服务器上内存是充足的,而且没有内存泄露发生。

HugeTLBfs

对使用大量虚拟地址空间的应用来说,内存管理是很有用的。尤其是对数据库应用。

CPU的旁路转换缓冲是保存虚拟到物理映射信息的小缓存区。使用TLB,可以不用参考内存页表的虚拟地址映射就能完成转换。然而,为了保证转换速度够快,TLB通常很小。经常有大内存的应用超过了TLB的映射能力。

HugeTLBs特性让应用使用比通常更大的页大小,所以。单个TLB条目可以映射到更大的地址空间。HugeTLB条目的大小不一样。例如,在Itanium 2系统中,大页可以是正常页的1000倍。意味着TLB映射的虚拟地址空间是正常进程的1000倍,而不会TLB缓存未命中。简单起见,这个功能是通过文件系统接口向应用程序开放的。

可以通过配置/proc/sys/vm/nr_hugepages的值,设置hugepage的个数来分配hugepage

  1. sysctl -w vm.nr_hugepages=512

如果应用程序使用mmap()系统调用使用大页,你必须挂载hugetlbs类型的文件系统:

  1. mount -t hugetlbfs none /mnt/hugepages

/proc/meminfo会提供hugetlb页的信息,如下图:

/proc/meminfo中的大页信息

更多详细想信息,请参考内核文档:/vm/hugetlbpage.txt

原文: https://lihz1990.gitbooks.io/transoflptg/content/04.系统调优/4.5.优化虚拟内存子系统.html