Skip to content

Commit d47c722

Browse files
committed
feat(pgsql): param node_hugepage_count accepts value -1 to set hugepage automatically (only PG 15+)
nr_hugepages calculated by `shared_memory_size_in_huge_pages` if `node_hugepage_count` or `node_hugepage_ratio` changed, it will full backup the pg_cls and restart it gracefully support usage: - `pig install` - `bin/pgsql-add <pg_cls>` - `bin/pgsql-add <pg_cls> <ip>` only new nodes changed and restarted - `pgsql.yml -l <pg_cls> -t pg_hugepage` calculation rules: 1. `shared_memory_size_in_huge_pages` (from PG15+): if `node_hugepage_count` is -1 and huge_pages (from PG) != off 2. if `node_hugepage_count` > 0 - `shared_memory_size_in_huge_pages`: if `shared_memory_size_in_huge_pages` > `node_hugepage_count` - `node_hugepage_count` 3. disable hugepage if `node_hugepage_count` is 0 4. if `node_hugepage_ratio` > 0 - `shared_memory_size_in_huge_pages`: if `shared_memory_size_in_huge_pages` > pages calculated from `node_hugepage_ratio` - page value calculated from `node_hugepage_ratio` All above rules and usages are tested successfully on Rocky Linux 9
1 parent c71460f commit d47c722

File tree

3 files changed

+79
-1
lines changed

3 files changed

+79
-1
lines changed

roles/node/defaults/main.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ node_disable_swap: false # disable node swap, use with caution
3838
node_static_network: true # preserve dns resolver settings after reboot
3939
node_disk_prefetch: false # setup disk prefetch on HDD to increase performance
4040
node_kernel_modules: [ softdog, br_netfilter, ip_vs, ip_vs_rr, ip_vs_wrr, ip_vs_sh ]
41-
node_hugepage_count: 0 # number of 2MB hugepage, take precedence over ratio
41+
node_hugepage_count: 0 # number of 2MB hugepage, take precedence over ratio,
42+
# -1: use shared_memory_size_in_huge_pages calculated by pg (PG 15+ available)
4243
node_hugepage_ratio: 0 # node mem hugepage ratio, 0 disable it by default
4344
node_overcommit_ratio: 0 # node mem overcommit ratio, 0 disable it by default
4445
node_tune: oltp # node tuned profile: none,oltp,olap,crit,tiny

roles/pgsql/tasks/main.yml

+15
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,21 @@
5555
tags: [ patroni, pg_launch ]
5656
when: patroni_enabled|bool
5757

58+
#--------------------------------------------------------------#
59+
# pg hugepages [pg_hugepage]
60+
#--------------------------------------------------------------#
61+
- import_tasks: pg_hugepage.yml
62+
when: patroni_enabled|bool
63+
tags: [ patroni, pg_launch, pg_hugepage ]
64+
65+
#--------------------------------------------------------------#
66+
# patroni restart pg_cls gracefully [pt_restart]
67+
#--------------------------------------------------------------#
68+
- name: patroni restart pg_cls gracefully
69+
include_tasks: grace_patroni_restart.yml
70+
when: patroni_enabled|bool and (pt_restart is defined and pt_restart|bool)
71+
tags: [ patroni, pg_launch, pt_restart, pg_hugepage ]
72+
5873
#--------------------------------------------------------------#
5974
# Users [pg_user]
6075
#--------------------------------------------------------------#

roles/pgsql/tasks/pg_hugepage.yml

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
---
2+
#--------------------------------------------------------------#
3+
# Enable hugepage for pg and restart pg cluster [pg_hugepage]
4+
# if `node_hugepage_count` or `node_hugepage_ratio` changed, it will full backup the pg_cls and restart it gracefully
5+
# support usage:
6+
# - `pig install`
7+
# - `bin/pgsql-add <pg_cls>`
8+
# - `pgsql.yml -l <pg_cls> -t pg_hugepage`
9+
#--------------------------------------------------------------#
10+
# calculation rules:
11+
# 1. `shared_memory_size_in_huge_pages` (from PG15+): if `node_hugepage_count` is -1 and huge_pages (from PG) != off
12+
# 2. if `node_hugepage_count` > 0
13+
# - `shared_memory_size_in_huge_pages`: if `shared_memory_size_in_huge_pages` > `node_hugepage_count`
14+
# - `node_hugepage_count`
15+
# 3. disable hugepage if `node_hugepage_count` is 0
16+
# 4. if `node_hugepage_ratio` > 0
17+
# - `shared_memory_size_in_huge_pages`: if `shared_memory_size_in_huge_pages` > pages calculated from `node_hugepage_ratio`
18+
# - page value calculated from `node_hugepage_ratio`
19+
# All above rules and usages are tested successfully on Rocky Linux 9
20+
#--------------------------------------------------------------#
21+
22+
- name: Set default value
23+
set_fact:
24+
curr_nr_hugepages: 0
25+
new_nr_hugepages: 0
26+
changed_when: false
27+
28+
29+
- name: enable hugepage for pg
30+
tags: pg_hugepage
31+
vars:
32+
block:
33+
- import_tasks: util/pg_read_hugepage.yml
34+
35+
- name: calculate hugepage need update
36+
set_fact:
37+
hugepages_need_update: "{{ new_nr_hugepages|int != curr_nr_hugepages|int }}"
38+
changed_when: false
39+
40+
- name: set pt_restart according to hugepages_need_update
41+
set_fact:
42+
pt_restart: "{{ hugepages_need_update|bool }}"
43+
changed_when: false
44+
45+
- name: print nr_hugepages values
46+
when: new_nr_hugepages is defined and curr_nr_hugepages is defined
47+
debug:
48+
msg: |
49+
curr_nr_hugepages: {{ curr_nr_hugepages|trim }}, new_nr_hugepages: {{ new_nr_hugepages|trim }},
50+
hugepages_need_update: {{ hugepages_need_update|bool }},
51+
pt_restart: {{ pt_restart|bool }}
52+
changed_when: false
53+
54+
- name: full backup pg before hugepage update if has primary
55+
include_tasks: util/pg_backup.yml
56+
when: hugepages_need_update|bool and pg_role == 'primary'
57+
58+
- name: update hugepage
59+
include_tasks: util/pg_write_hugepage.yml
60+
when: hugepages_need_update|bool
61+
62+
...

0 commit comments

Comments
 (0)