Linux设置内核参数的方法
1 内核参数的查看方法
使用“sysctl -a”命令可以查看所有正在使用的内核参数。内核参数比较多(一般多达500项),按照前缀主要分为以下几大类:net.ipv4net.ipv6vmfsdev.parportdev.cdrom dev.raidkernel等等。相同的linux,安装的组件和使用的方式不一样,正在使用的内核参数是不一样的。
所有的内核参数的说明文档是放到/usr/src/linux/Documentation/sysctl中的,如果想知道对内核参数的说明,可以到该目录下查看相应的说明文档。
2 内核参数的的设置方法
由于Linux的内核参数信息都存在内存中,因此可以通过命令直接修改,并且修改后直接生效。也可以通过文件的方式进行设置。下面就介绍这两种修改方法。
2.1 命令设置的方式
可以用两种方法实现。
1、使用“sysctl -w 参数名=值”的方式
假设我们把net.ipv4.ip_forward的值修改为1,使用命令“sysctl -w net.ipv4.ip_forward=1”。
2、修改内核参数对应的proc文件
内核参数位于/proc/sys/之下,参数名称是以文件所在的路径,并将“/”以“.”来取代。举例来说,/proc/sys/net/ip_forward的参数名称为net.ipv4.ip_forward
同样把net.ipv4.ip_forward的值修改为1,使用命令“echo 1 > /proc/sys/net/ipv4/ip_forward”。
注意,这里proc文件跟普通的文件不一样。一般一个文件用echo写入内容之后,会变成一个文本文件,但echo修改proc文件之后还是个空文件。
2.2 文件设置的方式
更改的内核参数默认保存在/f文件中。修改的时候可以直接用vi编辑f文件,增加要修改的内核参数内容,修改的格式为:参数名=值。例如,把net.ipv4.ip_forward的值修改为1,在f中增加下面这行内容:
net.ipv4.ip_forward=1
文件修改好后,进行保存。然后使用“sysctl -p 配置文件名”来使配置生效,如果配置文件是默认的,可以不用输配置文件名,即使用“sysctl -p”。
通过文件设置的方式修改的内核参数是在系统重启后将失效(我之前认为修改后的内核参数放在文件中,系统启动的时候会读这个文件,重启后设置应该不会失效。但经过验证,一般会失效,但如果把将默认的boot.sysctl服务打开,所以系统启动时就会执行这个文件的设置)。把我们修改参数的命令写入启动执行脚本文件里/etc/rc.local,这样系统重启后配置就不会失效。
文件方式的好处是内核参数设置的值可以用文件保留下来,调用“sysctl -p”可以使文件中的所有配置的值马上生效。
3 内核参数设置的实际应用
3.1 文件和网络类参数
我们一般需要关注的文件类的内核参数有fs.file-maxfile-nrfs.file-max是一个系统能申请到的最大文件句柄数;file-nr是只读的,它与file-max相关,仅用于显示已分配文件句柄的数目、已使用文件句柄的数目、文件句柄的最大数目,如下图所示。
suse11lwb:/home/zxin10/steven # sysctl -a|grep fs.file-nr
fs.file-nr = 5152      0      6815744
对于文件句柄的问题,对于要处理很多文件的接口机要注意,系统的文件句柄是否够用。以前短信网管项目就出现过文件句柄的问题,现场是Solaris系统,而家里的测试是在HP-UX进行,由于Solaris默认支持的文件句柄比HP-UX少很多(如下图所示),家里测试没有发现,从而导致故障泄漏到现场。
操作系统名称
默认系统句柄数
Solaris
256
AIX
2000
Suse Linux
1024
HP-UX
2000
NT
10000
下面介绍修改文件句柄限制的方法。
1、按照最大打开文件数量的需求设置内核参数,并且通过检查/proc/sys/fs/file-max文件来确认最大打开文件数已经被正确设置。
  # cat /proc/sys/fs/file-max
  如果设置值太小, 修改文件/f的变量到合适的值。
2、在/etc/f文件中设置最大打开文件数, 下面是一行提示:
  #<domain>   <type> <item>    <value>添加如下这行。
  * - nofile 2048
这行设置了每个用户的默认打开文件数为2048 注意"nofile"项有两个可能的限制措施。就是<type>项下的hardsoft。要使修改过的最大打开文件数生效,必须对这两种限制进行设定。如果使用"-"字符设定<type>, hardsoft设定会同时被设定。硬限制表明soft限制中所能设定的最大值。soft限制指的是当前系统生效的设置值。hard限制值可以被普通用户降
低。但是不能增加。soft限制不能设置的比hard限制更高。只有root用户才能够增加hard限制值。
3、使用“ulimit -n 2048”来限制用户的最大文件打开数为2048ulimit -n对非root用户有限制,对root用户则没有限制,能享受到整个系统可以同时打开的文件数的好处。
设置句柄数量后,系统重启后,又会恢复默认值。如果想永久保存下来,可以修改.bash_profile文件,把上面命令加到最后。
3.2 平台内核参数
平台在安装的过程中,会调用一个专门的shell来负责系统内核参数的设置。这个shellcheckkernel,在平台上/home/zxin10/bin目录下能到。对于Linux,需要关注的是其中的check_linux_kernel函数。下面是涉及到设置内核参数的主要代码,除开设置了平台相关的一些内核参数,另外针对Oracle数据库也进行了相应的设置,大家可以一起分析一下。
> 消息队列的设置
  if ! grep -q "/proc/sys/kernel/shmmax" /etc/rc.d/rc.local
  then
      echo "echo $ShmMaxSizecfg > /proc/sys/kernel/shmmax" >> /etc/rc.d/rc.local
  fi
  if ! grep -q "/proc/sys/kernel/msgmni" /etc/rc.d/rc.local
  then
      echo "echo 300 > /proc/sys/kernel/msgmni" >> /etc/rc.d/rc.local
  fi
  if ! grep -q "/proc/sys/kernel/msgmnb" /etc/rc.d/rc.local
大文件发送
  then
      echo "echo 163840 > /proc/sys/kernel/msgmnb" >> /etc/rc.d/rc.local
  fi
  if ! grep -q "/proc/sys/kernel/msgmax" /etc/rc.d/rc.local
  then
      echo "echo 56383 > /proc/sys/kernel/msgmax" >> /etc/rc.d/rc.local
  fi
 
>> 针对Oralce的一些内核参数的设置
  ## 2007.01.10 add for oracle10g
  if [ "$db_version" = "oracle10g" ]
  then
      if ! grep -q "/proc/sys/net/core/rmem_max" /etc/rc.d/rc.local
      then
          echo "echo \"250    32000    100    128\" >/proc/sys/kernel/sem" >>/etc/rc.d/rc.local
          echo "echo \"1024    65000\" >/proc/sys/net/ipv4/ip_local_port_range" >>/etc/rc.d/rc.local
          echo "echo 1048576 >/proc/sys/net/core/rmem_max" >>/etc/rc.d/rc.local
          echo "echo 1048576 >/proc/sys/net/core/rmem_default" >>/etc/rc.d/rc.local
          echo "echo 262144  >/proc/sys/net/core/wmem_max" >>/etc/rc.d/rc.local
          echo "echo 262144  >/proc/sys/net/core/wmem_default" >>/etc/rc.d/rc.local
      fi     
  fi
 
下面是网上一篇redhat linux as 4.7 静默安装 oracle 10g的过程中涉及到内核参数设置的部分,跟上面平台设置的内容大致相同。
检查内核参数
正在检查 semmsl=250; 已发现 semmsl=250        通过
正在检查 semmns=32000; 已发现 semmns=32000    通过
正在检查 semopm=100; 已发现 semopm=100        通过
正在检查 semmni=128; 已发现 semmni=128        通过
正在检查 shmmax=536870912; 已发现 shmmax=2147483648  通过
正在检查 shmmni=4096; 已发现 shmmni=4096      通过
正在检查 shmall=2097152; 已发现 shmall=2097152        通过
正在检查 file-max=65536; 已发现 file-max=65536        通过
正在检查 VERSION=2.6.9; 已发现 VERSION=2.6.9-78.EL    通过
正在检查 ip_local_port_range=1024 - 65000; 已发现 ip_local_port_range=1024 - 65000    通过
正在检查 rmem_default=262144; 已发现 rmem_default=1048576    通过
正在检查 rmem_max=262144; 已发现 rmem_max=1048576    通过
正在检查 wmem_default=262144; 已发现 wmem_default=262144      通过
正在检查 wmem_max=262144; 已发现 wmem_max=262144      通过
检查完成。此次检查的总体结果为: 通过