当前位置:首页 »数据库»oracle»修改内核参数的方法
修改内核参数的方法
[导读]修改内核参数的方法

修改内核参数的方法

RedHat向管理员提供了非常好的方法,使我们可以在系统运行时更改内核参数,而不需要重新引导系统。这是通过/proc虚拟文件系统实现的。/proc/sys目录下存放着大多数的内核参数,并且设计成可以在系统运行的同时进行更改。
    更改方法有两种:
方法一: 修改/proc/sys目录下的相应文件,比如:/proc/sys/net/ipv4/ip_forward,修改后立刻可用,不用重启系统,但重启系统,会恢复到默认值。
方法二: 修改/etc/sysctl.conf 文件,该文件中以 (变量=值)的形式设置内核参数,修改后,不能立刻生效,需要执行 /sbin/sysctl –p 命令,使配置文件生效。
注意: /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
可以使用下面命令查询所有可修改的变量名
例子:以打开内核的转发功能。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/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文件不会马上生效,如果想使修改马上生效可以执行下面的命令: # 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=...
设置内核执行的初始化进程名,如果该项没有设置,内核会按顺序尝试/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,比如一些浮点运算,使用这个参数可以让内核忽略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、reserve=...
保留端口号。格式:reserve=iobase,extent[,iobase,extent]...,用来保护一定区域的I/O端口不被设备驱动程序自动探测。在某些机器上,自动探测会失败,或者设备探测错误或者不想让内核初始化设备时会用到该参数;比如: reserve=0x300,32  device=0x300,除device=0x300外所有设备驱动不探测 0x300-0x31f范围的I/O端口。
9、mem=...
限制内核使用的内存数量。早期BIOS设计为只能识别64M以下的内存,如果你的内存数量大于64M,你可以指明,如果你指明的数量超过了实际安装的内存数量,系统崩溃是迟早的事情。如: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][,[bios|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 系统,且测试Linux 系统为64Bit,
32Bit Linux 系统可能有不一样 。
测试环境: Linux AS 4.0 U5 64Bit
核心版本: 2.6.9-55.ELsmp #1 SMP x86_64

  1. Linux 系统下的核心参数:
    [root@ECSDB etc]# cat sysctl.conf 或者到 /proc/sys/kernel 下查看。

kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
# semaphores: semmsl, semmns, semopm, semmni
kernel.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 –p

2.参数说明
(1)shmmax:该参数定义了共享内存段最大尺寸(以字节为单位)。缺省为32M,对于oracle来说,该缺省值太低了,通常将其设置为2G。要大于sga-max-size
(2)shmmni:这个内核参数用于设置系统范围内共享内存段最大数量。该参数默认值是 4096 。通常不需要更改。
(3)shmall:该参数表示系统一次可以使用共享内存总量(以页为单位)。缺省值就是2097152,通常不需要修改。
(4)sem:该参数表示设置信号量。
(5)file-max:该参数表示文件句柄最大数量。文件句柄设置表示在linux系统中可以打开文件数量。

# semaphores: semmsl, semmns, semopm, semmni
kernel.sem = 250 32000 100 128

250 是参数SEMMSL的值(每个用户拥有信号量最大数),
32000是参数SEMMNS的值(系统信号量最大数),
32是参数SEMOPM的值(每次semopm系统调用操作数),
128则是参数SEMMNI的值(系统辛苦量集数最大数)
用以下的命令可以对上述参数进行修改
echo SEMMSL_value SEMMNS_value SEMOPM_value SEMMNI_value > sem
echo –e “250 32000 100 128” > /proc/sys/kernel/sem 
其中SEMMSL_value、SEMMNS_value、SEMOPM_value、SEMMNI_value分别用相应的值进行替换,并且这些值的顺序不能调换

  1. 参数调整

Shmmax 是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值
shmmax 设置应该足够大,能在一个共享内存段下容纳下整个的SGA ,设置的过低可能会导致需要创建多个共享内存段,这样可能导致系统性能的下降 。

当然Oralce 的建议是希望一个大的共享内存段能容纳整个SGA,这样在任何时候都不会有甚至轻微的性能下降的隐患。
Oracle 安装文档建议 32Bit Linux 系统设置shmmax 为32Bit 最大的限制值(setting shmmax to the 32-bit number limit),也就是4G 。
 所以一般来说,1-4G 的物理内存,可以直接设置shmmax 为最大物理内存即可,那
么SGA 肯定在一个共享内存段中,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/kernel/shmmax
ipcs -sa 可以看到共享内存段个数
kernel.shmall
kernel.shmall 参数是控制共享内存页数 。Linux 共享内存页大小为4KB, 共享内存段的大小都是共享内存页大小的整数倍。一个共享内存段的最大大小是16G,那么需要共享内存页数是 16GB/4KB=16777216KB/4KB=4194304 (页),也就是64Bit 系统下
16GB 物理内存,设置 kernel.shmall = 4194304 才符合要求(几乎是原来设置2097152
的两倍)。这时可以将shmmax 参数调整到 16G 了,同时可以修改SGA_MAX_SIZE 和
SGA_TARGET 为 12G(您想设置的SGA 最大大小,当然也可以是2G~14G 等,还要协调PGA
参数及OS 等其他内存使用,不能设置太满,比如16G)。
kernel.shmmni
shmmni 内核参数是共享内存段的最大数量(注意这个参数不是 shmmin,是
shmmni, shmmin 表示内存段最小大小 ) 。shmmni 缺省值 4096 ,一般肯定是够用了

三、与磁盘IO子系统有关
1、/proc/sys/vm/dirty_ratio: 控制文件系统的写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数据 。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能 。但是,当你需要持续、恒定的写入场合时,应该降低其数值,一般启动上缺省是10。下面是增大的方法:
  echo '40' > /proc/sys/vm/dirty_ratio

 2、/proc/sys/vm/dirty_background_ratio:控文件系统的pdflush进程,在何时刷新磁盘。单位是百分比,表示系统内存的百分比,意思是当写缓冲使用到系统内存多少的时候,pdflush开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值,一般启动上缺省是 5。下面是增大的方法:
  echo '20' > /proc/sys/vm/dirty_background_ratio

3/proc/sys/vm/dirty_writeback_centisecs :   控制内核的脏数据刷新进程pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,也就是 5 秒。如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成多次写操作。设置 方法如下:
echo "200" > /proc/sys/vm/dirty_writeback_centisecs
如果你的系统是短期地尖峰式的写操作,并且写入数据不大(几十M/次)且内存有比较多富裕,那么应该增大此数值:
echo "1000" > /proc/sys/vm/dirty_writeback_centisecs

4、 /proc/sys/vm/dirty_expire_centisecs :声明Linux内核写缓冲区里面的数据多“旧”了之后,pdflush 进程就开始考虑写到磁盘中去。单位是 1/100秒。缺省是30000,也就是 30秒的数据就算旧了,将会刷新磁盘。对于特别重载的写操作来说,这个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致IO提高太快。建议设置为1500,也就是15秒算旧。
echo "1500" > /proc/sys/vm/dirty_expire_centisecs
当然,如果你的系统内存比较大,并且写入模式是间歇式的,并且每次写入的数据不大(比如几十M),那么这个值还是大些的好。

四、与网络有关的参数设置
5、 /proc/sys/net/ipv4/tcp_retrans_collapse : 控制TCP双方Window协商出现错误的时候的一些重传的行为。但是在老的2.6的核(<2.6.18)里头,这个重传会导致kernel oops,kernel panic,所以,如果出现有tcp_retrans_*样子的kernel panic,可以把这个参数给设置成0:
echo '0' > /proc/sys/net/ipv4/tcp_retrans_collapse

6、 提高Linux应对短连接的负载 能力在存在大量短连接的情况下,Linux的TCP栈一般都会生成大量的 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状态,但是这个说法是错误的。经过认真阅读Linux的内核源代码,我们发现这个数值其实是输出用的,修改之后并没有真正的读回内核中进行使用,而内核中真正管用的是一个宏定义,在 $KERNEL/include/net/tcp.h里面,有下面的行:
#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT
state, about 60 seconds*/
而这个宏是真正控制 TCP  TIME_WAIT 状态的超时时间的。如果我们希望减少 TIME_WAIT 状态的数目(从而节省一点点内核操作时间),那么可以把这个数值设置低一些,根据我们的测试,设置为 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 的环境中,还有一个中断平衡的问题,比如,网卡中断会教给哪个 CPU 处理,这个参数控制哪些 CPU 可以绑定 IRQ 中断。其中的 {number} 是对应设备的中断编号,可以用下面的命令找出:
cat /proc/interrupt
比如,一般 eth0 的 IRQ 编号是 16,所以控制 eth0 中断绑定的 /proc 文件名是 /proc/irq/16/smp_affinity。上面这个命令还可以看到某些中断对应的CPU处理的次数,缺省的时候肯定是不平衡的。
设置其值的方法很简单,smp_affinity 自身是一个位掩码(bitmask),特定的位对应特定的 CPU,这样,01 就意味着只有第一个 CPU 可以处理对应的中断,而 0f(0x1111)意味着四个 CPU 都会参与中断处理。
几乎所有外设都有这个参数设置,可以关注一下。
这个数值的推荐设置,其实在很大程度上,让专门的CPU处理专门的中断是效率最高的,比如,给磁盘IO一个CPU,给网卡一个CPU,这样是比较合理的。

 

3. Oracle 下需要做调整的参数
SGA_MAX_SIZE
SGA_TARGET
DB_CACHE_SIZE

SGA_MAX_SZIE 为实例允许使用的sga 上限,一个静态参数,是不能动态修改的.
SGA_TARGET 为10g 推出的sga 自动管理的参数,动态参数,可以动态修改.
sga_max_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 指定的值是一样的。

在Oracle 10g 中引入了一个非常重要的参数:SGA_TARGET,这也是Oracle 10g
的一个新特性。自动共享内存管理(Automatic Shared Memory Management ASMM),控
制这一特性的,就仅仅是这个参数SGA_TARGE。设置这个参数后,你就不需要为每个内
存区来指定大小了。SGA_TARGET 指定了SGA 可以使用的最大内存大小,而SGA 中各个内
存的大小由Oracle 自行控制,不需要人为指定。Oracle 可以随时调节各个区域的大小,
使之达到系统性能最佳状态的个最合理大小,并且控制他们之和在SGA_TARGET 指定的
值之内。一旦给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 中的其他区域的内存大小仍然是固定不共享的。
它的含义和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 的值。

有人曾经做过试验,在某些版本中(可能在我的版本之后的版本),当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 会自动根据需要调整各个区域的大小,大大减少了
某些区域内存紧张,而某些区域又有内存空闲的矛盾情况出现。

 

  • 上一篇:
  • 下一篇:
  • 【免责声明:本站所发表的文章,大部分来源于各相关媒体或者网络,内容仅供参阅,与本站立场无关。如有不符合事实,或影响到您利益的文章,请及时告知,本站立即删除。谢谢监督。】
    资讯搜索
  •   
  • 资讯导航
  • 推荐资讯
  • 一、.
  • 二、
  • 三、
  • 四、
  • 五、
  • 六、
  • 七、
  • 八、
  • 九、
  • 十、..
  • 图片资讯
    相关资讯
  • 一、.
  • 二、
  • 三、
  • 四、
  • 五、
  • 六、
  • 七、
  • 八、
  • 九、
  • 十、..