性能參數(shù)調(diào)優(yōu)
AnalyticDB PostgreSQL版是一個開箱即用的產(chǎn)品,默認配置就適用大多數(shù)應用場景,但是您依然可以通過數(shù)據(jù)庫配置參數(shù)對系統(tǒng)進行微調(diào),以更好的性能滿足特定的業(yè)務場景。
參數(shù)生效級別
AnalyticDB PostgreSQL的參數(shù)分為如下四個級別,部分參數(shù)只能在固定級別設置。
級別 | 生效范圍 | 設置方法 |
SYSTEM級別 | 對該實例的所有庫所有用戶生效。 | 需要提交工單,由運維人員協(xié)助修改。 |
DATABASE級別 | 對設置的數(shù)據(jù)庫的所有會話生效。 | 設置命令如下:
|
ROLE級別 | 對設置的用戶的所有會話生效。 | 設置命令如下:
|
SESSION級別 | 對當前會話生效。 | 設置命令如下:
|
目前支持提交工單修改的SYSTEM層參數(shù)如下:
參數(shù)名 | 默認值 | 單位 | 取值范圍 |
gp_autostats_mode | ON_NO_STATS | STRING | [NONE|ON_CHANGE|ON_NO_STATS] |
gp_autostats_mode_in_functions | NONE | STRING | [NONE|ON_CHANGE|ON_NO_STATS] |
gp_max_slices | 50 | INT | [0~1000] |
log_rotation_size | 102400 | kB | [0~4194304] |
master.rds_enable_vmem_protect | on | STRING | [on|off] |
master.rds_max_non_super_conns | 500 | INT | [10~1000] |
max_stack_depth | 2048 | kB | [100~2048000] |
max_statement_mem | 2048000 | kB | [32768~2147483647] |
optimizer | on | STRING | [on|off] |
random_page_cost | 4 | DOUBLE | [0~1000] |
rds.rds_enable_aliyun_oss_endpoint | on | STRING | [on|off] |
rds.rds_enable_oss_endpoint_whitelist_check | on | STRING | [on|off] |
rds_max_super_conns | 50 | INT | [10~100] |
segment.rds_enable_vmem_proctect | off | STRING | [on|off] |
segment.rds_max_non_super_conns | 1000 | INT | [10~3000] |
statement_mem | 2047000 | kB | [50~2147483647] |
statement_timeout | 10800000 | INT | [0~2147483647] |
上述參數(shù)的具體介紹,請參見配置參數(shù)。
建議您優(yōu)先適用SESSION級別設置參數(shù),當確認不會對業(yè)務其他用戶產(chǎn)生副作用時,再設置為更高級別的參數(shù)。
參數(shù)說明
AnalyticDB PostgreSQL與性能有關(guān)的參數(shù)可以分為以下幾類:
連接相關(guān)參數(shù)
參數(shù)
生效條件
依賴關(guān)系
描述
max_connections
重啟實例生效
Segment節(jié)點的值需要是Master節(jié)點的3~5倍。
max_connections與數(shù)據(jù)庫服務器并發(fā)連接的最大數(shù)量,是實例連接總數(shù)的硬性值,在master和segment上需要分布設置,一般不建議調(diào)整這個值,而是調(diào)整rds_max_non_super_conns,目前初始值是500,如果業(yè)務的并發(fā)短連接的場景,可以適當調(diào)大這個值,但最大不超過max_connections的值;rds_max_super_conns是super user的連接控制參數(shù),一般也不需要調(diào)整。
max_prepared_transactions
重啟實例生效
推薦與max_connections一致。
max_prepared_transactions參數(shù)的值乘以2應大于rds_max_non_super_conns加rds_max_super_conns的值。
這個參數(shù)是實例中處于兩階段提交狀態(tài)的事務數(shù),初始設置為與max_connections的大小一致,如果在高并發(fā)的場景下報錯,需要增加這個值。
rds_max_non_super_conns
Reload Config生效
應小于max_connections的值。
rds_max_non_super_conns的值與rds_max_super_conns的值的和應小于等于max_connections的值。
Segment節(jié)點的值需要是Master節(jié)點的3~5倍。
非super user用戶最多可用連接數(shù)。
rds_max_super_conns
Reload Config生效
應小于max_connections的值。
rds_max_non_super_conns的值與rds_max_super_conns的值的和應小于等于max_connections的值。
Segment節(jié)點的值需要是Master節(jié)點的3~5倍。
super user用戶最多可用連接數(shù)。
內(nèi)存控制參數(shù)
參數(shù)
取值范圍
生效條件
依賴關(guān)系
描述
shared_buffers
千字節(jié)數(shù)
重啟實例生效
行存為主條件下,Segment值設置為實例內(nèi)存規(guī)格的25%,可適當增大。
這個參數(shù)主要是控制共享緩沖區(qū)大小,需要在Master和Segment上分別進行設置。Master上的緩存頁面主要是數(shù)據(jù)字典表,Segment上緩存頁面主要行存表,AOCS表不受共享緩沖區(qū)的影響。一般情況下不需要用戶修改這個值。如果業(yè)務創(chuàng)建的表較多(>10萬)考慮在Master和Segment上增加這個值;如果存儲以行存表為主,在Segment上增加這個值。
temp_buffers
千字節(jié)數(shù)
Reload Config生效
無
稱之為臨時緩沖區(qū),用于數(shù)據(jù)庫會話訪問臨時表數(shù)據(jù),系統(tǒng)默認值為8M。可以在單獨的Session中對該參數(shù)進行設置,尤其是需要訪問比較大的臨時表時,將會有顯著的性能提升。
gp_vmem_protect_limit
千字節(jié)數(shù)
重啟實例生效
gp_vmem_protect_limit = gp_vmem / acting_primary_segments
設置segment的所有postgres進程可以使用的內(nèi)存量(以MB為單位)。如果查詢超出該限制,系統(tǒng)不會分配內(nèi)存,查詢將失敗。請注意,這是本地參數(shù),必須為系統(tǒng)中的每個segment(包括primary和mirror)設置。
為了防止內(nèi)存的過度分配,可以按照下面的估計一個安全的gp_vmem_protect_limit值:
gp_vmem = ((SWAP + RAM) - (7.5GB + 0.05 * RAM)) / 1.7 gp_vmem_protect_limit = gp_vmem / acting_primary_segments
acting_primary_segment 使用segments數(shù)目進行估計,保守一些可以將mirror個數(shù)也算上,如果這個值設置的過小,會導致查詢失敗,需要對這個值進行調(diào)整。
說明如需對資源隊列的內(nèi)存進行限制,建議修改資源隊列相關(guān)參數(shù),具體信息,請參見使用Resource Queue(資源隊列)進行負載管理。
gp_vmem_protect_segworker_cache_limit
千字節(jié)數(shù)
重啟實例生效
無
查詢執(zhí)行器進程緩存的限制值。具有大量連接或空閑進程的系統(tǒng)可能希望減少這個值以釋放segment上的更多內(nèi)存。這是一個本地參數(shù),必須為每個segment設置。
gp_resqueue_memory_policy
none、auto、eager_free
Reload Config生效
無
啟用AnalyticDB PostgreSQL內(nèi)存管理的功能。一般查詢計劃被分成幾個階段,如果設置為eager_free 數(shù)據(jù)庫將在該階段結(jié)束時急速釋放分配給前一個階段的內(nèi)存,然后將新的內(nèi)存分配給新階段,使用這個參數(shù)會降低查詢執(zhí)行階段內(nèi)存不足的可能性,但也會帶來額外的性能開銷。當設置為auto,查詢內(nèi)存使用情況由statement_mem和資源隊列內(nèi)存限制來控制。
statement_mem
千字節(jié)數(shù)
Reload Config生效
gp_resqueue_memory_policy設置為auto時生效。
不超過max_statement_mem的值。
為每個查詢分配主機內(nèi)存。使用此參數(shù)分配的內(nèi)存量不能超過max_statement_mem或查詢提交的資源隊列上的內(nèi)存限制。當gp_resqueue_memory_policy=auto時,statement_mem和資源隊列內(nèi)存限制了查詢內(nèi)存的使用。
如果查詢需要額外的內(nèi)存,則會使用磁盤上的臨時溢出文件。
該計算可用于估計各種情況下的合理值。
( gp_vmem_protect_limit GB * 0.9 ) / max_expected_concurrent_queries
將gp_vmem_protect_limit設置為 8192MB (8GB) 并假設最大40個并發(fā)查詢和10%的緩沖區(qū)。
(8GB * 0.9) / 40 = 184MB
由于gp_resqueue_memory_policy設置為eager ,默認情況下此參數(shù)并沒有實際生效。
max_statement_mem
千字節(jié)數(shù)
Reload Config生效
(seghost_physical_memory) / (average_number_concurrent_queries)
設置查詢的最大內(nèi)存限制。將statement_mem設置得太高,有助于在查詢處理期間避免segment主機上的內(nèi)存不足的錯誤。當gp_resqueue_memory_policy=auto時, statement_mem 和資源隊列內(nèi)存限制了控制查詢內(nèi)存的使用。考慮到單個段主機的配置,計算該設置如下:
(seghost_physical_memory) / (average_number_concurrent_queries)
工作負載相關(guān)參數(shù)
參數(shù)
取值范圍
生效條件
依賴關(guān)系
描述
gp_resqueue_priority
Boolean
重啟實例生效
無
啟用或者禁用查詢優(yōu)先級。禁用此參數(shù)時,不會再查詢運行時評估現(xiàn)有的優(yōu)先級設置。如果業(yè)務對查詢性能要求較高,可以考慮關(guān)閉優(yōu)先級隊列。
gp_resqueue_priority_cpucores_per_segment
0.1~512.0
重啟實例生效
無
指定每個segment實例分配的CPU單元數(shù),這個參數(shù)在實例創(chuàng)建階段就分配完成,不正確的設置可能導致CPU使用率不足或查詢優(yōu)先級不能按照設計工作。
gp_resqueue_priority_sweeper_interval
500ms~15000ms
重啟實例生效
gp_resqueue_priority
CPU時間片統(tǒng)計間隔,SQL執(zhí)行時,計算它的share值(根據(jù)優(yōu)先級以及計算gp_resqueue_priority_cpucores_per_segment出來)。越小越頻繁,優(yōu)先級設置帶來的效果越好。但是overhead越大。