[20260508]21c下ipcs -s semid值.txt
--//测试21c使用oracle数据库,ipcs -s输出semid的变化,看看生成的semid存在什么规律.
--//跟踪前面测试,semid的计算肯定Semaphore Arrays数量相关。
--//先测试1个信号集的情况: processes=246,满足在1个信号集的需求.
# sysctl kernel.sem
kernel.sem = 250 32000 250 128
--//写一个脚本收集每次启动数据库的ipcs -s的semid输出0x开头第1行以及Semaphore Arrays数量。
$ cat semid21c.sh
#! /bin/bash
#for i in $( seq 16 64 156 )
#for i in $(seq 1056 -64 16)
#for i in $(shuf -i 1-17 | awk '{print $1 * 64}')
for i in $(seq 10)
do
sqlplus -s -l / as sysdba <
startup nomount force
quit
EOF
read semid ss < <(ipcs -s | grep "^0x" | awk 'NR==1{printf "%d\t",$2} END{printf "%d\n",NR}')
echo middle semid=$semid Semaphore_Arrays=$ss
done
--//重新启动测试机器,记录启动oracle实例ipcs -s的输出semid的变化情况
$ . semid21c.sh
middle semid=98304 Semaphore_Arrays=1
middle semid=229376 Semaphore_Arrays=1
middle semid=360448 Semaphore_Arrays=1
middle semid=491520 Semaphore_Arrays=1
middle semid=622592 Semaphore_Arrays=1
middle semid=753664 Semaphore_Arrays=1
middle semid=884736 Semaphore_Arrays=1
middle semid=1015808 Semaphore_Arrays=1
middle semid=1146880 Semaphore_Arrays=1
middle semid=1277952 Semaphore_Arrays=1
$ echo 98304 229376 360448 491520 622592 753664 884736 1015808 1146880 1277952 | tr " " "\n" | xargs -IQ echo "Q/2^15" | bc
3
7
11
15
19
23
27
31
35
39
--//等差数列,相差4.基本可以猜测semid的计算公式:
2^15*(BB+SS+3)
--//BB:前次相乘因子开始0, SS=前次启动Semaphore Arrays数量,开始0.
--//修改脚本如下:
$ cat semid21c.sh
#! /bin/bash
BB=${1:-0}
SS=${2:-0}
echo START BB=$BB SS=$SS
#for i in $( seq 16 64 156 )
#for i in $(seq 1056 -64 16)
#for i in $(shuf -i 1-17 | awk '{print $1 * 64}')
#for i in $(seq 10)
for i in 256 128 64 32 16 8
do
sudo -E sysctl -w "kernel.sem=$i 32000 $i 128" > /dev/null
sqlplus -s -l / as sysdba <
startup nomount force
quit
EOF
BB=$[ BB+SS+3 ]
semid_calc=$[ 2**15*BB ]
read semid SS < <(ipcs -s | grep "^0x" | awk 'NR==1{printf "%d\t",$2} END{printf "%d\n",NR}')
echo -n middle semid=$semid Semaphore_Arrays=$SS " "
if [ "$semid" = "$semid_calc" ];then
echo Actual Value=$semid Calculated Value=$semid_calc Ok
else
echo Actual Value=$semid Calculated Value=$semid_calc Fail
fi
done
echo END BB=$BB SS=$SS $BB $SS
$ . semid21c.sh 233 62
START BB=233 SS=62
middle semid=9764864 Semaphore_Arrays=1 Actual Value=9764864 Calculated Value=9764864 Ok
middle semid=9895936 Semaphore_Arrays=2 Actual Value=9895936 Calculated Value=9895936 Ok
middle semid=10059776 Semaphore_Arrays=5 Actual Value=10059776 Calculated Value=10059776 Ok
middle semid=10321920 Semaphore_Arrays=9 Actual Value=10321920 Calculated Value=10321920 Ok
middle semid=10715136 Semaphore_Arrays=21 Actual Value=10715136 Calculated Value=10715136 Ok
middle semid=11501568 Semaphore_Arrays=62 Actual Value=11501568 Calculated Value=11501568 Ok
END BB=351 SS=62
--//for i in 256 128 64 32 16 8
$ . semid21c.sh 460 1
START BB=460 SS=1
middle semid=15204352 Semaphore_Arrays=62 Actual Value=15204352 Calculated Value=15204352 Ok
middle semid=17334272 Semaphore_Arrays=21 Actual Value=17334272 Calculated Value=17334272 Ok
middle semid=18120704 Semaphore_Arrays=9 Actual Value=18120704 Calculated Value=18120704 Ok
middle semid=18513920 Semaphore_Arrays=5 Actual Value=18513920 Calculated Value=18513920 Ok
middle semid=18776064 Semaphore_Arrays=2 Actual Value=18776064 Calculated Value=18776064 Ok
middle semid=18939904 Semaphore_Arrays=1 Actual Value=18939904 Calculated Value=18939904 Ok
END BB=578 SS=1 578 1
--//完全正确.
--//for i in $(shuf -i 1-10 | awk '{print $1 * 32}'
$ . semid21c.sh 1735 10
START BB=1735 SS=10
[sudo] password for oracle:
middle semid=57278464 Semaphore_Arrays=2 Actual Value=57278464 Calculated Value=57278464 Ok
middle semid=57442304 Semaphore_Arrays=9 Actual Value=57442304 Calculated Value=57442304 Ok
middle semid=57835520 Semaphore_Arrays=1 Actual Value=57835520 Calculated Value=57835520 Ok
middle semid=57966592 Semaphore_Arrays=1 Actual Value=57966592 Calculated Value=57966592 Ok
middle semid=58097664 Semaphore_Arrays=2 Actual Value=58097664 Calculated Value=58097664 Ok
middle semid=58261504 Semaphore_Arrays=2 Actual Value=58261504 Calculated Value=58261504 Ok
middle semid=58425344 Semaphore_Arrays=2 Actual Value=58425344 Calculated Value=58425344 Ok
middle semid=58589184 Semaphore_Arrays=3 Actual Value=58589184 Calculated Value=58589184 Ok
middle semid=58785792 Semaphore_Arrays=5 Actual Value=58785792 Calculated Value=58785792 Ok
middle semid=59047936 Semaphore_Arrays=1 Actual Value=59047936 Calculated Value=59047936 Ok
END BB=1802 SS=1 1802 1
--//顺便在11g下测试,算法没有改变。
$ . semid11g.sh 39 1
START base_semid=39 sem_array=1
middle semid=1409024 Semaphore_Arrays=1 Actual Value=1409024 Calculated Value=1409024 Ok
middle semid=1540096 Semaphore_Arrays=1 Actual Value=1540096 Calculated Value=1540096 Ok
middle semid=1671168 Semaphore_Arrays=1 Actual Value=1671168 Calculated Value=1671168 Ok
middle semid=1802240 Semaphore_Arrays=5 Actual Value=1802240 Calculated Value=1802240 Ok
middle semid=2064384 Semaphore_Arrays=3 Actual Value=2064384 Calculated Value=2064384 Ok
middle semid=2260992 Semaphore_Arrays=1 Actual Value=2260992 Calculated Value=2260992 Ok
middle semid=2392064 Semaphore_Arrays=1 Actual Value=2392064 Calculated Value=2392064 Ok
middle semid=2523136 Semaphore_Arrays=10 Actual Value=2523136 Calculated Value=2523136 Ok
middle semid=2949120 Semaphore_Arrays=3 Actual Value=2949120 Calculated Value=2949120 Ok
middle semid=3145728 Semaphore_Arrays=3 Actual Value=3145728 Calculated Value=3145728 Ok
END base_semid=96 sem_array=3 96 3