Chinaunix首页 | 论坛 | 博客
  • 博客访问: 763408
  • 博文数量: 99
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1163
  • 用 户 组: 普通用户
  • 注册时间: 2016-09-22 09:50
个人简介

一个守望数据库的老菜鸟

文章分类

全部博文(99)

文章存档

2019年(21)

2018年(17)

2017年(37)

2016年(24)

我的朋友

分类: LINUX

2017-10-02 19:13:30


博客文章除注明转载外,均为原创。转载请注明出处。
本文链接地址:http://blog.chinaunix.net/uid-31396856-id-5772865.html


 如果Linux内核参数设置不当或者不合理,oracle也会出错,比如
10g中:
SQL> startup;
ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device
11g RAC下报错:
SQL> startup;
ORA-00845: MEMORY_TARGET not supported on this system

本为总结下oracle数据库在linux下相关内核参数的配置


Linux内核参数大致概括为4类:共享内存(shared memory),信号量(semaphores),网络参数(network),文件参数(open files)
1.共享内存

内存查看:
[root@oraserv ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           249        123        125          0          8         74
-/+ buffers/cache:         41        208
Swap:         2000          0       2000
    共享内存是用于进程间通信的一种机制,共享内存可以由指定的多个进程共用,是一种系统资源。共享内存以段的形式分配,段有最大最小,可分配数量有限。

   共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。
  
   所有共享内存块的大小都必须是系统页面大小的整数倍。系统页面大小指的是系统中单个内存页面包含的字节数。在 Linux 系统中,内存页面大小是4KB,不过仍然应该通过调用 getpagesize 获取这个值(单位字节)。

[root@oraserv ~]# getconf PAGE_SIZE
4096

[root@oraserv ~]# ipcs -l
------ Shared Memory Limits --------
max number of segments = 4096                // SHMMNI
max seg size (kbytes) = 4194303                // SHMMAX
max total shared memory (kbytes) = 1073741824        // SHMALL
min seg size (bytes) = 1

------ Semaphore Limits --------
max number of arrays = 128                // SEMMNI
max semaphores per array = 250                // SEMMSL
max semaphores system wide = 32000            // SEMMNS
max ops per semop call = 100                // SEMOPM
semaphore max value = 32767

------ Messages: Limits --------
max queues system wide = 16                // MSGMNI
max size of message (bytes) = 65536            // MSGMAX
default max size of queue (bytes) = 65536        // MSGMNB
 

    Oracle使用共享内存:Oracle实例启动时,执行shmget()系统调用为SGA分配内存,SGA由Oracle的多个进程共享,这部分内存会以共享内存的形式分配。
    涉及SGA的参数是sga_target,sga_max_size,11g中实现memory管理,参数是memory_target,MEMORY_MAX_TARGET


涉及的具体参数如下解释:
(1)kernel.shmmax
kernel.shmmax //该参数定义了共享内存段的最大尺寸(以字节为单位)。
kernel.shmmax ----SHMMAXAvailable physical memory Defines the maximum allowable sizeof one sharedmemory segment. The SHMMAX setting should be largeenoughto hold the entire SGA in one shared memory segment. A low settingcancause creation of multiple shared memory segments which may leadtoperformance degradation.
    Shmmax是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值,shmmax设置应该足够大,能在一个共享内存段下容纳下整个的SGA ,设置的过低可能会导致需要创建多个共享内存段,这样可能导致系统性能的下降。
     SHMMAX仅仅是在共享内存段被创建的时候用来比较的一个数字,当共享内存段被一个进程(Process)创建,操作系统检查是否被要求的共享内存段的值大于 shmmax 的值,如果是,那么将会抛出一个错误。这个时候系统会创建另外的一个或多个共享内存段满足进程的需求。一般来说,共享内存段个数和系统性能没有太直接的关系,也不会对性能产生太大的影响。

查看:
[root@oraserv ~]# cat /etc/sysctl.conf | grep kernel.shmmax
kernel.shmmax = 4294967295
#kernel.shmmax = 2147483648
[root@oraserv ~]# 
[root@oraserv ~]# 
[root@oraserv ~]# ipcs -sa

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x7403d64a 1572864    root      600        4          0                       
0x00000000 1933313    gdm       600        393216     2          dest         
0x7403d649 1540098    root      600        4          0                       

设置:根据sga大小设置,一般为sga_size(g)*1024*1204*1024

修改:
sysctl -w kernel.shmmax=1073741824
echo “kernel.shmmax=1073741824″ >> /etc/sysctl.conf

从缺省文件 /etc/sysctl.conf 中加载sysctl设置生效:sysctl -p

要使更改在每次重新引导之后保留,请执行以下操作:
          * (SUSE Linux) 使 boot.sysctl 处于活动状态。
          * (Red Hat) rc.sysinit 初始化脚本自动读取 /etc/sysctl.conf 文件。

(2)kernel.shmall
       kernel.shmall:是指在任意时刻,系统中可以分配的所有共享内存段的总和的最大值(shmmax是指一个内存段的最大值),参数是控制共享内存页数,以数据页(page)为单位。其设置不少于物理内存除以pagesize;

查看os系统页的大小(单位:字节)
#getconf PAGESIZE
4096

       假设一个共享内存段的最大大小是16G,那么需要共享内存页数是 16GB/4KB=16777216KB/4KB=4194304(页),也就是64Bit 系统下16GB 物理内存,设置 kernel.shmall = 4194304 才符合要求,几乎是原来设置2097152的两倍。

设置:至少页(shmmax/PAGE_SIZE);ORACLE DOC 默认值:2097152*4096=8GB
查看:
$ getconf PAGE_SIZE
4096

[root@oraserv ~]# cat /proc/sys/kernel/shmall
268435456

修改:
# sysctl -w kernel.shmall=2097152
# echo “kernel.shmall=2097152″ >> /etc/sysctl.conf

当前分配情况
[root@oraserv ~]# ipcs -lm

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 4194303
max total shared memory (kbytes) = 1073741824
min seg size (bytes) = 1

(3)kernel.shmmni
   系统可分配的共享内存段最大数量,期值也是可以启动oracle实例的最大数量,默认值是4096

设置:至少4096
查看:cat /proc/sys/kernel/shmmni
# cat /proc/sys/kernel/shmmni
4096

修改:
# sysctl -w kernel.shmmni=4096
# echo “kernel.shmmni=4096″ >> /etc/sysctl.conf

2.信号量
    信号量是一种控制资源访问的方法。
Oracle实例主要是使用信号量来控制共享内存的访问。信号量是基于Processes初始化参数分配,每个Oracle实例启动时都要分配一个信号量的集合,其中的信号量数量至少要等于Processes初始化参数的值,如果不能分配足够的信号量,Oracle实例将不能启动。
    通过sem内核参数来指定各个信号的参数值,如下
kernel.sem = 250 32000 100 128
kernel.sem = 250 32000 100 128
其中,右边四个数值分别是semmsl,semmns,semopm,semmni的值
semmsl,用于指定每个信号量集合中的最大信号量个数,其值或者取其最小值,或者数据库中最大的processes参数设:processes+10,选取其值最大值;
semmns,用于指定整个系统范围内信号量总数的最大值,默认值32000;SEMMSL * SEMMNI;
semopm,用于指定每个semop()系统调用可以设置的信号量操作的最大数量,一个semop()系统调用可以设置多个信号量,推荐取值为100;
semmni,用于指定信号量集合的最大数值,最小值为100,oracle推荐为128

查看信号量设置:cat /proc/sys/kernel/sem
[root@oraserv ~]# cat /proc/sys/kernel/sem
250     32000   100     128

[root@oraserv ~]# ipcs -ls

------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 100
semaphore max value = 32767

   因为semmsl指定了每个信号量集合中的最大信号量个数,而semmni指定信号量集合的最大值,最后系统能够分配的信号量个数取决于semmns与semmni*semmsl的较小值

3.文件参数
file-max:该参数表示文件句柄的最大数量,用于指定每个进程可以打开的最大文件数量。文件句柄设置表示在linux系统中可以打开的文件,oracle数据库文件在运行时候保持打开状态,应该设置为oracle数据库数据文件个数的最大值。推荐为:fs.file-max = 65536
设置:fs.file-max为512 乘以 processes。
如128个process,则file-max=512*128=65536。
cat /proc/sys/fs/file-max

4.网络参数
(1)net.ipv4.ip_local_port_range
   表示用于向外连接的端口范围。缺省情况下,分配给费root用户进程的端口范围:32768到61000
   数据库专用服务器进程启动的时候,会被分配一个IP 端口,用来和用户进程通信。对于用户数很多的数据库,需要修改,一般设置为:1024~65000
net.ipv4.ip_local_port_range = 1024 65000 
一般小于1024的端口保留给root用户启动的进程使用

socket设置数据发送已经接受缓冲区的大小
(2)socket数据缓冲区设置
net.ipv4.tcp_rmem,指定socket数据发送缓冲区的最小值,默认值,最大值
net.ipv4.tcp_wmem,指定socket数据接收缓冲区的最小值,默认值,最大值
oracle推荐设置为:
# net.ipv4.tcp_rmem = 4096 87380 4194304 
# net.ipv4.tcp_wmem = 4096 16384 4194304 
#min:为TCP socket预留用于接收缓冲的内存数量,即使在内存出现紧张情况下tcp socket都至少会有这么多数量的内存用于接收缓冲,默认值为8K。
#default:为TCP socket预留用于接收缓冲的内存数量,默认情况下该值影响其它协议使用的net.core.wmem_default 值。该值决定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win=0默认值情况下,TCP窗口大小为65535。默认值为87380
#max:用于TCP socket接收缓冲的内存最大值。该值不会影响 net.core.wmem_max,"静态"选择参数 SO_SNDBUF则不受该值影响。默认值为 128K。默认值为87380*2 bytes。)
(3)用于设置socket数据发送和接收缓冲区的默认大小和最大大小
# net.core.wmem_default = 8388608    #表示发送套接字缓冲区大小的缺省值(以字节为单位)
# net.core.rmem_default = 8388608    #表示接收套接字缓冲区大小的缺省值(以字节为单位)
# net.core.rmem_max = 16777216    #最大socket读buffer,可参考的优化值:873200
# net.core.wmem_max = 16777216    #最大socket写buffer,可参考的优化值:873200
oracle推荐为:
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_default = 262144
net.core.wmem_max = 262144

(4)补充:连接数查看
在高并发短连接的server端,当server处理完client的请求后立刻closesocket,此时会出现time_wait状态。可以通过命令查看系统当前的连接数统计。
  命令如下: netstat -n | awk '/^tcp/ { ++s[$NF] } END {for (a in s) print a,s[a]}'
  TIME_WAIT属于TCP参数。

5.总结
kernel.shmmax = 4294967295(大于物理内存分配给sga大小)
kernel.shmall = 268435456
kernel.shmmni = 4096
# semaphores: semmsl, semmns, semopm, semmni
kernel.sem = 250 32000 100 128
#fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default=262144
net.core.rmem_max=262144
net.core.wmem_default=262144
net.core.wmem_max=262144


  
6.相关命令
sysctl
ipcs
cat命令
[root@oraserv ~]# cat /proc/sys/fs/file-max
24744
[root@oraserv ~]# cat /proc/sys/kernel/shm*
268435456
4294967295
409
[root@oraserv ~]# cat /proc/sys/kernel/sem 
250     32000   100     128
cat /proc/sys/net/就不列出了

7.修改核心参数的方法
在linux中
(1)直接修改/etc/sysctl.conf,/sbin/sysctl -p生效
(2)使用sysctl命令
(3)使用echo命令
echo "65536" > /proc/sys/fs/file_max
阅读(1725) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~