内核参数调优
kernel.shmmax、kernel.shmall 和 kernel.shmmni 设置
kernel.shmmax
是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值。设置应该足够大,能在一个共享内存段下容纳下整个的 SGA , 设置的过低可能会导致需要创建多个共享内存段,这样可能导致系统性能的下降。至于导致系统下降的主要原因为在实例启动以及 ServerProcess 创建的时候,多个小的共享内存段可能会导致当时轻微的系统性能的降低 ( 在启动的时候需要去创建多个虚拟地址段,在进程创建的时候要让进程对多个段进行“识别”,会有一些影响 ) ,但是其他时候都不会有影响。
官方建议值
32 位 linux 系统
可取最大值为 4GB ( 4294967296bytes ) -1byte ,即 4294967295 。建议值为多于内存的一半,所以如果是 32 为系统,一般可取值为 4294967295 。 32 位系统对 SGA 大小有限制,所以 SGA 肯定可以包含在单个共享内存段中。
64 位 linux 系统
可取的最大值为物理内存值 -1byte ,建议值为多于物理内存的一半,一般取值大于 SGA_MAX_SIZE 即可,可以取物理内存 -1byte 。
- 内存为 12G 时,该值为 1210241024*1024-1 = 12884901887
- 内存为 16G 时,该值为 1610241024*1024-1 = 17179869183
- 内存为 32G 时,该值为 3210241024*1024-1 = 34359738367
- 内存为 64G 时,该值为 6410241024*1024-1 = 68719476735
- 内存为 128G 时,该值为 12810241024*1024-1 = 137438953471
kernel.shmall
该参数表示统一一次可以使用的共享内存总量(以页为单位)。
默认是2097152,通常不需要修改。
该参数控制可以使用的共享内存的总页数。 Linux 共享内存页大小为 4KB, 共享内存段的大小都是共享内存页大小的整数倍。
一个共享内存段的最大大小是 16G ,那么需要共享内存页数是 16GB/4KB==4194304 (页)
- 当内存为 12G 时, kernel.shmall = 3145728
- 当内存为 16G 时, kernel.shmall = 4194304
- 当内次为 32G 时, kernel.shmall = 8388608
- 当内存为 64G 时, kernel.shmall = 16777216
- 当内存为 128G 时, kernel.shmall = 33554432
配置内核参数
/etc/sysctl.conf
fs.aio-max-nr = 1048576
fs.file-max = 6815744
# shmall、shmmax参数要根据实际内存数进行调整,不然安装会有问题,静态安装很容易忽略
# 图形化安装在检测是将会提示
# 官网建议:
kernel.shmall = 2468829
# 官网建议:以字节为单位的物理内存(RAM)大小的一半
kernel.shmmax = 12640407552
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
生效
sysctl -p
-
-w 用此选项来改变一个sysctl设置
- 例:sysctl -w net.ipv4.ip_forward=1
-
-p 载入sysctl配置文件,如-p后未指定路径,则载入 /etc/sysctl.conf
- 例: sysctl -p /etc/sysctl.conf
-
-a 显示所有的系统参数
kernel.shmmni
shmmni 内核参数是共享内存段的最大数量(注意该参数不是shmmin,是shmmni,shmmin 表示内存段最小大小 ) 。shmmni缺省值4096 足够。
shmmax(bytes) = shmmni(page size, default 4k) * shmall (page的个数)
Linux句柄调优之nofile、nr_open、file-max
- file-max Linux打开文件句柄,file-max表示系统级别的能够打开的文件句柄的数量。是对整个系统的限制,并不是针对用户的。
- ulimit -n 控制进程级别能够打开的文件句柄的数量。提供对shell及其启动的进程的可用文件句柄的控制。这是进程级别的。
- ulimit 也并不是想要设多大就多大的。它的大小上限,是由 nr_open 决定的。想要更大,就要修改/ect/sysct.conf 中fs.nr_open的值。
- 一般如果遇到文件句柄达到上限时,会碰到"Too many open files"或者Socket/File: Can’t open so many files等错误。
如何设置
设置进程的句柄个数,常用的方式就有ulimit,但是非常非常不推荐。原因无他,只有在同一个shell中启动的进程,ulimit的设置才会生效。你打开另外一个shell,或者重启机器,ulimit的改动都会丢失。就是下面这种方式:
ulimit -n 1000000
正确的方式,是修改/etc/security/limits.conf文件。比如下面的内容。
root soft nofile 1000000
root hard nofile 1000000
* soft nofile 1000000
* hard nofile 1000000
这个数值,也并不是想要设多大就多大的。它的大小上限,是由nr_open决定的。想要更大,就要修改/ect/sysct.conf 中fs.nr_open的值。
cat /proc/sys/fs/nr_open
1048576
那file-max又该如何修改呢?建议修改/etc/sysctl.conf文件,加入下面内容。足足有6百多万!
fs.file-max = 6553560
当文件数量超出的时候,就会报kernel: VFS: file-max limit 65535 reached的错误。
file-nr
可以查看操作系统当前打开的文件数,可以用作监控
cat /proc/sys/fs/file-nr
这个是一个状态指示的文件,一共三个值:
- 第一个代表全局已经分配的文件描述符数量
- 第二个代表自由的文件描述符(待重新分配的)
- 第三个代表总的文件描述符的数量。
nofile
nofile全称number of open files,最大可打开的文件描述符数量,这个限制是针对用户和进程来说的。
root soft nofile 1000000
root hard nofile 1000000
* soft nofile 1000000
* hard nofile 1000000
全局修改,永久生效,需要重启
总结
file-max是内核可分配的最大文件数,nr_open是单个进程可分配的最大文件数,所以在我们使用ulimit或limits.conf来设置时,如果要超过 nr_open 的值时,需要先增大nr_open值
sysctl -w fs.nr_open=100000000或者直接写入sysctl.conf文件
file-max
执行:
grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}'
可以看到与file-max是相近的;
注意,注意,注意!!!! 设置nofile的hard limit还有一点要注意的就是hard limit不能大于/proc/sys/fs/nr_open,假如hard limit大于nr_open,注销后无法正常登录。可以修改nr_open的值:
- 所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max
- 单个进程打开的文件描述符数不能超过user limit中nofile的soft limit
- nofile的soft limit不能超过其hard limit
- nofile的hard limit不能超过/proc/sys/fs/nr_open