1、修改内核参数的方法RedHat 向管理员提供了非常好的方法,使我们可以在系统运行时更改内核参数,而不需要重新引导系统。这是通过/proc 虚拟文件系统实现的。/proc/sys 目录下存放着大多数的内核参数,并且设计成可以在系统运行的同时进行更改。更改方法有两种:方法一: 修改/proc/sys 目录下的相应文件,比如:/proc/sys/net/ipv4/ip_forward,修改后立刻可用,不用重启系统,但重启系统,会恢复到默认值。方法二: 修改/etc/sysctl.conf 文件,该文件中以 (变量=值)的形式设置内核参数,修改后,不能立刻生效,需要执行 /sbin/sysctl p
2、命令,使配置文件生效。注意: /etc/sysctl.conf 和/proc/sys 下的文件其实都对应着一个参数,它们之间的对应关系,有简单规则:将/proc/sys 中的文件转换成 sysctl 中的变量的规则: 1去掉前面部分/proc/sys 2将文件名中的斜杠变为点 这两条规则可以将/proc/sys 中的任一文件名转换成 sysctl 中的变量名。 例如: /proc/sys/net/ipv4/ip_forward net.ipv4.ip_forward /proc/sys/kernel/hostname kernel.hostname 可以使用下面命令查询所有可修改的变量名例子:
3、以打开内核的转发功能。IP 转发是指允许系统对来源和目的地都不是本机的数据包通过网络,RedHat 默认屏蔽此功能,在需要用本机作为路由器、NAT 等情况下需要开启此功能。 方法一:修改/proc 下内核参数文件内容 直接修改内核参数 ip_forward 对应在/proc 下的文件/proc/sys/net/ipv4/ip_forward。用下面命令查看 ip_forward 文件内容: # cat /proc/sys/net/ipv4/ip_forward 该文件默认值 0 是禁止 ip 转发,修改为 1 即开启 ip 转发功能。修改命令如下: # echo 1 /proc/sys/net
4、/ipv4/ip_forward 修改过后就马上生效,即内核已经打开 ip 转发功能。但如果系统重启后则又恢复为默认值0,如果想永久打开需要通过修改/etc/sysctl.conf 文件的内容来实现。 方法二修改/etc/sysctl.conf 文件 默认 sysctl.conf 文件中有一个变量是 net.ipv4.ip_forward = 0将后面值改为 1,然后保存文件。因为每次系统启动时初始化脚本/etc/rc.d/rc.sysinit会读取/etc/sysctl.conf 文件的内容,所以修改后每次系统启动时都会开启 ip 转发功能。但只是修改 sysctl 文件不会马上生效,如果想
5、使修改马上生效可以执行下面的命令: # sysctl p 内核参数列表可以使用下面命令查询所有可修改的变量名 # sysctl a 一、下面例举几个简单的内核参数: 1/proc/sys/kernel/shmmax 该文件指定内核所允许的最大共享内存段的大小。 2/proc/sys/kernel/threads-max 该文件指定内核所能使用的线程的最大数目。 3/proc/sys/kernel/hostname 该文件允许您配置网络主机名。 4/proc/sys/kernel/domainname 该文件允许您配置网络域名二、常用的设备无关启动时参数 1、init. 设置内核执行的初始化进程
6、名,如果该项没有设置,内核会按顺序尝试/etc/init, /bin/init,/sbin/init, /bin/sh,如果所有的都没找到,内核会抛出kernel panic:的错误。 2、nfsaddrs=. 设置从网络启动时 NFS 的启动地址,已字符串的形式给出。 3、nfsroot=. 设置网络启动时的 NFS 根名字,如果该字符串不是以 “/“、“,“、“.“开始,默认指向“/tftp-boot”。 以上 2、3 在无盘站中很有用处。 4、no387 该选项仅当定义了 CONFIG_BUGi386 时才能用,某些 i387 协处理器芯片使用 32 位的保护模式时会有 BUG,比如一些
7、浮点运算,使用这个参数可以让内核忽略 387 协处理器。 5、no-hlt 该选项仅当定义了 CONFIG_BUGi386 时才能用,一些早期的 i486DX-100 芯片在处理“hlt”指令时会有问题,执行该指令后不能可靠的返回操作系统,使用该选项,可以让 linux 系统在 CPU 空闲的时候不要挂起 CPU。 6、root=. 该参数告诉内核启动时使用哪个设备作为根文件系统。比如可以指定根文件为hda8:root=/dev/hda8。 7、ro 和 rw ro 参数告诉内核以只读方式加载根文件系统,以便进行文件系统完整性检查,比如运行fsck;rw 参数告诉内核以读写方式加载根文件系统,
8、这是默认值。 8、reserve=. 保留端口号。格式:reserve=iobase,extent,iobase,extent.,用来保护一定区域的I/O 端口不被设备驱动程序自动探测。在某些机器上,自动探测会失败,或者设备探测错误或者不想让内核初始化设备时会用到该参数;比如:reserve=0x300,32 device=0x300,除 device=0x300 外所有设备驱动不探测 0x300-0x31f 范围的 I/O 端口。 9、mem=. 限制内核使用的内存数量。早期 BIOS 设计为只能识别 64M 以下的内存,如果你的内存数量大于 64M,你可以指明,如果你指明的数量超过了实际安
9、装的内存数量,系统崩溃是迟早的事情。如:mem=0x1000000 意味着有 16M 内存,如果是 mem=0x6000000,就是 96M 内存了。注意:很多机型把部分内存作为 BIOS 的映射,所以你在指定内存大小的时候一定要预留空间。你也可以在 pentium 或者更新的 CPU 上使用 mem=nopentium 关闭 4M 的页表,这要在内核配置时申明。 10、panic=N 默认情况,内核崩溃kernel panic 后会宕机而不会重启,你可以设置宕机多少秒之后重启机器;也可以在/proc/sys/kernel/panic 文件里设置。 11、reboot=warm|cold,bi
10、os|hard 该选项仅当定义了 CONFIG_BUGi386 时才能用。2.0.22 的内核重启默认为cool reboot,warm reboot 更快,使用“reboot=bios“可以继承 bios 的设置。 12、nosmp 和 maxcpus=N 仅当定义了 _SMP_,该选项才可用。可以用来禁用多 CPU 或者指明最多支持的 CPU 个数。三、关于 oracle 的几个内核参数一般在 Linux 上安装设置 Oracle 数据库或者在更换或升级硬件的时候都需要配置Linux 系统的核心参数, 然后才是调整 Oracle 系统参数 。注意: 以下的一些测试可能只适用于 Linux
11、系统,且测试 Linux 系统为 64Bit,32Bit Linux 系统可能有不一样 。测试环境: Linux AS 4.0 U5 64Bit核心版本: 2.6.9-55.ELsmp #1 SMP x86_641. Linux 系统下的核心参数:rootECSDB etc# cat sysctl.conf 或者到 /proc/sys/kernel 下查看。kernel.shmall = 2097152 kernel.shmmax = 2147483648 kernel.shmmni = 4096 # semaphores: semmsl, semmns, semopm, semmni ker
12、nel.sem = 250 32000 100 128 fs.file-max = 65536 net.ipv4.ip_local_port_range = 1024 65000 net.core.rmem_default=262144 net.core.rmem_max=262144 net.core.wmem_default=262144 net.core.wmem_max=262144* 修改 /etc/sysctl.conf 文件之后立刻生效命令 # /sbin/sysctl p2参数说明(1)shmmax:该参数定义了共享内存段的最大尺寸(以字节为单位) 。缺省为 32M,对于ora
13、cle 来说,该缺省值太低了,通常将其设置为 2G。要大于 sga-max-size(2)shmmni:这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096 。通常不需要更改。(3)shmall:该参数表示系统一次可以使用的共享内存总量(以页为单位) 。缺省值就是2097152,通常不需要修改。(4)sem:该参数表示设置的信号量。(5)file-max:该参数表示文件句柄的最大数量。文件句柄设置表示在 linux 系统中可以打开的文件数量。# semaphores: semmsl, semmns, semopm, semmni kernel.sem = 250 32
14、000 100 128 250 是参数 SEMMSL 的值(每个用户拥有信号量最大数),32000 是参数 SEMMNS 的值(系统信号量最大数) , 32 是参数 SEMOPM 的值(每次 semopm 系统调用操作数),128 则是参数 SEMMNI 的值(系统辛苦量集数最大数)用以下的命令可以对上述参数进行修改echo SEMMSL_value SEMMNS_value SEMOPM_value SEMMNI_value semecho e “250 32000 100 128” /proc/sys/kernel/sem 其中 SEMMSL_value、SEMMNS_value 、SEM
15、OPM_value 、SEMMNI_value 分别用相应的值进行替换,并且这些值的顺序不能调换2. 参数调整 kernel.shmmaxSHMMAX Available physical memory Defines the maximum allowable sizeof one shared memory segment. The SHMMAX setting should be large enoughto hold the entire SGA in one shared memory segment. A low setting cancause creation of multi
16、ple shared memory segments which may lead toperformance degradation.Shmmax 是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值,shmmax 设置应该足够大,能在一个共享内存段下容纳下整个的 SGA ,设置的过低可能会导致需要创建多个共享内存段,这样可能导致系统性能的下降 。Steve Adams 在他的小册子中说过,在实例启动以及 Server Process 创建的时候,多个小的共享内存段可能会导致当时轻微的系统性能的降低(在启动的时候 需要去创建多个虚拟地址段,在进程创建的时候要让进程对多个段进行“识别”
17、,会有一些影响),但是其他时候都不会有影响。这意味着如果你的程序不是经常 Create Processes(以及 Destroy Them),性能方面就不是考虑的问题。当然 Oralce 的建议是希望一个大的共享内存段能容纳整个 SGA,这样在任何时候都不会有甚至轻微的性能下降的隐患。Oracle 安装文档建议 32Bit Linux 系统设置 shmmax 为 32Bit 最大的限制值(setting shmmax to the 32-bit number limit),也就是 4G 。所以一般来说,1-4G 的物理内存,可以直接设置 shmmax 为最大物理内存即可,那么 SGA 肯定在一
18、个共享内存段中,32Bit Linux 系统物理内存大于 4G 的设置为 4G 即可 。总之,一般设置 shmmax =SGA (32Bit 系统是否支持到 1.7G 以上 SGA 需要注意) 。如果是 64Bit 的 Linux 操作系统,shmmax 设置为大于 SGA_MAX_SIZE 即可。(仅供参考) 设置共享内存大小,共享内存大小一般设为物理内存的一半,在这里我们假设物理内存 256M 则共享内存为 134217728, (算法:256/2=shmmaxk*1024=shmmaxk(k)*1024=shmmaxk(byte))echo 134217728 /proc/sys/ker
19、nel/shmmaxipcs -sa 可以看到共享内存段个数kernel.shmallkernel.shmall 参数是控制共享内存页数 。Linux 共享内存页大小为 4KB, 共享内存段的大小都是共享内存页大小的整数倍。一个共享内存段的最大大小是 16G,那么需要共享内存页数是 16GB/4KB=16777216KB/4KB=4194304 (页),也就是 64Bit 系统下16GB 物理内存,设置 kernel.shmall = 4194304 才符合要求(几乎是原来设置 2097152的两倍)。这时可以将 shmmax 参数调整到 16G 了,同时可以修改 SGA_MAX_SIZE 和
20、SGA_TARGET 为 12G(您想设置的 SGA 最大大小,当然也可以是 2G14G 等,还要协调 PGA参数及 OS 等其他内存使用,不能设置太满,比如 16G)。kernel.shmmnishmmni 内核参数是共享内存段的最大数量(注意这个参数不是 shmmin,是shmmni, shmmin 表示内存段最小大小 ) 。shmmni 缺省值 4096 ,一般肯定是够用了 三、与磁盘 IO 子系统有关1、编辑 /proc/sys/vm/dirty_ratio: 控制文件系统的写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数据 。
21、增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能 。但是,当你需要持续、恒定的写入场合时,应该降低其数值,一般启动上缺省是 10。下面是增大的方法:echo 40 /proc/sys/vm/dirty_ratio2、编辑 /proc/sys/vm/dirty_background_ratio:控文件系统的 pdflush 进程,在何时刷新磁盘。单位是百分比,表示系统内存的百分比,意思是当写缓冲使用到系统内存多少的时候,pdflush 开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值,一
22、般启动上缺省是 5。下面是增大的方法:echo 20 /proc/sys/vm/dirty_background_ratio3 编辑 /proc/sys/vm/dirty_writeback_centisecs : 控制内核的脏数据刷新进程 pdflush 的运行间隔。单位是 1/100 秒。缺省数值是 500,也就是 5 秒。如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成多次写操作。设置 方法如下:echo “200“ /proc/sys/vm/dirty_writeback_centisecs如果你的系统是短期地尖峰式的写操作,并且写入数据不大
23、(几十 M/次)且内存有比较多富裕,那么应该增大此数值:echo “1000“ /proc/sys/vm/dirty_writeback_centisecs4、 编辑 /proc/sys/vm/dirty_expire_centisecs :声明 Linux 内核写缓冲区里面的数据多“旧”了之后,pdflush 进程就开始考虑写到磁盘中去。单位是 1/100 秒。缺省是 30000,也就是 30 秒的数据就算旧了,将会刷新磁盘。对于特别重载的写操作来说,这个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致 IO 提高太快。建议设置为 1500,也就是 15 秒算旧。echo “150
24、0“ /proc/sys/vm/dirty_expire_centisecs当然,如果你的系统内存比较大,并且写入模式是间歇式的,并且每次写入的数据不大(比如几十 M) ,那么这个值还是大些的好。四、与网络有关的参数设置5、编辑 /proc/sys/net/ipv4/tcp_retrans_collapse : 控制 TCP 双方 Window 协商出现错误的时候的一些重传的行为。但是在老的 2.6 的核( /proc/sys/net/ipv4/tcp_retrans_collapse6、 编辑 提高 Linux 应对短连接的负载 能力在存在大量短连接的情况下,Linux 的 TCP栈一般都会
25、生成大量的 TIME_WAIT 状态的 socket。你可以用下面的命令 看到:netstat -ant| grep -i time_wait 有时候,这个数目是惊人的:netstat -ant|grep -i time_wait |wc -l可能会超过三四万。这个时候,我们需要修改 linux kernel 的 tcp time wait 的时间,缩短之,有个 sysctl 参数貌似可以使用,它是 /proc/sys/net/ipv4/tcp_fin_timeout,缺省值是60,也就是 60 秒,很多网上的资料都说将这个数值设置低一些就可以减少 netstat 里面的TIME_WAIT 状
26、态,但是这个说法是错误的。经过认真阅读 Linux 的内核源代码,我们发现这个数值其实是输出用的,修改之后并没有真正的读回内核中进行使用,而内核中真正管用的是一个宏定义,在 $KERNEL/include/net/tcp.h 里面,有下面的行:#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAITstate, about 60 seconds*/而这个宏是真正控制 TCP TIME_WAIT 状态的超时时间的。如果我们希望减少 TIME_WAIT 状态的数目(从而节省一点点内核操作时间) ,那么可以把这
27、个数值设置低一些,根据我们的测试,设置为 10 秒比较合适,也就是把上面的修改为:#define TCP_TIMEWAIT_LEN (10*HZ) /* how long to wait to destroy TIME-WAIT* state, about 60 seconds*/然后重新编译 内核,重启系统即可发现短连接造成的 TIME_WAIT 状态大大减少:netstat -ant | grep -i time_wait |wc -l一般情况都可以至少减少 2/3。也能相应提高系统应对短连接的速度。7、 编辑 /proc/irq/number/smp_affinity 在多 CPU 的环
28、境中,还有一个中断平衡的问题,比如,网卡中断会教给哪个 CPU 处理,这个参数控制哪些 CPU 可以绑定 IRQ 中断。其中的 number 是对应设备的中断编号,可以用下面的命令找出:cat /proc/interrupt比如,一般 eth0 的 IRQ 编号是 16,所以控制 eth0 中断绑定的 /proc 文件名是 /proc/irq/16/smp_affinity。上面这个命令还可以看到某些中断对应的 CPU 处理的次数,缺省的时候肯定是不平衡的。设置其值的方法很简单,smp_affinity 自身是一个位掩码(bitmask ) ,特定的位对应特定的 CPU,这样, 01 就意味着
29、只有第一个 CPU 可以处理对应的中断,而 0f(0x1111)意味着四个 CPU 都会参与中断处理。几乎所有外设都有这个参数设置,可以关注一下。这个数值的推荐设置,其实在很大程度上,让专门的 CPU 处理专门的中断是效率最高的,比如,给磁盘 IO 一个 CPU,给网卡一个 CPU,这样是比较合理的。3. Oracle 下需要做调整的参数SGA_MAX_SIZESGA_TARGETDB_CACHE_SIZESGA_MAX_SZIE 为实例允许使用的 sga 上限,一个静态参数,是不能动态修改的.SGA_TARGET 为 10g 推出的 sga 自动管理的参数,动态参数,可以动态修改.sga_m
30、ax_size 与 SGA 各组件大小的关系设置的 sga_max_size 小于实际的 SGA 中各个 pool 的尺寸总和的大小,那么sga_max_size 的值会被 oracle 自动以实际的 SGA 的总尺寸代替。如果不设置sga_max_size ,oracle 会自动的以实际的 SGA 的总尺寸来设置 sga_max_size 的值。设置 sga_max_size 的值为大于 SGA 中各个 pool 的尺寸总和的值:但是sga_max_size 的值相对于所有可用的物理内存来说,是一个合理的值。sga_max_size的实际的值和 pfile 中的 sga_max_size 指
31、定的值是一样的。 在 Oracle 10g 中引入了一个非常重要的参数:SGA_TARGET,这也是 Oracle 10g的一个新特性。自动共享内存管理(Automatic Shared Memory Management ASMM),控制这一特性的,就仅仅是这个参数 SGA_TARGE。设置这个参数后,你就不需要为每个内存区来指定大小了。SGA_TARGET 指定了 SGA 可以使用的最大内存大小,而 SGA 中各个内存的大小由 Oracle 自行控制,不需要人为指定。Oracle 可以随时调节各个区域的大小,使之达到系统性能最佳状态的个最合理大小,并且控制他们之和在 SGA_TARGET
32、指定的值之内。一旦给 SGA_TARGET 指定值后(默认为 0,即没有启动 ASMM),就自动启动了ASMM特性。10g 下设置 SGA_TARGET 之后启动 ASSM 特性之后, 只有以下的这些区的内存大小动态共享起来:* Buffer cache (DB_CACHE_SIZE)* Shared pool (SHARED_POOL_SIZE)* Large pool (LARGE_POOL_SIZE)* Java pool (JAVA_POOL_SIZE)* Streams pool (STREAMS_POOL_SIZE)而 SGA 中的其他区域的内存大小仍然是固定不共享的。它的含义和
33、SGA_MAX_SIZE 的一样,也表示 SGA 最大的大小,于是它也就有了一个限制,那就是它的大小不能大于 SGA_MAX_SIZE 的大小。Oracle10g 下, SGA_MAX_SIZE 仍然表示 SGA 的大小的上限值,而 SGA_TARGET 是SGA 的所有组件的大小的最大值之和,即当 SGA_TARGET SGA_MAX_SIZE 的时候,oracle就会忽略 SGA_MAX_SIZE 的值,SGA_TARGET 也就成了 SGA 的在此实例中的上限制,它能动态改变大小,但是不能够大于 SGA_MAX_SIZE 的值。有人曾经做过试验,在某些版本中(可能在我的版本之后的版本),
34、当 SGA_TARGET SGA_MAX_SIZE 时,实例重启以后 SGA_MAX_SIZE 就变成 SGA_TARGET 的大小了。在 11g 中,这个 SGA_TARGET 只能设置是等于 SGA_MAX_SIZE 的大小了,设置比它小,oracle 会自动帮你调整,设置比它大,那还是出错。现在可以自己想想,oracle对 SGA_TARGET 的大小处理在往正确的简单的方向前进中。SGA_TARGET 带来一个重要的好处就是,能使 SGA 的利用率达到最佳,从而节省内存成本。因为 ASMM 启动后,Oracle 会自动根据需要调整各个区域的大小,大大减少了某些区域内存紧张,而某些区域又有内存空闲的矛盾情况出现。