• solaris10中安装oracle内核参数的调整


    一些预备知识

    shared memory:共享内存段:
    一个内存区域,可以被不同的进程读取。Oracle使用它来构成SGA。Oracle使用以下三种方法来创建一个SGA区:
    1. 使用单个共享内存段。
    2. 使用连续多个共享内存段。
    3. 使用多个不连续共享内存段。
    Oracle优先使用第一种方法,如果成功,则继续初始化,不成功则使用第二种方法,再不成功则使用第三种方法。如果再不成功,则初始化失败,Oracle报告错误代码。

    Semaphore
    可以看作一个标记。可以有On和Off两种状态。Oracle使用semaphores来实现服务器进程对SGA区的存取控制。
    Shared memory 和semaphore 是Oracle在Unix上运行的重要资源。如果Oracle 实例得不到所需要的资源,实例启动就会失败。

    参数:
    对于运行一个Oracle实例的Solaris系统,改变/etc/system文件中的一些关于共享内存的参数,以使Oracle实例可以正常运行。如果有多个实例的话,还需根据下面方法重新计算某些值。

    shmmax
    含义:这个设置并不决定究竟Oracle数据库或者操作系统使用多少物理内存,只决定了最多可以使用的内存数目。这个设置也不影响操作系统的内核资源。
    设置方法:0.5*物理内存。如果物理内存为20G,则 0.5×20G×1024×1024=10485760
    例子: Set shmsys:shminfo_shmmax=10485760

    shmmin
    含义:共享内存的最小大小。
    设置方法:一般都设置成为1。
    例子: Set shmsys:shminfo_shmmin=1

    shmmni
    含义:系统中共享内存段的最大个数。 推荐值为100或者128。
    例子:Set shmsys:shminfo_shmmni=100

    shmseg
    含义:每个用户进程可以使用的最多的共享内存段的数目。 推荐值为20或者10。
    例子:Set shmsys:shminfo_shmseg=20

    semmni
    含义:系统中semaphore identifierer的最大个数。推荐值为100或者128。
    设置方法:把这个变量的值设置为这个系统上的所有Oracle的实例的init.ora中的最大的那个processes的那个值加10。
    例子:Set semsys:seminfo_semmni=100

    semmns
    含义:系统中semaphores的最大个数。
    设置方法:这个值可以通过以下方式计算得到:各个Oracle实例的initSID.ora里边的processes的值的总和(除去最大的Processes参数)+最大的那个Processes×2+10×Oracle实例的个数。 详见下面“(semmns计算实例)”。
    例子:Set semsys:seminfo_semmns=200

    semmsl
    含义:一个set中semaphore的最大个数。

    设置方法:设置成为10+所有Oracle实例的InitSID.ora中最大的Processes的值。详见下面“(SEMMSL 计算实例)”  .
    例子:Set semsys:seminfo_semmsl=-200

    改变了/etc/system里边以上参数以后,重新启动计算机:
    $reboot
    然后检查当前的参数:
    $sysdef -I
    如果系统参数仍旧没有改变得话,使用以下命令:
    $modload /kernel/sys/shmsys。

     

    from http://sharklove.itpub.net/post/660/5171

    =============================================================

    oracle在solaris下安装时参数的计算

    SHMMAX maximum size of a shared memory segment
    (共享内存段的最大字节数)
    SHMMIN minimum size of shared memory segment
    (共享内存段的最小尺寸)
    SHMMNI maximum number of shared memory identifiers in the system
    (系统中共享内存标识符的最大数目)
    SHMSEG maximum number of shared memory segments a user process can attach
    (每个用户进程可分配的最大共享内存段数目)
    SEMMNI maximum number of semaphore identifiers in the system
    (系统中信号灯标识符的最大数目)
    SEMMSL maximum number of semaphores in a set
    (每个(信号灯)集合中的信号灯的最大数目)
    SEMMNS maximum number of semaphores in the system
    (系统中信号灯的最大数目)
    SEMOPM maximum number of operations per semop call
    (每个semop调用的信号灯的最大数目)
    SEMVMX semaphore maximum value
    (信号灯最大值)

    set semsys:seminfo_semmni 100


    set semsys:seminfo_semmns 1024(semmns计算实例)

    系统中各个Oracle实例的"init[SID].ora"文件中PROCESSES值的总和(不包括最大的那个PROCESSES值)+ 最大的那个PROCESSES值 * 2 + 10 * Oracle实例的个数。
    注:[SID]即为具体的数据库实例名
    例如,一个有三个 Oracle实例的系统,在各自的"initsid.ora"文件中的PROCESSES参数设置为下列值:
    ORACLE_SID=A, PROCESSES=100
    ORACLE_SID=B, PROCESSES=100
    ORACLE_SID=C, PROCESSES=200
    则 SEMMSL 值的计算方法如下(SEMMSL 计算实例):
    SEMMSL = [(c=200) + 10] = 210
    则 SEMMNS 值的计算方法如下:
    SEMMNS = [(A=100) + (B=100)] + [(C=200) * 2] + [(# of instances=3) * 10] = 630


    set semsys:seminfo_semmsl 256

    SEMMSL 的值可以通过以下方式计算得到:
    所有Oracle实例的"init[SID].ora"文件中最大的PROCESSES值 + 10
    set semsys:seminfo_semvmx 32767
    set semsys:seminfo_shmmax 12884901888    

    24G *0.5 * 1024*1024 (24G是物理内存)
    set semsys:seminfo_shmmin 100

     

    from http://www.iteye.com/topic/41606

    =============================================================

    solaris10中可以使用资源控制器进行部分内核参数的动态调整了,比如在以前版本中安装oracle需要修改/etc/system,添加类似下边的内容
    set noexec_user_stack=1
    set shmsys:shminfo_shmmax=4294967295
    set shmsys:shminfo_shmmin=1
    set shmsys:shminfo_shmmni=100
    set shmsys:shminfo_shmseg=10
    set semsys:seminfo_semmni=100
    set semsys:seminfo_semmsl=1000
    set semsys:seminfo_semmns=2000
    set semsys:seminfo_semopm=100
    set semsys:seminfo_semvmx=32767
    在这些参数中
    semsys:seminfo_semmns
    shmsys:shminfo_shmmin   
    semsys:seminfo_semvmx
    在solaris10中已经移除,即使在system中有这些参数的设置solaris10也会自动注释掉,所以大家不用再去算什么semsys:seminfo_semmns了。
    剩下的大家比较关注的有几个
    Parameter        Replaced by Resource Control        Recommended Value
    noexec_user_stack        NA        1
    semsys:seminfo_semmni        project.max-sem-ids        100
    semsys:seminfo_semmsl        process.max-sem-nsems        256
    shmsys:shminfo_shmmax        project.max-shm-memory        4294967295
    shmsys:shminfo_shmmni        project.max-shm-ids        100
    这是oracle安装文档里面列出的内容
    这里面和共享内存有关系的是
    shmsys:shminfo_shmmax  共享内存段(shared memory segment)最大大小
    semsys:seminfo_semmni   同一时间可以创建的信号组(semaphore sets)最大值
    shmsys:shminfo_shmmni  共享内存标志符(shared memory identifiers)的数量
    和进程数量有关的是
    semsys:seminfo_semmsl 一个信号组中包含的最大信号数量,约等于oracle的最大进程数
    oracle文档里把shmsys:shminfo_shmmax和project.max-shm-memory列在一起,并且还加了一个推荐值,这样很容易让人误解这两个参数是等同的,其实这个两个参数含义相差很大,而数值更是差了十万八千里。shmsys:shminfo_shmmax是一个共享内存段的最大值,而project.max-shm-memory是属于同一个project的用户所能够创建的共享内存总和最大值,在数值上:
    project.max-shm-memory=shmsys:shminfo_shmmax×shmsys:shminfo_shmmni
    所以如果在system文件中设置了shmsys:shminfo_shmmax和shmsys:shminfo_shmmni然后在重启系统之后查看project.max-shm-memory的话会发现这是一个很大的值,再看看project.max-shm-memory对系统的影响,在我们创建oracle用户时默认的project为default,如果project.max-shm-memory为4G的话,在不考虑其他用户使用共享内存的情况下,则oracle用户下所有数据库的SGA和不能超过4G,如果只有一个数据库,则这个数据库的SGA不能大过4G(比4G略小),如果有两个则这两个数据库的SGA的总和不能大过4G
    然后再看看共享内存段是怎么分配的,在以前的版本里共享内存段的大小由shmsys:shminfo_shmmax决定的,构成SGA的共享内存段大小不会超过这个限制,如果超过则SGA由多个共享内存段组成,但是在10G里似乎这个参数并不起作用
    举个例子,在system中设置shmsys:shminfo_shmmax为100m
    set shmsys:shminfo_shmmax=104857600
    数据库的SGA设置为500m
    alter system set sga_target=500m scope=spfile;
    启动数据库后使用ipcs –b查看
    IPC status from <running system> as of 2006年07月21日 星期五 12时52分23秒 CST
    T         ID      KEY        MODE        OWNER    GROUP QBYTES
    Message Queues:
    T         ID      KEY        MODE        OWNER    GROUP      SEGSZ
    Shared Memory:
    m          3   0xe6ea3758 --rw-r-----   oracle      dba  524296192
    T         ID      KEY        MODE        OWNER    GROUP NSEMS
    Semaphores:
    s          7   0x6c609d48 --ra-r-----   oracle      dba   304
    还是只是用了一个内存段,并没有受set shmsys:shminfo_shmmax=104857600的影响
    但是一个内存段的大小似乎也不是不受限制的,在另外一台SGA为32G的机器上用ipcs查看,SGA是由几个接近8G的内存段组成的,而这台机器上的shmsys:shminfo_shmmax设置为40G,可是系统并没有把SGA放入到一个内存段中,可见共享内存段的大小还是受限制的,在这个系统上大约为8G,至于是否可以调整,还没有看到相关资料,怀疑是受每个物理cpu板上具体内存大小的限制,哪位大侠有这方面的资料
    下面是sun提供的新旧参数对照,尤其需要注意的是如果在system参数中设置了比默认值还小的值,在实际中是不起作用的,相应的值依然是最小值
    Resource Control         Obsolete Tunable         Old Default Value         Maximum Value         New Default Value
    process.max-msg-qbytes         msginfo_msgmnb         4096         ULONG_MAX         65536
    process.max-msg-messages         msginfo_msgtql         40         UINT_MAX         8192
    process.max-sem-ops         seminfo_semopm         10         INT_MAX         512
    process.max-sem-nsems         seminfo_semmsl         25         SHRT_MAX         512
    project.max-shm-memory         shminfo_shmmax         0x800000         UINT64_MAX         1/4 of physical memory
    project.max-shm-ids         shminfo_shmmni         100         224         128
    project.max-msg-ids         msginfo_msgmni         50         224         128
    project.max-sem-ids         seminfo_semmni         10         224         128
    综合上面的一些信息我们发现,shminfo_shmmax这个参数起的作用已经很有限了,需要注意的就是shmsys:shminfo_shmmax×shmsys:shminfo_shmmni的大小决定了默认情况下project.max-shm-memory的大小,另外seminfo_semmsl参数在大于新默认值的时候决定了process.max-sem-nsems的大小,而这些都是可以动态调整的:
    使用prctl
    使用id –p查看用户所属的project名称,然后
    prctl -n project.max-shm-memory -v 10G -r -i project default
    prctl -n project.max-sem-ids -v 256 -r -i project default
    prctl -n project.max-shm-ids -v 256 -r -i project default
    这样所作的修改系统重启后就失效了
    可以使用下面的方法为oracle用户创建单独的project,然后修改相应的值
    projadd -U oracle user.oracle
    projmod -a-K "project.max-shm-memory=(priv,10g,deny)" user.oracle
    projmod -a-K "project.max-sem-ids=(priv,100,deny)" user.oracle
    projmod -a-K "process.max-sem-nsems=(priv,500,deny)" user.oracle
    projmod -a-K "project.max-shm-ids=(priv,100,deny)" user.oracle
    修改之后只要切换到oracle用户设置就生效了,重启之后也不会丢失
    更加详细的关于project的操作请查看solaris相应的手册,以后修改/etc/system的方法应该会被这种方式逐步取代

     

    from http://www.itpub.net/thread-596038-1-1.html

  • 相关阅读:
    剑指Offer(Java版)第五十题:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志, 写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看, 但却读不懂它的意思。例如,“student. a am I”
    剑指Offer(Java版)第四十九题:汇编语言中有一种移位指令叫做循环左移(ROL), 现在有个简单的任务,就是用字符串模拟这个指令的运算结果。 对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。 例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果, 即“XYZdefabc”。是不是很简单?OK,搞定它!
    【转载】Java 内存分配全面浅析
    【记】Linux下安装JDK1.7
    【ZooKeeper】典型应用场景概览
    正则表达式工具RegexBuddy
    【基础】RandomAccess
    【JNDI】Java Naming and Directory Interface
    【AOP】Cglib动态代理实现方式
    【事务】分布式事物原理
  • 原文地址:https://www.cnblogs.com/emanlee/p/2584181.html
Copyright © 2020-2023  润新知