laverne_guo

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在安装oracle,mysql,postgres等多用户并发连接,运行时需要配置大内存。OS配置参考:


1 调整 ulimit
===========================================================
在配置文件 /etc/security/limits.conf 中设置:
#<domain>      <type>    <item>        <value>
*              soft        core           0
*              soft        data           unlimited
*              soft       fsize           unlimited
*              soft         rss           unlimited
*              soft          as           unlimited
参数说明:
core:数据库出现故障时产生 core 文件用于故障诊断,生产系统建议关闭;
data:数据库进程所允许分配的数据内存大小;
fsize:数据库进程所允许寻址的文件大小;
rss:数据库进程所允许的最大 resident set 大小;
as:数据库进程所允许最大虚拟内存寻址空间限制;
在配置文件 /etc/security/limits.d/90-nproc.conf 中设置:
#<domain>      <type>    <item>     <value>
*              soft       nproc      unlimited
参数说明:
nproc:数据库所允许的最大线程数限制;
Note:
1. 每台作为数据库服务器的机器都需要配置;
2. 更改配置后需重新登录使得配置生效。

2 调整内存参数
===========================================================
使用下列命令输出当前 vm 配置,并将其归档保存:
$ cat /proc/sys/vm/swappiness
$ cat /proc/sys/vm/dirty_ratio
$ cat /proc/sys/vm/dirty_background_ratio
$ cat /proc/sys/vm/dirty_expire_centisecs
$ cat /proc/sys/vm/vfs_cache_pressure
$ cat /proc/sys/vm/min_free_kbytes
$ cat /proc/sys/vm/overcommit_memory
$ cat /proc/sys/vm/overcommit_ratio

添加下列参数至 /etc/sysctl.conf 文件调整内核参数:
vm.swappiness = 0
vm.dirty_ratio = 100
vm.dirty_background_ratio = 40
vm.dirty_expire_centisecs = 3000
vm.vfs_cache_pressure = 200
vm.min_free_kbytes = <物理内存大小的8%,单位KB。最大不超过1GB。>
vm.overcommit_memory = 2
vm.overcommit_ratio = 85
Note:
当数据库可用物理内存不足 8GB 时不需使用 vm.swappiness = 0;上述 dirty 类参数只是建议值,具体系统设置时请按原则(控制系统的 flush 进程只采用脏页超时机制刷新脏页,而不采用脏页比例超支刷新脏页)进行设置。

3 调整内核参数
===========================================================
OS的内核参数大多数存放在/proc/sys目录下,可以在系统运行时进行更改,但是当系统重新启动时会失效,而通过/etc/sysctl.conf文件可以永久生效修改后的内核参数。
sysctl -p
该命令可以立即生效sysctl.conf中配置的内核参数。

如下为安装部署时需要配置的内核参数:
cat /etc/sysctl.conf
kernel.shmall 4294967296
kernel.shmmax 270914289664
vm.min_free_kbyte 524288
kernel.sem 4096 524288 4096 128
fs.file-max 6815744
net.ipv4.ip_local_port_range 9000 65500
net.ipv4.ipfrag_low_thresh 31457280
net.ipv4.ipfrag_high_thresh 33554432
net.core.rmem_defaul 262144
net.core.rmem_max 4194304
net.core.wmem_default 262144
net.core.wmem_max 1048576
fs.aio-max-nr 3145728
kernel.shmmni 4096
vm.nr_hugepages 64591

kernel.shmall
shmall表示共享内存总量,以页为单位, 而shmall默认为4294967296 已经足够大了,一般不需要调整,shmall不能低于SGA大小,若shmall低于SGA大小,实例启动时会报:ORA-27123: unable to attach to shared memory segment错误,且无法启动实例。
 
kernel.shmmax
shmmax参数用来定义单个共享内存段的最大值,该值应该配置足够大,能够在一个共享内存段中容下整个的SGA ,如果配置过低可能导致需要创建多个共享内存段,这样可能会导致系统性能下降。
269838450688/1024/1024/1024=252GB。
shmmax的单位为Byte(字节)。
 
vm.min_free_kbytes
该参数表示Linux VM最低保留多少的空闲内存空间,当可用的内存低于配置参数时,系统会进行cache内存的回收,来进行内存的释放。
单位是kb,524288/1024=512M。
 
kernel.sem
sem是semaphores的缩写,进程间通信--信号量,kernel.sem中4个参数分别对应SEMMSL SEMMNS SEMOPM SEMMNI
 
SEMMSL: 每个信号集的最大信号数量 ,一般该参数配置为数据库中最大 PROCESS参数的设置值加上 10, 建议 SEMMSL 不低于100。
 
SEMMNS:控制整个系统中信号量的最大数量,使用以下计算公式来确定系统中需要配置的信号的最大数量,(SEMMSL * SEMMNI)=SEMMNS。4096*128=524288。
 
SEMOPM: 该参数表示在一个 semop call中,每个信号量所允许的最大操作数量,一个信号集可以拥有每个信号集当中的最大数量SEMMSL 信号,建议 SEMOPM 等于SEMMSL 。 建议SEMOPM的值不低于 100 。
 
SEMMNI:该参数用于控制整个系统中信号集的最大数量。建议SEMMNI 的值不低于 100 。
 
fs.file-max
该参数表示系统级别最大可以打开文件句柄的数量,文件句柄代表系统中可以打开文件的数量。
 
net.ipv4.ip_local_port_range
该参数配置向外连接端口范围,缺省为1024到4999。
 
net.ipv4.ipfrag_*
net.ipv4.ipfrag_low_thresh
net.ipv4.ipfrag_high_thresh
系统中当数据包传输发生错误,会进行碎片整理,有效的数据包被保留,而无效的数据包被丢弃,ipfrag参数指定了碎片整理时的最大/最小内存。
 
net.core.rmem_*
net.core.rmem_default默认数据接收窗口大小。
net.core.rmem_max最大数据接收窗口大小。
net.core.wmem_default默认数据发送窗口大小。
net.core.wmem_max最大数据发送窗口大小。
单位均为字节。
 
fs.aio-max-nr
该参数表示最大并发异步I/O请求数量,当系统中存在非常高的I/O请求时,如果该参数配置过低,可能导致数据库报ORA-27090 - Unable to Reserve Kernel Resources for Asynchronous Disk I/O错误,遇到该问题需将fs.aio-max-nr调整为Oracle建议值3145728。
注:Doc ID 579108.1
 
kernel.shmmni
该参数为共享内存段的最大数量,缺省值为4096 ,一般情况下无需调整。
 
vm.nr_hugepages
该参数指定采用大页内存,大页内存数量,单位为个数。

4 调整磁盘调度方式
===========================================================
如果是ssd盘,建议 vm.dirty_expire_centisecs = 1000。
执行如下命令,使配置生效:
$ /sbin/sysctl -p  
ssd盘建议调整预读大小和块层读写请求数:
$ vi /etc/profile
echo 32 >/sys/block/sdj/queue/read_ahead_kb
echo 256 >/sys/block/sdj/queue/nr_requests
Note:
注意上面sdj是ssd盘,需要调整成实际环境中的值,并且每个用到的ssd盘都需要配置上述两项。

5 关闭transparent_hugepage
===========================================================
编辑/etc/rc.local,在第一行 “#!/bin/sh” 的下一行添加如下两行内容:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
执行如下命令,使配置生效:
$ source /etc/rc.local
检查是否成功关闭transparent_hugepage。分别执行如下两条命令,输出结果中都有 “[never]” 则表示成功关闭了transparent_hugepage,如果是 “never” 并且有 “[always]” 或者 “[madvise]” 则关闭失败:
$ cat /sys/kernel/mm/transparent_hugepage/enabled
$ cat /sys/kernel/mm/transparent_hugepage/defrag

6 NUMA的影响
===========================================================
Linux系统默认开启NUMA,NUMA默认的内存分配策略是优先在进程所在CPU节点的本地内存中分配,会导致CPU节点之间内存分配不均衡,比如当某个CPU节点的内存不足时,会导致swap产生,而不是从远程节点分配内存,即使另一个CPU节点上有足够的物理内存。这种内存分配策略的初衷是让内存更接近需要它的进程,但不适合数据库这种大规模内存使用的应用场景,不利于充分利用系统的物理内存。我们建议用户在使用SequoiaDB时关闭NUMA。
关闭NUMA
关闭Linux系统的NUMA的方法主要有两种,一种是通过BIOS禁用NUMA;另一种是通过修改gurb的配置文件。CentOS、SUSE、Ubuntu的grub配置文件有差异,同一款Linux的不同版本配置也略有不同。此处以CentOS6.4(SUSE和CentOS修改方法类似)和Ubuntu12.04为例,介绍通过修改gurb文件的方式关闭NUMA,以供参考。
关闭NUMA的方案:
方案一:建议使用该方案,开机按快捷键进入BIOS设置界面,关闭NUMA,保存设置并重启,再执行后续步骤验证是否成功关闭NUMA。不同品牌的主板或服务器,具体操作略有差异,此处不作详细介绍。
方案二:修改grub的配置文件,关闭NUMA:
对CentOS6.4的grub配置文件修改
以root权限编辑 /etc/grub.conf ,找到"kernel"引导行,该行类似如下(不同的版本内容略有差异,但开头有“kernel /vmlinuz-”):
kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg_centos64001-lv_root rd_NO_LUKS rd_LVM_LV=vg_centos64001/lv_root rd_NO_MD rd_LVM_LV=vg_centos64001/lv_swap crashkernel=128M LANG=zh_CN.UTF-8  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
在kernel行的末尾,空格再添加 “numa=off” ,如果有多个kernel行,则每个kernel行都要添加。
对Ubuntu12.04的grub文件修改
以root权限编辑 /boot/grub/grub.cfg ,找到"linux"引导行,该行类似如下(不同版本内容略有差异,但开头有“linux /boot/vmlinuz-”):
linux   /boot/vmlinuz-3.2.0-31-generic root=UUID=92191cd8-3690-4cd4-9f42-95d392c9d828 ro
在Linux引导行的末尾,空格再添加 “numa=off” ,如果有多个Linux引导行,则每个Linux引导行都要添加。
修改后保存,再重启系统,再执行后续步骤验证是否成功关闭NUMA。
验证NUMA是否成功关闭,shell执行如下命令:
$ numastat
Copy
如果输出结果中只有 node0 ,则表示成功禁用了NUMA,如果有 node1 出现则失败。

posted on 2020-03-30 14:35  laverne_guo  阅读(290)  评论(0编辑  收藏  举报