目录

一、sysctl简介

二、sysctl命令使用

三、sysctl配置文件/etc/sysctl.conf详解

四、/proc目录简介

五、/proc/sys下内核文件与配置文件sysctl.conf中变量的对应关系

一、sysctl简介

      sysctl 是一个用来在系统运作中查看及调整系统参数的工具。有的sysctl参数只是用来查看目前的系统状况,例如查看目前已开机时间、所使用的操作系统版本、核心名称等等;而有的可以让我们修改参数以调整系统运作的行为,例如网络暂存内存的大小、最大的上线人数等等。

/etc/sysctl.conf就是sysctl的配置文件,而这些可以调整的参数中必须在一开机系统执行其它程序前就设定好,有的可以在开机完后任意调整。同大多数配置文件一样,我们可以对sysctl.conf进行配置来优化系统的性能.

二、sysctl命令使用

[root@www ~]# sysctl --helpusage:  sysctl [-n] [-e] variable ...         sysctl [-n] [-e] [-q] -w variable=value ...         sysctl [-n] [-e] -a         sysctl [-n] [-e] [-q] -p 
   (default /etc/sysctl.conf)         sysctl [-n] [-e] -A

常用参数:

    -w   临时改变某个指定参数的值,如

          sysctl -w net.ipv4.ip_forward=1

    -a   显示所有的系统参数

    -p   从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载

三、sysctl配置文件/etc/sysctl.conf

[root@ElementServer ~]# cat /etc/sysctl.conf|grep -v '^#\|^$'net.ipv4.ip_forward = 0net.ipv4.conf.default.rp_filter = 1net.ipv4.conf.default.accept_source_route = 0kernel.sysrq = 0kernel.core_uses_pid = 1net.ipv4.tcp_syncookies = 1net.bridge.bridge-nf-call-ip6tables = 0net.bridge.bridge-nf-call-iptables = 0net.bridge.bridge-nf-call-arptables = 0kernel.msgmnb = 5368760912kernel.msgmax = 16777216kernel.shmmax = 68719476736kernel.shmall = 4294967296kernel.shmmni = 8192fs.file-max = 6553560

解释一下sysctl.conf文件中参数的意义:

  • net.ipv4.ip_forward = 0

  •     出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包。这通常就是路由器所要实现的功能。

    配置Linux系统的ip转发功能,首先保证硬件连通,然后打开系统的转发功能

  • less /proc/sys/net/ipv4/ip_forward,该文件内容为0,表示禁止数据包转发,1表示允许,将其修改为1。可使用命令echo "1" > /proc/sys/net/ipv4/ip_forward 修改文件内容,重启网络服务或主机后效果不再。若要其自动执行,可在/etc/sysctl.conf中net.ipv4.ip_forward = 1

  • 捉着命令echo "1" > /proc/sys/net/ipv4/ip_forward 写入脚本/etc/rc.d/rc.local

  • 或者 在/etc/sysconfig/network脚本中添加 FORWARD_IPV4="YES"

  • kernel.shmmax

  • 是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值。设置应该足够大,能在一个共享内存段下容纳下整个的 ,设置的过低可能会导致需要创建多个共享内存段,这样可能导致系统性能的下降。至于导致系统下降的主要原因为在实例启动以及ServerProcess创建的时候,多个小的共享内存段可能会导致当时轻微的系统性能的降低(在启动的时候需要去创建多个虚拟地址段,在进程创建的时候要让进程对多个段进行“识别”,会有一些影响),但是其他时候都不会有影响。

  • 官方建议值:

  • 32位linux系统:可取最大值为4GB(4294967296bytes)-1byte,即4294967295。建议值为多于内存的一半,所以如果是32为系统,一般可取值为4294967295。32位系统对大小有限制,所以肯定可以包含在单个共享内存段中。

  • 64位linux系统:可取的最大值为物理内存值-1byte,建议值为多于物理内存的一半,一般取值大于SGA_MAX_SIZE即可,可以取物理内存-1byte。例如,如果为12GB物理内存,可取12*1024*1024*1024-1=12884901887,肯定会包含在单个共享内存段中。 

  • kernel.shmall

  •     该参数控制可以使用的共享内存的总页数。共享内存页大小为4KB,共享内存段的大小都是共享内存页大小的整数倍。一个共享内存段的最大大小是16G,那么需要共享内存页数是16GB/4KB=16777216KB /4KB=4194304(页),也就是64Bit系统下16GB物理内存,设置kernel.shmall = 4194304才符合要求(几乎是原来设置2097152的两倍)。这时可以将shmmax参数调整到16G了,同时可以修改SGA_MAX_SIZE和SGA_TARGET为12G(您想设置的最大大小,当然也可以是2G~14G等,还要协调参数及OS等其他内存使用,不能设置太满,比如16G)

  • kernel.shmmni

  • 该参数是共享内存段的最大数量。shmmni缺省值4096,一般肯定是够用了。

  • fs.file-max

  • 该参数决定了系统中所允许的文件句柄最大数目,文件句柄设置代表linux系统中可以打开的文件的数量。

  • fs.aio-max-nr

  •       此参数限制并发未完成的请求,应该设置避免I/O子系统故障。

  •    推荐值是:1048576 其实它等于 1024*1024 也就是 1024K 个。

  • kernel.sem

  • kernel.sem = 250 32000 100 128为例:

  •        250是参数semmsl的值,表示一个信号量集合中能够包含的信号量最大数目。

  •        32000是参数semmns的值,表示系统内可允许的信号量最大数目。

  •        100是参数semopm的值,表示单个semopm()调用在一个信号量集合上可以执行的操作数量。

  •        128是参数semmni的值,表示系统信号量集合总数。

  • net.ipv4.ip_local_port_range

  •     表示应用程序可使用的IPv4端口范围。

  • net.core.rmem_default

  • 表示套接字接收缓冲区大小的缺省值。

  • net.core.rmem_max

  • 表示套接字接收缓冲区大小的最大值。

  • net.core.wmem_default

  • 表示套接字发送缓冲区大小的缺省值。

  • net.core.wmem_max

  • 表示套接字发送缓冲区大小的最大值

四、/proc目录简介

       大家都知道进程都 是在内存中,而内存中的数据都写入到了/proc/目录中的文件中去了,所以很有必要分析这个文件夹内的内容。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。

1、proc文件系统总览 
       在类Unix系统中体现了一种良好的抽象哲学,就是几乎所有的数据实体都被抽象成一个统一的接口--文件来看待,这样我们就可以用一些简单的基本工具完成大量复杂的操作。

在Linux中存在着一类特殊的伪文件系统,用于使用与文件接口统一的操作来完成各种功能,例如ptyfs、devfs、sysfs和procfs。而procfs就是其中应用最广泛的一种伪文件系统。 
      procfs是Linux内核信息的抽象文件接口,大量内核中的信息以及可调参数都被作为常规文件映射到一个目录树中,这样我们就可以简单直接的通过echo或cat这样的文件操作命令对系统信息进行查取和调整了。同时procfs也提供了一个接口,使得我们自己的内核模块或用户态程序可以通过procfs进行参数的传递。在当今的Linux系统中,大量的系统工具也通过procfs获取内核参数,例如ps、lspci等等,没有procfs它们将可能不能正常工作。 
procfs的使用如同常规的文件系统一样,例如加载一个procfs (首先确定你的内核已经支持procfs默认如此): 
# mount -t proc none /proc 
也可以在/etc/fstab中加入如下一行使系统在启动时自动加载procfs(大多数系统中也是默认如此): 
none /proc proc defaults 0 0 
在proc文件系统中,主要包含三大类内容,进程相关部分,系统信息部分,以及系统子系统部分

在下面我们可以看到一个典型的procfs布局: 

[root@www ~]# ls /proc1     1230  147  2198   283  41   750        cpuinfo      ipmi        misc          slabinfo       vmstat10    1238  148  22     284  42   8          crypto       irq         modules       softirqs       zoneinfo1007  1249  15   2265   29   5    8958       devices      kallsyms    mounts        stat1037  1262  156  22958  293  586  9          diskstats    kcore       mpt           swaps1046  1264  157  22966  3    6    9271       dma          keys        mtd           sys1047  1266  158  23     30   7    935        driver       key-users   mtrr          sysrq-trigger1076  1268  16   23062  31   705  951        execdomains  kmsg        net           sysvipc1091  1271  17   23215  32   706  acpi       fb           kpagecount  pagetypeinfo  timer_list11    1273  18   24     33   707  asound     filesystems  kpageflags  partitions    timer_stats1110  1274  19   25     369  708  buddyinfo  fs           loadavg     sched_debug   tty1198  1275  2    26     38   709  bus        interrupts   locks       schedstat     uptime12    13    20   27     39   710  cgroups    iomem        mdstat      scsi          version1222  14    21   28     4    72   cmdline    ioports      meminfo     self          vmallocinfo

在上面中我们可以看到procfs包含的内容: 
* 进程相关部分 (只读) 
      这部分文件都是以数字为名的子目录,这个数字就是相关进程的进程ID,在后面中会详细介绍进程相关子目录的结构和信息。 
需要注意的是procfs中进程子系统部分的一个特殊点,就是/proc/self,它是指向当前执行进程的符号连接,或者说--是指向未来你将要执行指令的心灵感应: 
> cat self/cmdline 
catself/cmdline 
在这个命令中,我们希望它显示当前进程的cmdline参数,它恰恰就显示了当前进程--我们所执行的这条命令,cat self/cmdline。幸好这条指令显示出的信息会忽略空格,导致显示略微的不正常,否则我们倒是可以很容易的使用`cat self/cmdline`这样的命令制造出永远循环执行的进程来。;> 
* 内核信息部分 (只读) 
       这部分文件同样处于/proc的顶层目录,不过它们大部分都是常规、只读的文本文件,可以直接用cat查看信息。作为系统内核执行体的抽象,我们也可以把它看作内核"进程"的信息部分,当然虽然并不存在这个进程实体。这里比较特别的一个文件是 /proc/cmdline : 
>cat cmdline 
ro root=/dev/hda2 
在这个文件中存放的是系统内核引导时的命令行参数。
* 内核各子系统相关部分 (部分可调) 
      这部分是系统内核参数调整的重头戏,在procfs中,除去上面所述的两部分内容外,还有很大一部分信息文件被存放在了一些并非以数字命名的特殊目录中,这些目录下的信息就是内核各个重要子系统的信息和可调参数,

主要有: 
bus 总线信息(只读) 
drivers 驱动信息(只读) 
fs 文件系统特别信息(只读) 
ide IDE接口信息(只读) 
irq IRQ信息(只读) 
net 网络子系统信息(只读) 
scsi SCSI系统信息(只读) 
sysvipc IPC子系统信息(只读) 
tty tty子系统信息(只读) 
sys 系统内核可调参数 (可调) 

作为Linux系统内核参数的抽象文件接口,Linux内核的大部分默认可调参数都被放在了 /proc/sys目录下,这些参数都以常规文件的形式体现,并且可以用echo/cat等文件操作命令进行调整,调整的效果是即时的,并且在系统运行的整个生命周期之间都有效(直到再次改变它们或者系统重启)。 
当然Linux也提供了另外一种途径sysctl来调整这些参数,sysctl是从BSD系统继承而来的一种系统参数动态调整方法,sysctl的使用更为简单,并且可以使用/etc/sysctl.conf保存配置以在下次启动时自动加载这些设置

     在/proc/sys目录下存放着大多数的内核参数,并且设计成可以在系统运行的同时进行更改, 可以通过更改/proc/sys中内核参数对应的文件达到修改内核参数的目的(修改过后,保存配置文件就马上自动生效),不过重新启动机器后之前修改的参数值会失效,所以只能是一种临时参数变更方案(适合调试内核参数优化值的时候使用,如果设置值有问题,重启服务器还原原来的设置参数值了。简单方便。)

      但是如果调试内核参数优化值结束后,需要永久保存参数值,就要通过修改/etc/sysctl.conf内的内核参数来永久保存更改。但只是修改sysctl文件内的参数值,确认保存修改文件后,设定的参数值并不会马上生效,如果想使参数值修改马上生效,并且不重启服务器,可以执行下面的命令:

#sysctl –p 

五、/proc/sys下内核文件与配置文件sysctl.conf中变量的对应关系

由于可以修改的内核参数都在/proc/sys目录下,所以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

可以使用下面命令查询所有可修改的变量名

# sysctl –a