概述
拜读了小Y对ora-7445问题的解读,猛然惊醒发现自己对oracle运行在linux上的资源限制一直是朦朦胧胧的,以此文章督促自己深入了解。
1 limits.conf 和sysctl.conf
安装oracle总是逃不掉在这两个文件中设置参数:sysctl.conf 文件主要针对系统做资源限制。而limit.conf主要针对用户做资源限制,其依赖于PAM机制(插入式认证模块, Pluggable Authentication Modules),设置的限制不能超越操作系统的设置
2 limits.conf 参数说明
1) 格式说明
username|@groupname type resource limit
username|@groupname:设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有用户的限制。
type:
可以指定 soft,hard 和 -,soft 指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。soft 的限制不能比har 限制高。用 - 就表明同时设置了 soft 和 hard 的值。
resource: core - 限制内核文件的大小 date - 最大数据大小 fsize - 最大文件大小 memlock - 最大锁定内存地址空间 nofile - 打开文件的最大数目 rss - 最大持久设置大小 stack - 最大栈大小 cpu - 以分钟为单位的最多 CPU 时间 noproc - 进程的最大数目 as - 地址空间限制 maxlogins - 此用户允许登录的最大数目
2)查询设置:ulimit 命令
(1)只对当前tty(终端有效), (2)ulimit命令本身就有分软硬设置,加-H就是硬,加-S就是软; 命令参数 -H 设置硬件资源限制. -S 设置软件资源限制. -a 显示当前所有的资源限制. -c size:设置core文件的最大值.单位:blocks -d size:设置数据段的最大值.单位:kbytes -f size:设置创建文件的最大值.单位:blocks -l size:设置在内存中锁定进程的最大值.单位:kbytes -m size:设置可以使用的常驻内存的最大值.单位:kbytes -n size:设置内核可以同时打开的文件描述符的最大值.单位:n -p size:设置管道缓冲区的最大值.单位:kbytes -s size:设置堆栈的最大值.单位:kbytes -t size:设置CPU使用时间的最大上限.单位:seconds -v size:设置虚拟内存的最大值.单位:kbytes unlimited 是一个特殊值,用于表示不限制
2 sys.conf 参数说明
/proc/sys目录下存放着大多数内核参数,并且可以在系统运行时进行更改,不过重新启动机器就会失效。/etc/sysctl.conf是一个允许改变正在运行中的Linux系统的接口,它包含一些TCP/IP堆栈和虚拟内存系统的高级选项,修改内核参数永久生效。也就是说/proc/sys下内核文件与配置文件sysctl.conf中变量存在着对应关系。
1)常见配置
1 kernel.shmall=4294967296 2 vm.min_free_kbytes=262144 3 kernel.sem=4096 524288 4096 128 4 fs.file-max=6815744 5 net.ipv4.ip_local_port_range=9000 65500 6 net.core.rmem_default=262144 7 net.core.rmem_max=4194304 8 net.core.wmem_default=262144 9 net.core.wmem_max=1048576 10 fs.aio-max-nr=1048576 11 kernel.shmmni=4096 12 vm.nr_hugepages=8029
2)参数说明
kernel.shmmax: 是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值。设置应该足够大,能在一个共享内存段下容纳下整个的SGA ,设置的过低可能会导致需要创建多个共享内存段,这样可能导致系统性能的下降。至于导致系统下降的主要原因为在实例启动以及ServerProcess创建的时候,多个小的共享内存段可能会导致当时轻微的系统性能的降低(在启动的时候需要去创建多个虚拟地址段,在进程创建的时候要让进程对多个段进行“识别”,会有一些影响),但是其他时候都不会有影响。 官方建议值: 32位Linux系统:可取最大值为4GB(4294967296bytes)-1byte,即4294967295。建议值为多于内存的一半,所以如果是32为系统,一般可取值为4294967295。32位系统对SGA大小有限制,所以SGA肯定可以包含在单个共享内存段中。 64位linux系统:可取的最大值为物理内存值-1byte,建议值为多于物理内存的一半,一般取值大于SGA_MAX_SIZE即可,可以取物理内存-1byte。例如,如果为12GB物理内存,可取12*1024*1024*1024-1=12884901887,SGA肯定会包含在单个共享内存段中。 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缺省值4096,一般肯定是够用了。 fs.file-max: 该参数决定了系统中所允许的文件句柄最大数目,文件句柄设置代表linux系统中可以打开的文件的数量。 fs.aio-max-nr: 此参数限制并发未完成的请求,应该设置避免I/O子系统故障。 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:表示套接字发送缓冲区大小的最大值。 vm.nr_hugepages=8029 大页数