[20260505]21c下ipcs -m shmid值.txt
--//前几天写 [20260503]21c下测试pre_page_sga=false时的疑问.txt,发现ipcs -m ,shmid值的规律,今天单独测试看看.
--//实际上仔细看前面帖子,很容易猜测,21c生成的算法简单许多与11g不同.猜测计算公式如下:
2^17*(B+1)
--//B:前次相乘因子 开始0.
--//注:猜测不对,看后面的测试。
--//后续的共享内存段的shmid值呈等差数列,相差32769.
--//验证看看:
1.环境:
SYS@book> @ ver2
==============================
PORT_STRING : x86_64/Linux 2.4.xx
VERSION : 21.0.0.0.0
BANNER : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID : 0
PL/SQL procedure successfully completed.
2.测试:
--//重新打开服务器.
--//第1次启动数据库。
--//SYS@book> startup nomount force
--//kernel.shmmax = 4398046511104
# ipcs -m ;ipcs -m | awk '/[0=9]/{print $2}'| awk 'NR==1{printf "0x%08x %d\n",$1,$1;a=$1} NR>1{printf "0x%08x %d %d\n", $1,$1,$1-a;a=$1}'
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 0 oracle 600 10485760 34
0x00000000 32769 oracle 600 1090519040 34
0x00000000 65538 oracle 600 8388608 34
0xafa94c20 98307 oracle 600 2097152 34
0x00000000 0
0x00008001 32769 32769
0x00010002 65538 32769
0x00018003 98307 32769
--//S=4, S表示共享内存段数量
--//shmid=0
--//第2次启动数据库。
--//kernel.shmmax = 268435456, 268435456/2/1024/1024 = 128
# ipcs -m ;ipcs -m | awk '/[0=9]/{print $2}'| awk 'NR==1{printf "0x%08x %d\n",$1,$1;a=$1} NR>1{printf "0x%08x %d %d\n", $1,$1,$1-a;a=$1}'
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 131072 oracle 600 10485760 34
0x00000000 163841 oracle 600 268435456 34
0x00000000 196610 oracle 600 268435456 34
0x00000000 229379 oracle 600 268435456 34
0x00000000 262148 oracle 600 268435456 34
0x00000000 294917 oracle 600 16777216 34
0x00000000 327686 oracle 600 8388608 34
0xafa94c20 360455 oracle 600 2097152 34
0x00020000 131072
0x00028001 163841 32769
0x00030002 196610 32769
0x00038003 229379 32769
0x00040004 262148 32769
0x00048005 294917 32769
0x00050006 327686 32769
0x00058007 360455 32769
--//S=8
--//131072: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
# factor 131072 |grep -o " 2" |wc
17 17 51
--//共17个2.
--//第3次启动数据库。
--//kernel.shmmax = 268435456*2 = 536870912, 536870912 /2/1024/1024 = 256
# ipcs -m ;ipcs -m | awk '/[0=9]/{print $2}'| awk 'NR==1{printf "0x%08x %d\n",$1,$1;a=$1} NR>1{printf "0x%08x %d %d\n", $1,$1,$1-a;a=$1}'
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 393216 oracle 600 10485760 34
0x00000000 425985 oracle 600 536870912 34
0x00000000 458754 oracle 600 536870912 34
0x00000000 491523 oracle 600 16777216 34
0x00000000 524292 oracle 600 8388608 34
0xafa94c20 557061 oracle 600 2097152 34
0x00060000 393216
0x00068001 425985 32769
0x00070002 458754 32769
0x00078003 491523 32769
0x00080004 524292 32769
0x00088005 557061 32769
--//S=6
--//393216: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3
# factor 393216 | grep -o " 2" |wc
17 17 51
--//共17个2.
--//第4次启动数据库。
--//kernel.shmmax = 268435456*2 = 536870912, 536870912 /2/1024/1024 = 256 ,该参数不变。
# ipcs -m ;ipcs -m | awk '/[0=9]/{print $2}'| awk 'NR==1{printf "0x%08x %d\n",$1,$1;a=$1} NR>1{printf "0x%08x %d %d\n", $1,$1,$1-a;a=$1}'
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 589824 oracle 600 10485760 35
0x00000000 622593 oracle 600 536870912 35
0x00000000 655362 oracle 600 536870912 35
0x00000000 688131 oracle 600 16777216 35
0x00000000 720900 oracle 600 8388608 35
0xafa94c20 753669 oracle 600 2097152 35
0x00090000 589824
0x00098001 622593 32769
0x000a0002 655362 32769
0x000a8003 688131 32769
0x000b0004 720900 32769
0x000b8005 753669 32769
--//S=6
--//589824: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3
# factor 589824 | grep -o " 2" |wc
16 16 48
--//共16个2.
--//还是与需求共享内存段相关。猜测如下:
--//2^16 * (B+S/2) B:前次相乘因子 开始0, S=前次启动需要共享内存段数量. 开始0.
--//第5次启动数据库。
--//kernel.shmmax = 268435456*2 = 536870912,536870912 /2/1024/1024 = 256 ,该参数不变。
--//猜测 2^16 * (B+S/2) = 2^16*(9+6/2) = 786432
# ipcs -m ;ipcs -m | awk '/[0=9]/{print $2}'| awk 'NR==1{printf "0x%08x %d\n",$1,$1;a=$1} NR>1{printf "0x%08x %d %d\n", $1,$1,$1-a;a=$1}'
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 786432 oracle 600 10485760 34
0x00000000 819201 oracle 600 536870912 34
0x00000000 851970 oracle 600 536870912 34
0x00000000 884739 oracle 600 16777216 34
0x00000000 917508 oracle 600 8388608 34
0xafa94c20 950277 oracle 600 2097152 34
0x000c0000 786432
0x000c8001 819201 32769
0x000d0002 851970 32769
0x000d8003 884739 32769
0x000e0004 917508 32769
0x000e8005 950277 32769
--//S=6
--//786432,与测试完成正确.
--//786432: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3
--//第6次启动数据库。
--//前面测试需求共享内存段都是能被2整除.
--//1090519040 /4 = 272629760
--//272629760/2/1024/1024 = 130
--//kernel.shmmax = 132*2*1024*1024 = 276824064,这样生成7个共享内存段.
--//猜测下一次启动 2^16 * (B+S/2) = 2^16*(12+6/2) = 983040
# ipcs -m ;ipcs -m | awk '/[0=9]/{print $2}'| awk 'NR==1{printf "0x%08x %d\n",$1,$1;a=$1} NR>1{printf "0x%08x %d %d\n", $1,$1,$1-a;a=$1}'
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 983040 oracle 600 10485760 34
0x00000000 1015809 oracle 600 268435456 34
0x00000000 1048578 oracle 600 268435456 34
0x00000000 1081347 oracle 600 268435456 34
0x00000000 1114116 oracle 600 268435456 34
0x00000000 1146885 oracle 600 16777216 34
0x00000000 1179654 oracle 600 8388608 34
0xafa94c20 1212423 oracle 600 2097152 34
0x000f0000 983040
0x000f8001 1015809 32769
0x00100002 1048578 32769
0x00108003 1081347 32769
0x00110004 1114116 32769
0x00118005 1146885 32769
0x00120006 1179654 32769
0x00128007 1212423 32769
--//S=8,不行还是偶数.
--//983040,与测试完成正确.
--//983040: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 5
--//猜测下一次启动 2^16 * (B+S/2) = 2^16*(15+8/2) = 1245184
--//第7次启动数据库。
--//kernel.shmmax =268435456*4 = 1073741824 ,1073741824/2/1024/1024 = 512
# ipcs -m ;ipcs -m | awk '/[0=9]/{print $2}'| awk 'NR==1{printf "0x%08x %d\n",$1,$1;a=$1} NR>1{printf "0x%08x %d %d\n", $1,$1,$1-a;a=$1}'
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 1245184 oracle 600 10485760 34
0x00000000 1277953 oracle 600 1073741824 34
0x00000000 1310722 oracle 600 16777216 34
0x00000000 1343491 oracle 600 8388608 34
0xafa94c20 1376260 oracle 600 2097152 34
0x00130000 1245184
0x00138001 1277953 32769
0x00140002 1310722 32769
0x00148003 1343491 32769
0x00150004 1376260 32769
--//S=5
--//1245184,与测试完成正确.
--//1245184: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 19
--//第8次启动数据库。
--//kernel.shmmax =268435456*4 = 1073741824 ,1073741824/2/1024/1024 = 512
--//猜测下一次启动 2^16 * (B+S/2) = 2^16*(19+5/2) = 1409024
# ipcs -m ;ipcs -m | awk '/[0=9]/{print $2}'| awk 'NR==1{printf "0x%08x %d\n",$1,$1;a=$1} NR>1{printf "0x%08x %d %d\n", $1,$1,$1-a;a=$1}'
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 1409024 oracle 600 10485760 34
0x00000000 1441793 oracle 600 1073741824 34
0x00000000 1474562 oracle 600 16777216 34
0x00000000 1507331 oracle 600 8388608 34
0xafa94c20 1540100 oracle 600 2097152 34
0x00158000 1409024
0x00160001 1441793 32769
0x00168002 1474562 32769
0x00170003 1507331 32769
0x00178004 1540100 32769
--//S=5
--//1409024,厉害佩服自己一下,猜测还是正确.
1409024: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 43
--//第9次启动数据库。
--//kernel.shmmax =268435456*4 = 1073741824 ,1073741824/2/1024/1024 = 512
--//猜测下一次启动 2^16 * (B+S/2) = 2^16*(21.5+5/2) = 1572864
# ipcs -m ;ipcs -m | awk '/[0=9]/{print $2}'| awk 'NR==1{printf "0x%08x %d\n",$1,$1;a=$1} NR>1{printf "0x%08x %d %d\n", $1,$1,$1-a;a=$1}'
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 1572864 oracle 600 10485760 33
0x00000000 1605633 oracle 600 1073741824 33
0x00000000 1638402 oracle 600 16777216 33
0x00000000 1671171 oracle 600 8388608 33
0xafa94c20 1703940 oracle 600 2097152 33
0x00180000 1572864
0x00188001 1605633 32769
0x00190002 1638402 32769
0x00198003 1671171 32769
0x001a0004 1703940 32769
--//S=5
--//1572864,猜测还是正确.
--//1572864: 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3
3.小结:
--//到此可以猜测出shmid的生成规律,计算公式如下:
2^16 * (B+S/2)
--//或者写成
2^15 * (2*B+S)
--//B:前次相乘因子 开始0,S 前次启动共享内存段数量, 开始0.
--//还是存在一个疑问:oracle如何知道前次使用多少共享内存段,难道服务器保存此信息.
--//后续的共享内存段的shmid值呈等差数列,相差32769.
--//如果看16进制值的最后3位,可以看出属于第几个共享内存段,这也是选择相差32769=0x8001的原因,也就是16进制的后3位。
--//再次说明,猜测ipcs -m输出的shmid没有任何意义.要有意义可以知道数据库开机以来启动几次.一般内核参数不会修改,数据库启动生
--//成共享内存段不会变.假设S=4.这样每次 2^17的倍数,这样这个倍数加上1就是数据库重新启动次数.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3117210/ ,如需转载,请注明出处,否则将追究法律责任。