---
title: "安装 Oracle 需要调整的内核参数"
date: 2019-10-30T17:58:46+08:00
lastmod: 2019-10-30T17:58:46+08:00
tags: ["oracle"]
categories: ["database"]
---

在**安装**Oracle的时候需要调整**linux**的**内核参数**，但是各参数代表什么含义呢，下面做详细解析。

Linux安装文档中给出的最小值：

```
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 4294967295
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
```

各参数详解：

**kernel.shmmax：**

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

官方建议值：

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: **

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

