1、研究方法概述
本文通过回顾oracle内核原理,指导分析和研究pg15数据库,oracle通过位图结构将并发dml语句均匀分配到extent中不同的data blocks,从而提高数据库并发量,pg中是否会预分配大量空pages从而提高数据库的并发呢?这是一个问题,待下文分析?
2、oracle 原理回顾
2.1、buffer访问机制
步骤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位图原理
步骤1、查找数据字典,确定段头位置 步骤2、在段头中找到第一个l2位置信息 步骤3、到l2块中根据执行插入操作进程pid号,做hash运算,得到一个随机数n,在l2中,找到第n个l1块的位置信息。 步骤4、到第三步中确定的l1块中,再根据执行插入操作进程的pid号,做hash运算,得到一个随机数m,在l1中找到第m号数据块。 步骤5、向第m号数据块中插入。
小结:
- oracle通过cbc latch保护链表结构,通过buffer pin latch保护ba指向的buffer结构
- 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 |
小结:
- pg中的page扩展规则为 pages = pages < 8 ? pages : 2*pages ??? --不正确
- 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检查文件大小–结果不一致
小结:
- 当使用ls检查文件大小时,pg中的page扩展规则为 pages
- 分别使用ls/du获取文件大小,得到的page扩展规则不一致,哪个正确?
- 当产生第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 ~]$
小结:
- du/ls结果不一致的问题为xfs文件系统 speculative preallocation特性造成sparse file
- 文件真实使用情况以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、核心函数分析
注:
源码位置: ./src/backend/access/heap/hio.c
以上程序流程图为简化版
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
【米乐app官网下载的版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。