当前位置 博文首页 > free_kbytes理解_LuciferLiu_DBA:ORA-2730*引出的系统参数vm.mi

    free_kbytes理解_LuciferLiu_DBA:ORA-2730*引出的系统参数vm.mi

    作者:[db:作者] 时间:2021-06-16 12:13

    oerr ORA-2730*

    [oracle@p19c01 ~]$ oerr ORA 27300
    27300, 00000, "OS system dependent operation:%s failed with status: %s"
    // *Cause:  OS system call error
    // *Action: contact Oracle Support
    [oracle@p19c01 ~]$ oerr ORA 27301
    27301, 00000, "OS failure message: %s"
    // *Cause:  OS system call error
    // *Action: contact Oracle Support
    //
    [oracle@p19c01 ~]$ oerr ORA 27302
    27302, 00000, "failure occurred at: %s"
    // *Cause:  OS system call error
    // *Action: contact Oracle Support
    //
    

    *Cause: ?OS system call error

    ?The errors are usually caused by OS system call error or OS configuration issue 。

    可以发现,如果数据库trace日志中出现ORA-2730*的错误,很大可能是由于OS system的错误导致。

    ?

    案例分析:

    Tue Sep 01 04:05:33 2020
    skgxpvfynet: mtype: 61 process 417356 failed because of a resource problem in the OS. The OS has most likely run out of buffers (rval: 4)
    Errors in file /u01/app/oracle/diag/rdbms/*****/******/trace/******1_w001_417356.trc (incident=96021):
    ORA-00603: ORACLE server session terminated by fatal error
    ORA-27504: IPC error creating OSD context
    ORA-27300: OS system dependent operation:sendmsg failed with status: 105
    ORA-27301: OS failure message: No buffer space available
    ORA-27302: failure occurred at: sskgxpsnd2
    Incident details in: /u01/app/oracle/diag/rdbms/*****/******/incident/incdir_96021/******1_w001_417356_i96021.trc
    opidrv aborting process W001 ospid (417356) as a result of ORA-603
    

    以上为某一套数据库trace日志中报错的信息,可以发现几个关键点:

    1、status: 105

    2、?failure occurred at: sskgxpsnd2

    3、No buffer space available

    Troubleshooting ORA-27300 ORA-27301 ORA-27302 Errors (Doc ID 579365.1)?? ?

    通过MOS文章可以查询到与上述报错相符的信息:

    See: Oracle Linux: ORA-27301:OS Failure Message: No Buffer Space Available (Doc ID 2041723.1)

    关于解决方案中提到的vm.min_free_kbytes参数,单位是KB,Oracle建议的取值范围是0.4%到5%之间,如果内存<=32G,可以忽略不设置。

    查看系统vm.min_free_kbytes默认设置大小:

    [root@p19c01 ~]# sysctl -a | grep vm.min_free_kbytes
    vm.min_free_kbytes = 11433
    

    查看系统开启NUMA的node数量:

    numactl --hardware | grep available: | awk '{print $2}'

    Notes:该参数表示Linux VM最低保留多少的空闲内存空间,当可用的内存低于配置参数时,系统会进行cache内存的回收,来进行内存的释放。

    Notes:以下内容摘自:https://blog.csdn.net/zzt_2009/article/details/111436334

    ★ 参数简述
    该Linux系统参数的功能是用来设置一个最小内存空间给系统内核使用
    该值设置过大会浪费空间,保留过小会造成系统压力
    ★ 知识点
    ※ 用途:合理设置该值有助于Linux系统更有效地回收内存
    ※ 注意:对于内存较小(≤32GB)的环境不建议设置,保持默认即可
    ※ 危险:不要对正在运行的环境进行设置
    ※ 有修改操作,非原版
    ※ vm.min_free_kbytes参数的单位是:KB
    ※ 内存水位
        min水位:下的内存是保留给内核使用的;当到达min,会触发内存的direct reclaim
        low水位:比min高一些,当内存可用量小于low的时候,会触发 kswapd回收内存
        high水位:继续睡眠
    ※ 内存回收方式
        direct reclaim : 触发min水位线时执行
        kswapd reclaim : 触发low水位线时执行

    这里摘自其他博主的一个计算脚本可以用来计算vm.min_free_kbytes,直接复制到shell控制台执行即可:

    MIN_FREE_KBYTES_SYSCTL=$(egrep ^vm.min_free_kbytes /etc/sysctl.conf | awk '{print $3}')
    MIN_FREE_KBYTES_MEMORY=$(cat /proc/sys/vm/min_free_kbytes)
    NUMA_NODE_COUNT=$(numactl --hardware | grep available: | awk '{print $2}')
    TOTAL_MEMORY_KBYTES=$(free -k | awk '/Mem:/ {print $2}')
    NUMA_BASED=$(( $NUMA_NODE_COUNT * 1048576 ))
    MEMORY_BASED=$(( $TOTAL_MEMORY_KBYTES / 200 ))
    if [[ $NUMA_BASED -ge $MEMORY_BASED ]]
    then
    	RECOMMEND_VALUE=$NUMA_BASED
    else
    	RECOMMEND_VALUE=$MEMORY_BASED
    fi
    OFFSET=$(echo $RECOMMEND_VALUE*.05 | bc | cut -d"." -f1)
    LOWER_BOUND=$(echo $RECOMMEND_VALUE-$OFFSET | bc)
    UPPER_BOUND=$(echo $RECOMMEND_VALUE+$OFFSET | bc)
    if [[ $MIN_FREE_KBYTES_SYSCTL -ge LOWER_BOUND && $MIN_FREE_KBYTES_SYSCTL -le UPPER_BOUND ]]
    then
    	SYSCTL_IN_RANGE=YES
    else
    	SYSCTL_IN_RANGE=NO
    fi
    #sysctl in range?
    if [[ $MIN_FREE_KBYTES_MEMORY -ge LOWER_BOUND && $MIN_FREE_KBYTES_MEMORY -le UPPER_BOUND ]]
    then
    	MEMORY_IN_RANGE=YES
    else
    	MEMORY_IN_RANGE=NO
    fi
    DETAIL=$(
    echo -e "Total Memory: ? ? ? $TOTAL_MEMORY_KBYTES";
    echo -e "NUMA node count: ? ?$NUMA_NODE_COUNT";
    echo -e "NUMA calculated: ? ?$NUMA_BASED";
    echo -e "memory calculated: ?$MEMORY_BASED";
    echo -e "recommended value: ?$RECOMMEND_VALUE";
    echo -e "permitted range: ? ?$LOWER_BOUND to $UPPER_BOUND";
    echo -e "in sysctl.conf: ? ? $MIN_FREE_KBYTES_SYSCTL";
    echo -e "sysctl in range?: ? $SYSCTL_IN_RANGE";
    echo -e "in active memory: ? $MIN_FREE_KBYTES_MEMORY";
    echo -e "memory in range?: ? $MEMORY_IN_RANGE";
    )
    if [[ $SYSCTL_IN_RANGE = YES && $MEMORY_IN_RANGE = YES ]]
    then
    	echo -e "SUCCESS: vm.min_free_kbytes is configured as recommended. ?Details:\n\n$DETAIL"
    elif [[ $MIN_FREE_KBYTES_SYSCTL -lt $LOWER_BOUND || $MIN_FREE_KBYTES_MEMORY -lt $LOWER_BOUND ]]
    then
    	echo -e ":: Result : 【FAILURE】: vm.min_free_kbytes is not configured as recommended"
    	ZZT_V1=$(( $NUMA_NODE_COUNT * 1 * 1024 * 1024 ))
    	ZZT_V2=$(( $TOTAL_MEMORY_KBYTES * 5 /10 / 100 ))
    	if [ $ZZT_V1 -gt $ZZT_V2 ]
    	then
    	ZZT_MAX=$ZZT_V1
    	else
    	ZZT_MAX=$ZZT_V2
    	fi
    	ZZT_MAX_GB=$(($ZZT_MAX/1024/1024))
    	echo ">>> if output is <FAILURE>,please vi sysctl.conf and edit param's value for:vm.min_free_kbytes and reboot"
    	echo ">>> [formula_oracle]vm.min_free_kbytes value (Kb) =MAX(1GB * number_numa_nodes, 0.5% * total_memory) "
    	echo ">>> [calculated_zzt]vm.min_free_kbytes = $ZZT_MAX ? (About: $ZZT_MAX_GB GB)"
    	ZZT_V3=32
    	ZZT_V4=$(($TOTAL_MEMORY_KBYTES/1024/1024))
    	if [ $ZZT_V4 -gt $ZZT_V3 ]
    	then
    		echo ">>> [PASS]The current memory is suitable for setting system parameters."
    	else
    		echo ">>> [WARN]Your memory is too small to set this parameter."
    	fi
    	echo -e "Details:\n\n$DETAIL"
    elif ?[[ $MIN_FREE_KBYTES_SYSCTL -gt $UPPER_BOUND && $MIN_FREE_KBYTES_MEMORY -gt $UPPER_BOUND ]]
    then
    ? echo -e "WARNING: vm.min_free_kbytes is not configured as recommended. ?Details:\n\n$DETAIL"
    else
    ? echo -e "ERROR: Inconsistent results. ?Details:\n\n$DETAILS"
    fi

    测试结果如下: