Postgresใƒ—ใƒญใ‚ปใ‚นใฎใƒกใƒขใƒชใ‚ณใ‚นใƒˆใฎๆธฌๅฎš

ใ“ใ‚Œใฏใ€Postgresใฎๆœ€ๅผทใฎ้–‹็™บ่€…ใฎ1ไบบใงใ‚ใ‚‹AndresFreundใซใ‚ˆใ‚‹ๆŠ•็จฟใฎๅคงใพใ‹ใช็ฟป่จณใงใ™ใ€‚้–‹็™บ่€…ใŒๅผทใ„ใจใ„ใ†ไบ‹ๅฎŸใซๅŠ ใˆใฆใ€ใ“ใฎ่จ˜ไบ‹ใฏ้žๅธธใซ่ˆˆๅ‘ณๆทฑใ„ใ‚‚ใฎใงใ‚ใ‚Šใ€LinuxOSใŒใฉใฎใ‚ˆใ†ใซๆฉŸ่ƒฝใ™ใ‚‹ใ‹ใฎ่ฉณ็ดฐใ‚’ๆ˜Žใ‚‰ใ‹ใซใ—ใฆใ„ใพใ™ใ€‚





ใ‚ฐใƒชใƒƒใƒ‰ๅพŒใฎๆŽฅ็ถšใŒใƒกใƒขใƒชใ‚’ไฝฟใ„ใ™ใŽใ‚‹ใจใ„ใ†ไธปๅผตใ‚’่žใใฎใฏใ‚ˆใใ‚ใ‚‹ใ“ใจใงใ™ใ€‚ใ“ใ‚Œใฏใ€ใ‚ฏใƒฉใ‚คใ‚ขใƒณใƒˆๆŽฅ็ถšใ‚’ๅ‡ฆ็†ใ™ใ‚‹ใŸใ‚ใฎใƒ—ใƒญใ‚ปใ‚นใƒขใƒ‡ใƒซใ‚’ใ€ๅ„ๆŽฅ็ถšใŒๅˆฅใ€…ใฎใ‚นใƒฌใƒƒใƒ‰ใงๆไพ›ใ•ใ‚Œใ‚‹ๅˆฅใฎใƒขใƒ‡ใƒซใจๆฏ”่ผƒใ™ใ‚‹ใจใใซใ‚ˆใ่จ€ๅŠใ•ใ‚Œใพใ™ใ€‚





็งใซ้–ขใ—ใฆใฏใ€ใ“ใ“ใง่ญฐ่ซ–ใ™ใ‚‹ใ“ใจใŒใŸใใ•ใ‚“ใ‚ใ‚Šใพใ™ใ€‚ใ•ใ‚‰ใซใ€ใ„ใใคใ‹ใฎๆ”นๅ–„ใ‚’่กŒใ„ใ€ใƒกใƒขใƒชไฝฟ็”จ้‡ใ‚’ๆธ›ใ‚‰ใ™ใ“ใจใŒใงใใพใ™ใ€‚





ใƒกใƒขใƒชใ‚ชใƒผใƒใƒผใƒ˜ใƒƒใƒ‰ใซ้–ขใ™ใ‚‹ใ“ใฎๆ‡ธๅฟตใฏใ€topใ‚„psใชใฉใฎใƒฆใƒผใƒ†ใ‚ฃใƒชใƒ†ใ‚ฃใ‚’ไฝฟ็”จใ—ใฆใƒกใƒขใƒชๆถˆ่ฒป้‡ใ‚’ๆธฌๅฎšใ™ใ‚‹ๆœ€ใ‚‚็ฐกๅ˜ใชๆ–นๆณ•ใŒใ‹ใชใ‚Šใ ใพใ•ใ‚Œใฆใ„ใ‚‹ใจใ„ใ†1ใคใฎไธ€่ˆฌ็š„ใช็†็”ฑใซใ‚ˆใ‚‹ใ‚‚ใฎใ ใจๆ€ใ„ใพใ™ใ€‚





ๅฎŸ้š›ใ€ๆ–ฐใ—ใ„ๆŽฅ็ถšใ”ใจใซไฝฟ็”จใ•ใ‚Œใ‚‹ใƒกใƒขใƒชใŒใฉใฎใ‚ˆใ†ใซๅข—ๅŠ ใ™ใ‚‹ใ‹ใ‚’ๆธฌๅฎšใ™ใ‚‹ใ“ใจใฏ็‰นใซๅ›ฐ้›ฃใงใ™ใ€‚





ใ“ใฎๆŠ•็จฟใงใฏใ€LinuxใงๅฎŸ่กŒใ•ใ‚Œใฆใ„ใ‚‹Postgresใซใคใ„ใฆ่ชฌๆ˜Žใ—ใพใ™ใ€‚็งใŒๆœ€ใ‚‚็ตŒ้จ“ใ‚’็ฉใ‚“ใ ใฎใฏใ“ใฎๆ–นๅ‘ใงใ™ใ€‚





็ถš่กŒใ™ใ‚‹ๅ‰ใซใ€ๆญฃ็ขบใงๆญฃ็ขบใชๆธฌๅฎšใงใฏใ€1ใคใฎๆŽฅ็ถšใฎใ‚ชใƒผใƒใƒผใƒ˜ใƒƒใƒ‰ใŒ2MiBๆœชๆบ€ใงใ‚ใ‚‹ใ“ใจใ‚’ๅผท่ชฟใ—ใŸใ„ใจๆ€ใ„ใพใ™๏ผˆๆŠ•็จฟใฎๆœ€ๅพŒใซใ‚ใ‚‹็ต่ซ–ใ‚’ๅ‚็…งใ—ใฆใใ ใ•ใ„๏ผ‰ใ€‚





ไธ€่ฆ‹

, , ( ). (huge pages), . . , Postgres:





andres@awork3:~$ psql
postgres[2003213][1]=# SELECT pg_backend_pid();
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ pg_backend_pid โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚        2003213 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
(1 row)

andres@awork3:~/src/postgresql$ ps -q 2003213 -eo pid,rss
    PID   RSS
2003213 16944
      
      



16MiB.





!?! ,

. , pgprewarm, (shared buffers):





postgres[2003213][1]=# SHOW shared_buffers ;
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ shared_buffers โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 16GB           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
(1 row)

postgres[2003213][1]=# SELECT SUM(pg_prewarm(oid, 'buffer')) FROM pg_class WHERE relfilenode <> 0;
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  sum   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 383341 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

andres@awork3:~$ ps -q 2003213 -eo pid,rss
    PID   RSS
2003213 3169144
      
      



3GB. , , . , :





postgres[2003213][1]=# SELECT pg_size_pretty(SUM(pg_relation_size(oid))) FROM pg_class WHERE relfilenode <> 0;
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ pg_size_pretty โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 2995 MB        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
(1 row)
      
      



, , :





postgres[3244960][1]=# SELECT sum(abalance) FROM pgbench_accounts ;
โ”Œโ”€โ”€โ”€โ”€โ”€โ”
โ”‚ sum โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚   0 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”˜
(1 row)

andres@awork3:~/src/postgresql$ ps -q 3244960 -eo pid,rss
    PID   RSS
3244960 2700372
      
      



, Postgres 3GB 2.7GB . , huge_pages=off, ps (shred - ) , . .





- 4KiB, , 2MiB.





, , . Debian wiki .





huge_pages=on, . , " ":





andres@awork3:~$ ps -q 3245907 -eo pid,rss
    PID   RSS
3245907  7612
      
      



, 7MiB. (page table) , - , 512 (4KiB * 512 = 2MiB).





:





postgres[3245843][1]=# ;SELECT SUM(pg_prewarm(oid, 'buffer')) FROM pg_class WHERE relfilenode <> 0;
โ€ฆ
postgres[3245851][1]=# SELECT sum(abalance) FROM pgbench_accounts ;
โ€ฆ

andres@awork3:~$ ps -q 3245907,3245974 -eo pid,rss
    PID   RSS
3245907 12260
3245974  8936
      
      



, 12MiB 9MiB , 3GiB 2.7GiB.





.





, Linux , , : RSS ps top.





4.5, /proc/$pid/status :





  • VmRSS . (VmRSS = RssAnon + RssFile + RssShmem)





  • RssAnon .





  • RssFile .





  • RssShmem ( SysV shm, tmpfs )





andres@awork3:~$ grep -E '^(Rss|HugetlbPages)' /proc/3247901/status
RssAnon:	    2476 kB
RssFile:	    5072 kB
RssShmem:	    8520 kB
HugetlbPages:	       0 kB

postgres[3247901][1]=# SELECT SUM(pg_prewarm(oid, 'buffer')) FROM pg_class WHERE relfilenode <> 0;

andres@awork3:~$ ps -q 3247901 -eo pid,rss
    PID   RSS
3247901 3167164

andres@awork3:~$ grep -E '^(Rss|HugetlbPages)' /proc/3247901/status
RssAnon:	    3148 kB
RssFile:	    9212 kB
RssShmem:	 3154804 kB
HugetlbPages:	       0 kB
      
      



RssAnon "" , .. . RssFile , postgres. RssShmem .





ps - - .





, huge_pages=on:





andres@awork3:~$ grep -E '^(Rss|HugetlbPages)' /proc/3248101/status
RssAnon:	    2476 kB
RssFile:	    4664 kB
RssShmem:	       0 kB
HugetlbPages:	  778240 kB

postgres[3248101][1]=# SELECT SUM(pg_prewarm(oid, 'buffer')) FROM pg_class WHERE relfilenode <> 0;

andres@awork3:~$ grep -E '^(Rss|HugetlbPages)' /proc/3248101/status
RssAnon:	    3136 kB
RssFile:	    8756 kB
RssShmem:	       0 kB
HugetlbPages:    3846144 kB
      
      



, . :





, RssFile - (Postgres mmap() - ). .





, RssAnon . ps , postgres ( postmaster). Linux ( fork()), Copy-on-Write , .





, . , 4.14 ( ) /proc/$pid/smaps_rollup . Pss " " ( smaps_rollups Pss ). , .





postgres[2004042][1]=# SELECT SUM(pg_prewarm(oid, 'buffer')) FROM pg_class WHERE relfilenode <> 0;
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  sum   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 383341 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
(1 row)

postgres[2004042][1]=# SHOW huge_pages ;
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ huge_pages โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ off        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
(1 row)

andres@awork3:~$ grep ^Pss /proc/2004042/smaps_rollup
Pss:             3113967 kB
Pss_Anon:           2153 kB
Pss_File:           3128 kB
Pss_Shmem:       3108684 kB
      
      



Pss_Anon , Pss_File , Pss_Shmem ( ) .





, . pgbench (scale 1000, -S -M prepared -c 1024) :





postgres[2004042][1]=# SELECT count(*) FROM pg_stat_activity ;
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ count โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  1030 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
(1 row)

postgres[2004042][1]=# SELECT pid FROM pg_stat_activity WHERE application_name = 'pgbench' ORDER BY random() LIMIT 1;
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   pid   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 3249913 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
(1 row)

andres@awork3:~$ grep ^Pss /proc/3249913/smaps_rollup
Pss:                4055 kB
Pss_Anon:           1185 kB
Pss_File:              6 kB
Pss_Shmem:          2863 kB
      
      



huge_pages=on:





andres@awork3:~$ grep ^Pss /proc/2007379/smaps_rollup
Pss:                1179 kB
Pss_Anon:           1173 kB
Pss_File:              6 kB
Pss_Shmem:             0 kB
      
      



Pss , . , . `/proc/$pid/status`.





, , VmPTE ( ) , Vm* , VmStk copy-on-write.





, huge_pages=off:





andres@awork3:~$ grep ^VmPTE /proc/2004042/status
VmPTE:      6480 kB
      
      



huge_pages=on:





VmPTE:	     132 kB
      
      



- , , .





ใ“ใ‚Œใ‚‰ใฎๆธฌๅฎšใซๅŸบใฅใ„ใฆใ€ใ‹ใชใ‚Šๅ˜็ด”ใช่ชญใฟๅ–ใ‚Šๅฐ‚็”จOLTPใƒญใƒผใƒ‰ใ‚’ๅฎŸ่กŒใ™ใ‚‹ใƒ—ใƒญใ‚ปใ‚นใซใฏใ€VmPTEใซPss_Anonใ‚’ๅซใ‚ใ‚‹ใจใ€huge_pages =ใ‚ชใƒ•ใง็ด„7.6MiBใ€huge_pages =ใ‚ชใƒณใง็ด„1.3MiBใฎใ‚ชใƒผใƒใƒผใƒ˜ใƒƒใƒ‰ใŒใ‚ใ‚‹ใจๆƒณๅƒใงใใพใ™ใ€‚





ใ‚ใ‚‹็จฎใฎใ€Œ่ฆ‹ใˆใชใ„ใ€ใ‚ชใƒผใƒใƒผใƒ˜ใƒƒใƒ‰ใ‚„ใ€ใƒใƒƒใƒ•ใ‚กๅ†…ใฎๅคง้‡ใฎใƒ‡ใƒผใ‚ฟใชใฉใŒใ‚ใ‚‹ใจๆƒณๅƒใ—ใฆใ‚‚ใ€ๆŽฅ็ถšใ‚ชใƒผใƒใƒผใƒ˜ใƒƒใƒ‰ใฏ2MiBๆœชๆบ€ใงใ‚ใ‚‹ใจใ„ใ†ไปฅๅ‰ใฎใ‚นใƒ†ใƒผใƒˆใƒกใƒณใƒˆใซๆˆปใ‚‹ใจๆ€ใ„ใพใ™ใ€‚





็ฟป่จณ่€…ใ‹ใ‚‰ใฎ่ฃœ่ถณใ€‚Postgres 14ใงใฏใ€Postgres่‡ชไฝ“ใฎ่ฆณ็‚นใ‹ใ‚‰็พๅœจใฎใƒ—ใƒญใ‚ปใ‚นใซใ‚ˆใ‚‹่ฉณ็ดฐใชใƒกใƒขใƒชไฝฟ็”จ็އใ‚’็คบใ™ๆ–ฐใ—ใ„pg_backend_memory_contextsใƒ“ใƒฅใƒผใŒๅฐŽๅ…ฅใ•ใ‚Œใฆใ„ใพใ™ใ€‚








All Articles