6

2-m6米乐安卓版下载

1407

1、研究方法概述

本文通过回顾oracle内核原理,指导分析和研究pg15数据库,oracle通过位图结构将并发dml语句均匀分配到extent中不同的data blocks,从而提高数据库并发量,pg中是否会预分配大量空pages从而提高数据库的并发呢?这是一个问题,待下文分析?

2、oracle 原理回顾

2.1、buffer访问机制

image-20221028225252442

步骤1、客户端发起dml语句变更 file:5 blk_id: 1234 所在的行 步骤2、通过hash算法 file5: blk_id: 1234在 bucket x 步骤3、以独占方式获取cbc latch 步骤4、在独占cbc latch的保护下,修改bh中的buffer pin锁,将锁状态改为x 步骤5、bh中的buffer pin锁状态修改完毕,释放独占的cbc latch 步骤6、在独占buffer pin锁保护下修改buffer

2.2、assm位图原理

image-20221028225315209

步骤1、查找数据字典,确定段头位置 步骤2、在段头中找到第一个l2位置信息 步骤3、到l2块中根据执行插入操作进程pid号,做hash运算,得到一个随机数n,在l2中,找到第n个l1块的位置信息。 步骤4、到第三步中确定的l1块中,再根据执行插入操作进程的pid号,做hash运算,得到一个随机数m,在l1中找到第m号数据块。 步骤5、向第m号数据块中插入。

小结:

  1. oracle通过cbc latch保护链表结构,通过buffer pin latch保护ba指向的buffer结构
  2. oracle通过位图结构将并发dml语句均匀分配到extent中不同的data blocks,从而提高数据库并发量

3、测试脚本用法解释

3.1、脚本下载地址

https://www.modb.pro/download/634246

3.2、使用方法解释

usage: pg_page_extend_test_20220622 -t/-b -ls/-du explain: -t: stop by number of tuples -b: stop by number of blocks -ls/-du: check filesize method by ls/du -nocr/-cr: whether recreate the table or not

4、page扩展规律测试-du判断文件大小

4.1、测试on pg9

### 执行脚本 [postgres@enmo ~]$ sh pg_page_extend_test.sh -b 999999 -du -cr ### 测试结果 | inc_number | file_size(8k) | add_size(8k) | file_name | pg_version | | ---------- | ------------- | ------------ | -------------------------------- | ------------------------ | | 1 | 1 | 1 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 2 | 2 | 1 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 3 | 3 | 1 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 4 | 4 | 1 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 5 | 5 | 1 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 6 | 6 | 1 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 7 | 7 | 1 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 8 | 8 | 1 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 9 | 16 | 8 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 10 | 32 | 16 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 11 | 64 | 32 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 12 | 128 | 64 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 13 | 256 | 128 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 14 | 512 | 256 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 15 | 1024 | 512 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 16 | 2048 | 1024 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 17 | 4096 | 2048 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 18 | 8192 | 4096 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 19 | 16384 | 8192 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 20 | 32768 | 16384 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 21 | 65536 | 32768 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 | | 22 | 131072 | 65536 | /u01/pg9/pgdata/base/13323/16502 | psql (postgresql) 9.6.24 |

4.2、测试on pg15

### 执行脚本 [postgres@enmo ~]$ sh pg_page_extend_test.sh -b 999999 -du -cr ### 测试结果 | inc_number | file_size(8k) | add_size(8k) | file_name | pg_version | | ---------- | ------------- | ------------ | ----------------------------- | ------------------------- | | 1 | 1 | 1 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 2 | 2 | 1 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 3 | 3 | 1 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 4 | 4 | 1 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 5 | 5 | 1 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 6 | 6 | 1 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 7 | 7 | 1 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 8 | 8 | 1 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 9 | 16 | 8 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 10 | 32 | 16 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 11 | 64 | 32 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 12 | 128 | 64 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 13 | 256 | 128 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 14 | 512 | 256 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 15 | 1024 | 512 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 16 | 2048 | 1024 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 17 | 4096 | 2048 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 18 | 8192 | 4096 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 19 | 16384 | 8192 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 20 | 32768 | 16384 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 21 | 65536 | 32768 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 | | 22 | 131072 | 65536 | /u01/pg15/pgdata/base/5/58048 | psql (postgresql) 15beta1 |

小结:

  1. pg中的page扩展规则为 pages = pages < 8 ? pages : 2*pages ??? --不正确
  2. oracle工程师看到这里,会觉得比较熟悉,原来pa和oracle比较类似,通过增加空pages从而提高系统并发性。–和预期结果一样,不一定正确

5、page扩展规律测试-ls判断文件大小

5.1、测试on pg9

### 执行脚本 [postgres@enmo ~]$ sh pg_page_extend_test.sh -b 999999 -ls ### 测试结果 | inc_number | file_size(8k) | add_size(8k) | file_name | pg_version | | ---------- | ------------- | ------------ | -------------------------------- | ------------------------ | | 1 | 1 | 1 | /u01/pg9/pgdata/base/13323/16481 | psql (postgresql) 9.6.24 | | 2 | 2 | 1 | /u01/pg9/pgdata/base/13323/16481 | psql (postgresql) 9.6.24 | | 3 | 3 | 1 | /u01/pg9/pgdata/base/13323/16481 | psql (postgresql) 9.6.24 | | 4 | 4 | 1 | /u01/pg9/pgdata/base/13323/16481 | psql (postgresql) 9.6.24 | | 5 | 5 | 1 | /u01/pg9/pgdata/base/13323/16481 | psql (postgresql) 9.6.24 | | 6 | 6 | 1 | /u01/pg9/pgdata/base/13323/16481 | psql (postgresql) 9.6.24 | | 7 | 7 | 1 | /u01/pg9/pgdata/base/13323/16481 | psql (postgresql) 9.6.24 | | 8 | 8 | 1 | /u01/pg9/pgdata/base/13323/16481 | psql (postgresql) 9.6.24 | ... | 27 | 27 | 1 | /u01/pg9/pgdata/base/13323/16481 | psql (postgresql) 9.6.24 | | 45 | 54098 | 1 | /u01/pg9/pgdata/base/13323/16481 | psql (postgresql) 9.6.24 | ... | 75 | 108182 | 1 | /u01/pg9/pgdata/base/13323/16481 | psql (postgresql) 9.6.24 |

5.2、测试on pg15

### 执行脚本 [postgres@enmo ~]$ sh pg_page_extend_test.sh -b 999999 -ls ### 测试结果 | inc_number | file_size(8k) | add_size(8k) | file_name | pg_version | | ---------- | ------------- | ------------ | ----------------------------- | ------------------------- | | 1 | 1 | 1 | /u01/pg15/pgdata/base/5/41580 | psql (postgresql) 15beta1 | | 2 | 2 | 1 | /u01/pg15/pgdata/base/5/41580 | psql (postgresql) 15beta1 | | 3 | 3 | 1 | /u01/pg15/pgdata/base/5/41580 | psql (postgresql) 15beta1 | | 4 | 4 | 1 | /u01/pg15/pgdata/base/5/41580 | psql (postgresql) 15beta1 | | 5 | 5 | 1 | /u01/pg15/pgdata/base/5/41580 | psql (postgresql) 15beta1 | | 6 | 6 | 1 | /u01/pg15/pgdata/base/5/41580 | psql (postgresql) 15beta1 | | 7 | 7 | 1 | /u01/pg15/pgdata/base/5/41580 | psql (postgresql) 15beta1 | | 8 | 8 | 1 | /u01/pg15/pgdata/base/5/41580 | psql (postgresql) 15beta1 | .... | 93 | 54146 | 1 | /u01/pg15/pgdata/base/5/41580 | psql (postgresql) 15beta1 | .... | 137 | 108232 | 1 | /u01/pg15/pgdata/base/5/41580 | psql (postgresql) 15beta1 |

5.3、测试第9个page产生-on pg15

[postgres@enmo ~]$ sh pg_page_extend_test.sh -b 9 -ls will drop and create table pg_page_extend_test_20220622,pls confirm?(yes/no):yes | inc_number | file_size(8k) | add_size(8k) | file_name | pg_version | | ---------- | ------------- | ------------ | ----------------------------- | ------------------------- | | 1 | 1 | 1 | /u01/pg15/pgdata/base/5/41513 | psql (postgresql) 15beta1 | | 2 | 2 | 1 | /u01/pg15/pgdata/base/5/41513 | psql (postgresql) 15beta1 | | 3 | 3 | 1 | /u01/pg15/pgdata/base/5/41513 | psql (postgresql) 15beta1 | | 4 | 4 | 1 | /u01/pg15/pgdata/base/5/41513 | psql (postgresql) 15beta1 | | 5 | 5 | 1 | /u01/pg15/pgdata/base/5/41513 | psql (postgresql) 15beta1 | | 6 | 6 | 1 | /u01/pg15/pgdata/base/5/41513 | psql (postgresql) 15beta1 | | 7 | 7 | 1 | /u01/pg15/pgdata/base/5/41513 | psql (postgresql) 15beta1 | | 8 | 8 | 1 | /u01/pg15/pgdata/base/5/41513 | psql (postgresql) 15beta1 | | 9 | 9 | 1 | /u01/pg15/pgdata/base/5/41513 | psql (postgresql) 15beta1 | t_insert_count: 1481 128k /u01/pg15/pgdata/base/5/41513 -rw------- 1 postgres dba 72k jun 26 19:10 /u01/pg15/pgdata/base/5/41513 [postgres@enmo ~]$

5.4、du/ls检查文件大小–结果不一致

image-20221028225344544

小结:

  1. 当使用ls检查文件大小时,pg中的page扩展规则为 pages
  2. 分别使用ls/du获取文件大小,得到的page扩展规则不一致,哪个正确?
  3. 当产生第9个pages时,du/ls 获取的文件大小不一致?

6、为什么du/ls 结果不一样

6.1、sparse file解释

稀疏文档又称稀疏文件(英语:sparse file),是一种计算机文件,它能尝试在文件内容大多为空时更有效率地使用文件系统的空间。它的原理是以简短的信息(元数据)表示空数据块,而不是在在磁盘上占用实际空间来存储空数据块。只有真实(非空)的数据块会按原样写入磁盘。 https://baike.baidu.com/item/稀疏文档/23316000?fromtitle=稀疏文件&fromid=1600319&fr=aladdin

6.2、sparse file测试

[root@enmo ~]# truncate -s 512m foo [root@enmo ~]# cat foo >bar [root@enmo ~]# ls -lh foo bar -rw-r--r-- 1 root root 512m jun 25 05:03 bar -rw-r--r-- 1 root root 512m jun 25 05:03 foo [root@enmo ~]# du foo bar 0 foo 524288 bar [root@enmo ~]# du -b foo bar 536870912 foo 536870912 bar [root@enmo ~]# we have two files both containing 512mb of zeros. the first one is stored sparse and does not use any disk space, while the second stores each byte explicitly on disk. -- same file, but completely different disk usage.

6.3、验证是否为sparse file

[postgres@enmo ~]$ ls -lh /u01/pg15/pgdata/base/5/41516 -rw------- 1 postgres dba 72k jun 26 19:20 /u01/pg15/pgdata/base/5/41516 [postgres@enmo ~]$ du -sh /u01/pg15/pgdata/base/5/41516 128k /u01/pg15/pgdata/base/5/41516 [postgres@enmo ~]$ du -b /u01/pg15/pgdata/base/5/41516 73728 /u01/pg15/pgdata/base/5/41516 [postgres@enmo ~]$

7、什么原因造成的sparse file

7.1、检查文件系统类别

[postgres@enmo ~]$ df -ht filesystem type size used avail use% mounted on /dev/mapper/rhel_pg-root xfs 36g 21g 16g 58% /

7.2、xfs speculative preallocation 解释

https://xfs.org/index.php/xfs_faq#q:_why_do_files_on_xfs_use_more_data_blocks_than_expected.3f

7.3、xfs speculative preallocation规则解释

https://www.kernel.org/doc/documentation/filesystems/xfs.txt

7.4、使用speculative_prealloc_lifetime验证du/ls结果

### 检查默认值 [postgres@enmo ~]$ cat /proc/sys/fs/xfs/speculative_prealloc_lifetime 300 [postgres@enmo ~]$ ### 修改默认参数 [root@enmo ~]# echo 'fs.xfs.speculative_prealloc_lifetime=1' >> /etc/sysctl.conf [root@enmo ~]# sysctl -p [root@enmo ~]# cat /proc/sys/fs/xfs/speculative_prealloc_lifetime 1 [root@enmo ~]# ### 重启pg数据库 [postgres@enmo ~]$ pg_ctl stop waiting for server to shut down.... done server stopped [postgres@enmo ~]$ pg_ctl start waiting for server to start....2022-06-26 20:06:18.566 cst [35528] log: redirecting log output to logging collector process 2022-06-26 20:06:18.566 cst [35528] hint: future log output will appear in directory "log". done server started [postgres@enmo ~]$ ### 验证测试结果 [postgres@enmo ~]$ sh pg_page_extend_test.sh -b 9 -ls will drop and create table pg_page_extend_test_20220622,pls confirm?(yes/no):yes |inc_number|file_size(8k)|add_size(8k)|file_name|pg_version| |----|----|----|----|----| |1|1|1|/u01/pg15/pgdata/base/5/41534|psql (postgresql) 15beta1| |2|2|1|/u01/pg15/pgdata/base/5/41534|psql (postgresql) 15beta1| |3|3|1|/u01/pg15/pgdata/base/5/41534|psql (postgresql) 15beta1| |4|4|1|/u01/pg15/pgdata/base/5/41534|psql (postgresql) 15beta1| |5|5|1|/u01/pg15/pgdata/base/5/41534|psql (postgresql) 15beta1| |6|6|1|/u01/pg15/pgdata/base/5/41534|psql (postgresql) 15beta1| |7|7|1|/u01/pg15/pgdata/base/5/41534|psql (postgresql) 15beta1| |8|8|1|/u01/pg15/pgdata/base/5/41534|psql (postgresql) 15beta1| |9|9|1|/u01/pg15/pgdata/base/5/41534|psql (postgresql) 15beta1| t_insert_count: 1481 72k /u01/pg15/pgdata/base/5/41534 -rw------- 1 postgres dba 72k jun 26 20:06 /u01/pg15/pgdata/base/5/41534 [postgres@enmo ~]$ [postgres@enmo ~]$ [postgres@enmo ~]$ ls -lh /u01/pg15/pgdata/base/5/41534 -rw------- 1 postgres dba 72k jun 26 20:06 /u01/pg15/pgdata/base/5/41534 [postgres@enmo ~]$ du -sh /u01/pg15/pgdata/base/5/41534 72k /u01/pg15/pgdata/base/5/41534 [postgres@enmo ~]$

小结:

  1. du/ls结果不一致的问题为xfs文件系统 speculative preallocation特性造成sparse file
  2. 文件真实使用情况以ls查询文件大小为准

8、systemtap跟踪page扩展程序

​ 在debug pg源码时,我们需要设置断点 ,但断点设置在哪里这是一个问题,本文使用systemtap跟踪程序的方式梳理程序运行逻辑,判断调试程序断点位置。

8.1、安装systemtap

### systemtap安装步骤 yum -y install systemtap systemtap-runtime kernel-devel ### 得到glibc debug版本信息: rpm -qa | grep glibc rpm -qi glibc ### 下载内核调试包和glibc调试包 cd /soft/ wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-3.10.0-862.el7.x86_64.rpm wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-common-x86_64-3.10.0-862.el7.x86_64.rpm wget http://debuginfo.centos.org/7/x86_64/glibc-debuginfo-2.17-157.el7_3.1.x86_64.rpm wget http://debuginfo.centos.org/7/x86_64/glibc-debuginfo-common-2.17-157.el7_3.1.x86_64.rpm ### 安装 rpm -ivh *.prm

8.2、在什么时间跟踪程序?

通过上文分析,产生第9个blocks时,需要插入数据 1481个tuples,我们测试插入1480行数据,然后跟踪第1481行数据插入过程所执行的函数。

8.3、sess_1模拟插入 1480行数据

### 模拟插入 1480行数据 |inc_number|file_size(8k)|add_size(8k)|file_name|pg_version| |----|----|----|----|----| |1|1|1|/u01/pg15/pgdata/base/5/41589|psql (postgresql) 15beta1| |2|2|1|/u01/pg15/pgdata/base/5/41589|psql (postgresql) 15beta1| |3|3|1|/u01/pg15/pgdata/base/5/41589|psql (postgresql) 15beta1| |4|4|1|/u01/pg15/pgdata/base/5/41589|psql (postgresql) 15beta1| |5|5|1|/u01/pg15/pgdata/base/5/41589|psql (postgresql) 15beta1| |6|6|1|/u01/pg15/pgdata/base/5/41589|psql (postgresql) 15beta1| |7|7|1|/u01/pg15/pgdata/base/5/41589|psql (postgresql) 15beta1| |8|8|1|/u01/pg15/pgdata/base/5/41589|psql (postgresql) 15beta1| t_insert_count: 1480 64k /u01/pg15/pgdata/base/5/41589 -rw------- 1 postgres dba 64k jun 26 22:21 /u01/pg15/pgdata/base/5/41589 insert into pg_page_extend_test_20220622 values(1) ; select pg_backend_pid(); [postgres@enmo ~]$ psql psql (15beta1) type "help" for help. postgres=# select pg_backend_pid(); pg_backend_pid ---------------- 56776 (1 row) postgres=#

8.4、sess_2跟踪pid of sess_1

[root@enmo ~]# cat pg_func.stp probe process("/u01/pg15/pgsql/bin/postgres").function("*") { printf("%d\t%s: %s\n", pid(), execname(), ppfunc()); } [root@enmo ~]# stap pg_func.stp > stap.out

8.5、sess_3执行插入sql

postgres=# insert into pg_page_extend_test_20220622 values(1) ; insert 0 1 postgres=#

8.6、检查跟踪结果

[root@enmo ~]# egrep -i 'extend' stap.out |sort|uniq -c 1 66045 postgres: extendclog 1 66045 postgres: extendcommitts 1 66045 postgres: extendsubtrans 31 66045 postgres: lockacquireextended 1 66045 postgres: pageadditemextended 1 66045 postgres: rangevargetrelidextended 41 66045 postgres: readbufferextended 1 66045 postgres: mdextend --- 重点关注函数 1 66045 postgres: relation_openrv_extended 1 66045 postgres: smgrextend --- 重点关注函数 1 66045 postgres: table_openrv_extended [root@enmo ~]#

9、源码分析——page扩展规律总结

9.1、call stack

### call stack filewrite fd.c:2215 <--after this step,new page created mdextend md.c:449 smgrextend smgr.c:496 readbuffer_common bufmgr.c:986 readbufferextended bufmgr.c:770 readbufferbi hio.c:96 relationgetbufferfortuple hio.c:624 heap_insert heapam.c:2051 heapam_tuple_insert heapam_handler.c:252 table_tuple_insert tableam.h:1376 execinsert nodemodifytable.c:1058 execmodifytable nodemodifytable.c:3700 execprocnodefirst execprocnode.c:463 execprocnode executor.h:259 executeplan execmain.c:1636 standard_executorrun execmain.c:363 executorrun execmain.c:307 processquery pquery.c:160 portalrunmulti pquery.c:1277 portalrun pquery.c:791 exec_simple_query postgres.c:1250 postgresmain postgres.c:4544 backendrun postmaster.c:4504 backendstartup postmaster.c:4232 serverloop postmaster.c:1806 postmastermain postmaster.c:1478 main main.c:202

9.2、核心函数分析

image-20221028225426490

注:

  1. 源码位置: ./src/backend/access/heap/hio.c

  2. 以上程序流程图为简化版

10、测试验证

单进程测试时page扩展规律为pages ,以源码分析结论为指导,这次我们测试一次扩展512个pages,

10.1、session1: 断点位置 hio.c: 624

[postgres@enmo ~]$ sh pg_page_extend_test.sh -t 1480 -ls -cr may drop and create table pg_page_extend_test_20220622,pls confirm?(yes/no):yes |inc_number|file_size(8k)|add_size(8k)|file_name|pg_version| |----|----|----|----|----| |1|1|1|/u01/pg15/pgdata/base/5/58027|psql (postgresql) 15beta1| |2|2|1|/u01/pg15/pgdata/base/5/58027|psql (postgresql) 15beta1| |3|3|1|/u01/pg15/pgdata/base/5/58027|psql (postgresql) 15beta1| |4|4|1|/u01/pg15/pgdata/base/5/58027|psql (postgresql) 15beta1| |5|5|1|/u01/pg15/pgdata/base/5/58027|psql (postgresql) 15beta1| |6|6|1|/u01/pg15/pgdata/base/5/58027|psql (postgresql) 15beta1| |7|7|1|/u01/pg15/pgdata/base/5/58027|psql (postgresql) 15beta1| |8|8|1|/u01/pg15/pgdata/base/5/58027|psql (postgresql) 15beta1| t_insert_count: 1480 64k /u01/pg15/pgdata/base/5/58027 -rw------- 1 postgres dba 64k jun 28 23:52 /u01/pg15/pgdata/base/5/58027 insert into pg_page_extend_test_20220622 values(1) ; select pg_backend_pid(); [postgres@enmo ~]$ psql psql (15beta1) type "help" for help. postgres=# select pg_backend_pid(); pg_backend_pid ---------------- 34494 (1 row) postgres=# insert into pg_page_extend_test_20220622 values(1) ; <--debug

10.2、其它进程:并发26个进程执行插入操作

for p_num in $(seq 1 26); do psql -q -c "insert into pg_page_extend_test_20220622 values(1)" & done [postgres@enmo ~]$ ps -fu postgres|egrep -i 'insert waiting'|grep -v grep |wc -l 26 [postgres@enmo ~]$

10.3、检查sess_1:

postgres=# insert into pg_page_extend_test_20220622 values(1) ; insert 0 1 postgres=# select count(1) from pg_page_extend_test_20220622; count ------- 1507 (1 row) postgres=# \q [postgres@enmo ~]$ ls -lk /u01/pg15/pgdata/base/5/58027 -rw------- 1 postgres dba 4276224 jun 29 01:26 /u01/pg15/pgdata/base/5/58027 [postgres@enmo ~]$ expr 4276224 / 8192 522 <-- 8 512 2,与预测结果一致 [postgres@enmo ~]$

11、思考总结

### 规则总结 pg数据库当freespace不足时,进程默认在文件末尾扩展一个page,扩展过程中如有阻塞,随阻塞数增加扩展pages数增加,最大一次扩展512 2个pages。 ### 优化建议 pages扩展多少是在性能与存储之间平衡,建议可综合参考oracle的扩展规则,在大并发量insert场景可有效减少系统阻塞。

12、参考资料

1. waitevent latch cache buffers chains reference note (doc id 2098064.1).pdf 2. waitevent buffer busy waits reference note (doc id 34405.1).pdf 3. 《oracle内核技术揭密》 4. https://xfs.org/index.php/xfs_faq#q:_why_do_files_on_xfs_use_more_data_blocks_than_expected.3f 5. https://www.kernel.org/doc/documentation/filesystems/xfs.txt
最后修改时间:2023-05-23 08:41:28
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【米乐app官网下载的版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

网站地图