[20260506]写一个脚本验证ipcs -m的shmid值.txt

[20260506]写一个脚本验证ipcs -m的shmid值.txt

--//前几天在11g,21c下分别测试ipcs -m输出的shmid值。根据前面测试得到的公式写一个测试脚本,验证是否正确。
--//11g  2^15 *(B+S+1)  B:前次相乘因子开始0, S=前次启动需要共享内存段数量,开始0.
--//21c  2^16 *(B+S/2)  B:前次相乘因子 开始0,S 前次启动共享内存段数量, 开始0.

--//没有想到21c计算公式里面存在S/2, bc处理存在小数点问题,而bash shell的计算不允许存在小数.
$ echo $((3*2+1))
7

$ echo $((2.5*2+1))
-bash: 2.5*2+1: syntax error: invalid arithmetic operator (error token is ".5*2+1")

--//21c的计算采用bc处理计算存在小数点问题,处理相对麻烦一些.

$ cat shmid.sh
#! /bin/bash
B=${1:-0}
S=${2:-0}
echo START B=$B , S=$S
#for i in $(seq 16 64 1056)
for i in $(seq 1056 -64 16)
#for i in $(shuf -i 1-17 | awk '{print $1 * 64}')
do
    #echo $i
    sudo -E sysctl -w kernel.shmmax=$((i*1024*1024))
    sqlplus -s -l / as sysdba < /dev/null
        startup nomount force
        quit
EOF

    B=$[ B+S+1 ]                       #11g
    value2=$[ 2**15*B ]                #11g

#    B=$( echo "scale=1;$B+$S/2" | bc  )                        #21c
#    value2=$( echo "scale=1;2^16*$B"| bc | sed "s/\..*$//")    #21c

    value1=$(ipcs -m | grep -m 1 ^0x | awk '{print $2}')
    S=$(ipcs -m | grep  -c ^0x)
    #echo -n MIDDLE B=$B , S=$S ,

    if [ "$value1" = "$value2" ];then
        echo "Actual Value = " $value1 , "Calculated Value =" $value2 , "Ok"
    else
        echo "Actual Value = " $value1 , "Calculated Value =" $value2 , "Fail"
    fi
done
echo END B=$B , S=$S

--//采用shuf随机修改kernel.shmmax的结果如下:
$ .  shmid.sh 692.0 4
START B=692.0 , S=4
kernel.shmmax = 1073741824
Actual Value =  45481984 , Calculated Value = 45481984 , Ok
kernel.shmmax = 201326592
Actual Value =  45645824 , Calculated Value = 45645824 , Ok
kernel.shmmax = 1140850688
Actual Value =  45940736 , Calculated Value = 45940736 , Ok
kernel.shmmax = 134217728
Actual Value =  46071808 , Calculated Value = 46071808 , Ok
kernel.shmmax = 536870912
Actual Value =  46465024 , Calculated Value = 46465024 , Ok
kernel.shmmax = 402653184
Actual Value =  46661632 , Calculated Value = 46661632 , Ok
kernel.shmmax = 805306368
Actual Value =  46858240 , Calculated Value = 46858240 , Ok
kernel.shmmax = 67108864
Actual Value =  47022080 , Calculated Value = 47022080 , Ok
kernel.shmmax = 268435456
Actual Value =  47677440 , Calculated Value = 47677440 , Ok
kernel.shmmax = 1006632960
Actual Value =  47939584 , Calculated Value = 47939584 , Ok
kernel.shmmax = 939524096
Actual Value =  48103424 , Calculated Value = 48103424 , Ok
kernel.shmmax = 469762048
Actual Value =  48267264 , Calculated Value = 48267264 , Ok
kernel.shmmax = 603979776
Actual Value =  48463872 , Calculated Value = 48463872 , Ok
kernel.shmmax = 335544320
Actual Value =  48627712 , Calculated Value = 48627712 , Ok
kernel.shmmax = 872415232
Actual Value =  48857088 , Calculated Value = 48857088 , Ok
kernel.shmmax = 738197504
Actual Value =  49020928 , Calculated Value = 49020928 , Ok
kernel.shmmax = 671088640
Actual Value =  49184768 , Calculated Value = 49184768 , Ok
END B=750.5 , S=5

--//开始的B很容易确定,21c使用 shmid/2^16 确定.
--//11g除以2^15.

请使用浏览器的分享功能分享到微信等