Oracle 优化篇+Linux系统参数(vm.min_free_kbytes)

说明:本文为面向Linux系统参数(vm.min_free_kbytes)初学者的指导手册
标签:Linux参数、Oracle优化、vm.min_free_kbytes、内存管理
注意:参数的修改有利有弊,该参数的设置不当有可能导致系统宕机等风险
易学:文中删去了不需要的多余部分,让初学者一目了然一学就会
温馨提示:如果您发现本文哪里写的有问题或者有更好的写法请留言或私信我进行修改优化


★ 参数简述
该Linux系统参数的功能是用来设置一个最小内存空间给系统内核使用
该值设置过大会浪费空间,保留过小会造成系统压力


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


★ 相关脚本
※ 直接在shell里使用ROOT用户执行下面语句即可

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


 


★ 案例

 


※ 如果您觉得文章写的还不错, 别忘了在文末给作者点个赞哦 ~

over

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值