ITPub博客

首页 > 数据库 > Oracle > [20260505]21c下ipcs -m shmid值.txt

[20260505]21c下ipcs -m shmid值.txt

原创 Oracle 作者:lfree 时间:2026-05-06 20:56:04 0 删除 编辑

[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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969349