Linux设置内核参数的方法

Linux设置内核参数的方法

1 内核参数的查看方法

使用“sysctl -a”命令可以查看所有正在使用的内核参数。内核参数比较多(一般多达500项),按照前缀主要分为以下几大类:net.ipv4、net.ipv6、net.core、vm、fs、dev.parport、dev.cdrom 、dev.raid、kernel等等。相同的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  文件设置的方式

更改的内核参数默认保存在/etc/sysctl.conf文件中。修改的时候可以直接用vi编辑sysctl.conf文件,增加要修改的内核参数内容,修改的格式为:参数名=值。例如,把net.ipv4.ip_forward的值修改为1,在sysctl.conf中增加下面这行内容:

net.ipv4.ip_forward=1

文件修改好后,进行保存。然后使用“sysctl -p 配置文件名”来使配置生效,如果配置文件是默认的,可以不用输配置文件名,即使用“sysctl -p”。

通过文件设置的方式修改的内核参数是在系统重启后将失效(我之前认为修改后的内核参数放在文件中,系统启动的时候会读这个文件,重启后设置应该不会失效。但经过验证,一般会失效,但如果把将默认的boot.sysctl服务打开,所以系统启动时就会执行这个文件的设置)。把我们修改参数的命令写入启动执行脚本文件里/etc/rc.local,这样系统重启后配置就不会失效。

文件方式的好处是内核参数设置的值可以用文件保留下来,调用“sysctl -p”可以使文件中的所有配置的值马上生效。

3 内核参数设置的实际应用

3.1  文件和网络类参数

我们一般需要关注的文件类的内核参数有fs.file-max和file-nr。fs.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

  如果设置值太小, 修改文件/etc/sysctl.conf的变量到合适的值。

2、在/etc/security/limits.conf文件中设置最大打开文件数, 下面是一行提示:

   #         添加如下这行。

   * - nofile 2048

这行设置了每个用户的默认打开文件数为2048。 注意"nofile"项有两个可能的限制措施。就是项下的hard和soft。要使修改过的最大打开文件数生效,必须对这两种限制进行设定。如果使用"-"字符设定, 则hard和soft设定会同时被设定。硬限制表明soft限制中所能设定的最大值。soft限制指的是当前系统生效的设置值。hard限制值可以被普通用户降低。但是不能增加。soft限制不能设置的比hard限制更高。只有root用户才能够增加hard限制值。

3、使用“ulimit -n 2048”来限制用户的最大文件打开数为2048。ulimit -n对非root用户有限制,对root用户则没有限制,能享受到整个系统可以同时打开的文件数的好处。

设置句柄数量后,系统重启后,又会恢复默认值。如果想永久保存下来,可以修改.bash_profile文件,把上面命令加到最后。

3.2  平台内核参数

平台在安装的过程中,会调用一个专门的shell来负责系统内核参数的设置。这个shell是checkkernel,在平台上/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。      通过

检查完成。此次检查的总体结果为: 通过

下面对上面涉及到的内核参数进行说明。

shmmax:共享内存段的最大字节数,建议设大点,甚至可以大过物理内存的字节数。该参数定义了共享内存段的最大尺寸(以字节为单位)。缺省为32M,对于oracle来说,该缺省值太低了,通常将其设置为2G。

shmmin:共享内存段的最小尺寸。这个参数的设置一般不会出问题。

shmmni:共享内存段的最大数目。这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是4096 。通常不需要更改。

shmseg:每个进程可分配的最大共享内存段数目

shmall:最大的并发共享内存段数目,比SGA还要大。该参数表示系统一次可以使用的共享内存总量(以页为单位,一个页大小为4KB)。缺省值就是2097152,通常不需要修改。

sem:是semaphores的缩写,该参数表示设置的信号量。它包含四个值:semmsl、semmns、semopm、semmni。


suse11lwb:~ # sysctl -a|grep sem

kernel.sem = 250        32000   100     128

semmns:信号灯的最大数量,跟ORACLE的PROCESS数有关。SEMMSL * SEMMNI

semopm:系统调用允许的信号量最大个数。至少100;或者等于SEMMSL

semmni:系统信号量set最大个数。最少128

semmsl:每个信号灯集合中最多的信号灯数目。最小250;对于processes参数设置较大的系统建议设置为processes+10。

msgmni:指定消息队列标识的最大数目。缺省设置:16

msgmax:从一个进程发送到另一个进程的消息的最大长度。进程间的消息传递是在内核的内存中进行,不会交换到磁盘上,所以如果增加该值,则将增加操作系统所使用的内存数量。缺省设置:8192

msgmnb:一个消息队列中最大的字节数。缺省设置:16384

optmem_max:每个socket的最大缓存大小

rmem_default:接收socket的缺省缓存大小(字节)

rmem_max:接收socket的最大缓存大小(字节)

wmem_default:发送的socket缺省缓存大小(字节)

wmem_max:发送的socket最大缓存大小(字节)

p_local_port_range:表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10000到65000。(注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口!

file-max:表示文件句柄的最大数量。文件句柄设置表示在linux系统中可以打开的文件数量。如果设置过小,Oracle将无法启动,或运行不正常。

时间: 2024-08-29 10:13:59

Linux设置内核参数的方法的相关文章

(转)linux IO 内核参数调优 之 参数调节和场景分析

1. pdflush刷新脏数据条件 (linux IO 内核参数调优 之 原理和参数介绍)上一章节讲述了IO内核调优介个重要参数参数. 总结可知cached中的脏数据满足如下几个条件中一个或者多个的时候就会被pdflush刷新到磁盘: (1)数据存在的时间超过了dirty_expire_centisecs(默认30s)时间 (2)脏数据所占内存 /(MemFree + Cached - Mapped) > dirty_background_ratio.也就是说当脏数据所占用的内存占(MemFre

[记录]优化Linux 的内核参数来提高服务器并发处理能力

优化Linux 的内核参数来提高服务器并发处理能力PS:在服务器硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题.要提高Linux 系统下的负载能力,可以使用nginx 等原生并发处理能力就很强的web 服务器,如果使用Apache 的可以启用其Worker 模式,来提高其并发处理能力.除此之外,在考虑节省成本的情况下,可以修改Linux 的内核相关TCP 参数,来最大的提高服务器性能.当然,最基础的提高负载问题,还是升级服务器硬件了,这是

javascript:设置URL参数的方法,适合多条件查询

适用场景:多条件查询情况,如下图所示: 通过设置URL参数,再结合数据源控件设置的RUL参数,就能进行简单的多条件查询了. javascript函数: <mce:script type="text/javascript"><!-- //设置URL参数的方法 function setParmsValue(parms, parmsValue) { var urlstrings = document.URL; var args = GetUrlParms(); var va

安装ORACLE时在Linux上设置内核参数的含义

转自:http://www.blogjava.net/tbwshc/archive/2012/09/13/387652.htmlhttp://blog.csdn.net/wuweilong/article/details/7420310 安装Oracle之前,除了检查操作系统的硬件和软件是否满足安装需要之外,一个重点就是修改内核参数,其中最主要的是和内存相关的参数设置. SHMMAX参数:Linux进程可以分配的单独共享内存段的最大值.一般设置为内存总大小的一半.这个值的设置应该大于SGA_MA

Linux服务器内核参数优化

Linux内核参数调优主要是通过修改/proc伪文件系统和/etc/sysctl.conf配置文件的参数来实现的. /proc目录结构如下: /proc/driver        与驱动器相关的信息 /proc/fs            文件系统参数 /proc/net           网络信息 /proc/pid           每个进程的信息 /proc/sys           内核参数 /proc/scsi          与scsi相关的信息 /proc/sys/ker

Linux 系统调整内核参数

调整系统内核参数 内核优化:Linux系统(内核 + shell + 应用程序)       针对业务服务应用而进行的系统内核参数调整(主要是/etc/sysctl.conf文件) 1. vim /etc/sysctl.conf 2. sysctl -p 修改的参数生效 另:sysctl.conf下文件的默认参数在: /proc/sys/net/ipv4/tcp_fin_timeout [更多参考]:http://oldboy.blog.51cto.com/2561410/1184228附:禁止

linux IO 内核参数调优 之 原理和参数介绍

1.  page cache linux操作系统默认情况下写都是有写缓存的,可以使用direct IO方式绕过操作系统的写缓存.当你写一串数据时,系统会开辟一块内存区域缓存这些数据,这块区域就是我们常说的page cache(操作系统的页缓存).查看系统内存常用的命令有:vmstat.free.top等. 可以使用 cat /proc/meminfo 查看详细的内存使用情况 其中的Cached为140M左右(page cache).注意其中有一个Dirty: 24KB,表示当前有24KB的数据缓

【linux之内核参数调优】

调优1 调优2 调优3 vm.swappiness = 10net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_fin_timeout = 30net.ipv4.tcp_keepalive_time = 1200net.ipv4.ip_local_port_range = 1024 65000net.ipv4.tcp_max_tw_buckets = 5000net

js 自定义方法 设置可选参数的方法

原链接 http://www.cnblogs.com/RightDear/p/3156652.html PHP有个很方便的用法是在定义函数时可以直接给参数设默认值,如: function simue ($a=1,$b=2){ return $a+$b; } echo simue(); //输出3 echo simue(10); //输出12 echo simue(10,20); //输出30 但js却不能这么定义,如果写function simue(a=1,b=2){}会提示缺少对象. js函数