3.8 改变内核参数
虽然对大多数用户我们不建议更改和重新编译内核源代码,但是Linux内核提供了另一种方法来调整内核参数。Proc文件系统提供了一个运行的内核的接口,可以被用来检测和修改内核参数。
如果要查看目前的内核的参数,可以在/proc/sys目录下用cat命令选择相应的文件。下面的例子里我们查看系统目前的内存overcommitstrategy参数。输出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/shmmax33554432
#
echo 33554430 > /proc/sys/kernel/shmmax#
cat /proc/sys/kernel/shmmax33554430
然而使用上述命令容易出现错误,所以我们建议使用sysctl命令因为sysctl命令在更改之前会进行一致性的检查,示例如下
#
sysctl kernel.shmmaxkernel.shmmax = 33554432
#
sysctl -w kernel.shmmax=33554430kernel.shmmax = 33554430
#
sysctl kernel.shmmaxkernel.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,这个技术是基于并行多线程技术(symmetricmultithreading,SMT)的完全被Linux内核所支持。使用SMT技术可以在一个CPU上同时执行两个进程或者线程(也被称为线程级别的并行)。如果操作系统和应用软件都支持并行操作,那么在不增加CPU时钟频率的情况下也可以提高系统的性能。
例如在一个启用了超线程的4路服务器上,使用像top这样的监测工具可以看到8个CPU
关于超线程注意以下几点
·启用超线程需要SMP内核支持
·安装在服务器上的CPU越多,超线程对性能带来的提高就越少。
-两个物理CPU:性能提高15-25%
-四个物理CPU:性能提高1-13%
-八个物理CPU:性能提高0-5%
关于超线程的更多信息可以在下面链接查询
EM64T是基于Intel IA-32架构的CPU64bit扩展技术,这意味着CPU可以扩展寻址更多的内存空间并且可以同时支持64bit应用和现存的32bit应用。关于EM64T的更详细的信息可以查看下面链接
3.10.1 正确的选择内核
Red Hat Enterprise Linux AS包括几个内核版本,为了性能方面的考虑,请确认为系统选择了最合适的内核
内核类型 |
描述 |
SMP |
内核支持SMP和超线程 |
Hugemem |
支持超过12GB的内存,包括支持NUMA |
Standard |
单处理器机器 |
3.10.2 中断处理
CPU处理的优先级最高的任务之一就是中断。中断可以被一个子系统发起,例如一个网卡。硬中断使CPU停止目前的工作并且执行一个contextswitch,这个操作令CPU必须将缓存清空来执行新的任务(我们可以认为CPU的缓存是一个工作区,当新任务需要被执行时必须清空缓存)。下面两个原则会让中断处理更有效,
·绑定中断到CPU
系统管理员可以将中断和一个或者一组CPU进行绑定(当然这个操作对于一个单CPU系统是没有作用的)。为了改变IRQ的关联,需要进入/proc/irq/%{相应中断号}目录中修改smp_affinity文件的内容,例如讲IRQ19与第三个CPU进行关联,可以使用下面命令服务
·使用物理CPU来处理中断
在SMT系统中,例如支持超线程的Inter XeonCPU,建议绑定中断到物理CPU从而避免中断使用虚拟CPU。在一个开启超线程功能的两路系统中,物理CPU通常被分配较低的CPU编号,CPUID 0和2更可能是物理CPU,而CPU ID1和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系统下的应用都不直接将数据写入磁盘,而是写入由虚拟内存管理器维护的文件系统缓存中,并且最终会刷新数据。当使用IBMServeRAID控制器或者IBMTotalStorage磁盘系统时,你应该尝试减少刷新的次数,有效的增加每个刷新的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
配置kswapddaemon,指定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 设定内核的交换动作
在Linux2.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登陆的大小是可变的。例如,在系统中,一个大页面可能是普通系统的1000倍。这个特性启用了TLB可以映射1000倍的虚拟地址空间在没有TLB缓存失败的情况下。简单的说,这个特性为应用程序提供了一个文件系统接口。