[轉帖]openGauss數據庫性能調優

https://www.modb.pro/db/29135

 

概述

本文描述了openGauss數據庫基於Taishan服務器,在openEuler操作系統上,爲了達到數據庫的極致性能,所依賴的關鍵系統級調優配置。

硬件規格:

CPU: 鯤鵬-920(1620) ARM aarch64 64核 * 2
內存: >=512G
磁盤: Nvme SSD * 4(每塊大於1TB)
網卡: 1822網卡 萬兆網卡 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45)

軟件規格:

操作系統: openEuler 20.03 (LTS)
數據庫: openGauss 1.0.0
Benchmark: benchmarksql-5.0
jdk: jdk1.8.0_212
ant: apache-ant-1.9.15

文章通過配置BIOS、操作系統、文件系統、網絡、綁核,構造TPCC測試數據等幾個方面來對數據庫進行調優。- 依賴三方工具 jdk ant benchmark - linux工具 htop iostat.

benchmark htop iostat工具的安裝使用請參照:benchmark使用。(https://opengauss.org/zh/blogs/blogs.html?post/optimize/opengauss-tpcc/)

BIOS配置

登錄服務器管理系統,重啓服務器進入BIOS界面,修改BIOS相關配置並重啓 (服務器管理系統以實際爲準)。

1.機器自檢後,會提示啓動選項 

2.按“Del”鍵,進入BIOS  

 3.輸入BIOS密碼 

4.恢復出廠設置

按下“F9”,恢復出廠設置
重要:因爲現有的BIOS可能被改動過諸多默認設置,爲保險起見,建議首先恢復出廠設置。

5. 修改相關BIOS設置

修改包括下面三項配置

# BIOS->Advanced->MISC Config,配置Support Smmu爲Disabled

# BIOS->Advanced->MISC Config,配置CPU Prefetching Configuration爲Disabled

# BIOS->Advanced->Memory Config,配置Die Interleaving爲Disable

6. 保存相關BIOS設置,並重啓

按“F10”保存並退出,重新啓動系統。

操作系統配置

優化操作系統相關配置

Irq balance關閉:爲避免gaussdb進程與客戶端搶用CPU,導致CPU使用不均衡。如果htop呈現出部分CPU壓力很大,部分CPU很空閒時需要考慮是否關閉了irqbalance.

service irqbalance stop

echo 0 > proc/sys/kernel/numa_balancing

echo 'never' > sys/kernel/mm/transparent_hugepage/enabled

echo 'never' > sys/kernel/mm/transparent_hugepage/defrag

echo none > sys/block/nvme*n*/queue/scheduler  ## 針對nvme磁盤io隊列調度機制設置

文件系統配置

修改xfs文件系統blocksize爲8K

<1> 確認nvme盤對應加載點的現有blocksize 下面命令查看當前掛載的nvme盤

df -h | grep nvme

/dev/nvme0n1      3.7T  2.6T  1.2T  69% data1

/dev/nvme1n1      3.7T  1.9T  1.8T  51% data2

/dev/nvme2n1      3.7T  2.2T  1.6T  59% data3

/dev/nvme3n1      3.7T  1.4T  2.3T  39% data4

xfs_info命令可以查看nvme盤的信息

xfs_info data1

上圖中block的大小正好爲8K, 不需要修改。若不滿足8k塊大小的要求, 需要重新格式, 格式化前注意數據的備份。

<2> 針對需要格式化的磁盤,備份所需的數據

用戶注意根據需要,將所需數據備份至其他磁盤或其他機器。

<3> 重新格式化磁盤,設置block大小8k

以/dev/nvme0n1盤,加載點爲/data1爲例,相關參考命令如下:

umount /data1

mkfs.xfs -b size=8192 /dev/nvme0n1 -f

mount /dev/nvme0n1 /data1

<4> 再次用xfs_info命令確認blocksize是否修改正確。

網絡配置

1. 多中斷隊列設置

針對泰山服務器核數較多的特徵,產品需要在服務器端和客戶端設置網卡多隊列。當前推薦的配置爲:服務器端網卡配置16中斷隊列,客戶端網卡配置48中斷隊列。

多中斷隊列設置工具(1822-FW)
Hi1822網卡發佈版本可以從如下鏈接獲取,IN500 solution 5.1.0.SPC401及之後正式支持設置多隊列: https://support.huawei.com/enterprise/zh/intelligent-accelerator-components/in500-solution-pid-23507369/software.

<1> 解壓Hi1822-NIC-FW.zip, 進入目錄,在root用戶下安裝hinicadm.

 <2> 確定當前連接的物理端口是哪個網卡的,不同硬件平臺這個網口和網卡名有差別。以如下示例機器爲例,當前使用enp3s0的小網網口,屬於hinic0網卡。

<3> 進入config目錄, 利用配置工具hinicconfig配置中斷隊列FW配置文件:

64隊列配置文件:std_sh_4x25ge_dpdk_cfg_template0.ini;

16隊列配置文件:std_sh_4x25ge_nic_cfg_template0.ini;

對hinic0卡配置爲不同隊列數(默認16隊列,可以按需要調整)

./hinicconfig hinic0 -f std_sh_4x25ge_dpdk_cfg_template0.ini

重啓操作系統生效,輸入命令ethtool -l enp3s0查看(比如下圖表示修改爲(32)

修改combined的值,輸入命令ethtool -L enp3s0 combined 48(不同平臺,不同應用的優化值可能不同,當前128核平臺,服務器端調優值爲16,客戶端調優值爲48)。

2. 中斷調優

在openGauss數據庫滿跑的情況下(CPU佔比90%以上),CPU成爲瓶頸,開啓offloading,將網絡分片offloading到網卡上

ethtool –K enp3s0 tso on

ethtool –K enp3s0 lro on

ethtool –K enp3s0 gro on

ethtool –K enp3s0 gso on

以1620平臺爲例,網卡中斷綁定每個numa node中最後4個core,每個core綁定3箇中斷。綁核中斷腳本如下所示,此腳本將在openGauss安裝的時候在gs_preinstall被調用,具體執行步驟請查看產品安裝說明書: 

sh bind_net_irq.sh  16

3. 網卡固件確認與更新

確認當前環境的小網網卡固件版本是否爲2.5.0.0

ethtool -i enp3s0

driver: hinic                                

version: 2.3.2.11                            

firmware-version: 2.5.0.0 

expansion-rom-version:                       

bus-info: 0000:03:00.0  

如果是2.5.0.0,建議更換爲2.4.1.0,以獲得更佳性能。

  網卡固件更新步驟

<1> 上傳網卡固件驅動至服務器 Hi1822_nic_prd_1h_4x25G.bin

<2> 使用root執行如下命令

hinicadm updatefw -i <物理網卡設備名> -f <固件文件路徑>

其中,“物理網卡設備名”爲網卡在系統中的名稱,例如“hinic0”表示第一張網卡,“hinic1”表示第二張網卡,查找方法參見前文“多中斷隊列設置”。例如:

# hinicadm updatefw -i <物理網卡設備名> -f <固件文件路徑>

Please do not remove driver or network device

Loading...

[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]  [100%] [\]

Loading firmware image succeed.

Please reboot OS to take firmware effect.

<3> 重啓服務器,再確認小網網卡固件版本成功更新爲2.4.1.0

ethtool -i enp3s0

driver: hinic                                

version: 2.3.2.11                            

firmware-version: 2.4.1.0                    

expansion-rom-version:                       

bus-info: 0000:03:00.0 

確認小網網卡固件版本成功更新成功。

數據庫服務端及客戶端綁核

安裝數據庫, 具體參考openGauss安裝文檔。

大概步驟如下:

◾ 停止數據庫

◾ 修改postgresql.conf參數

◾ 以綁核方式啓動數據庫: numactl --interleave=all bin/gaussdb -D ${DATA_DIR} --single_node

◾ 以綁核方式啓動benchmark: numactl -C 0-19,32-51,64-83,96-115 ./runBenchmark.sh props.pg

按照自己的綁核配置和benchmark配置文件執行此命令。這裏的綁核參數是在數據庫綁核參數的空隙。

1. 服務器端綁核設置

<1> 業務進程在運行過程中,硬件上報的網絡中斷會導致頻繁的上下文切換,嚴重影響效率,因此需要將網絡中斷和業務分開綁定在不同的核上運行,網絡中斷綁核請查看上一節。

<2> 當前openGauss中引入了線程池機制,即數據庫啓動時,線程池將創建指定數目的線程來服務,線程在創建時會進行綁核,因此需要將網卡的綁核信息通過 GUC 參數傳入,方便運行期間綁核設置。以128核爲例,對應參數如下圖: 

 其中線程總數爲(cpu總數128 - 處理網絡的cpu數目16)* 每個核上線程數(經驗值推薦7.25) = (128-16)*7.25 = 812,numa節點數爲4,處理中斷的核數爲16。

如下爲輔助分配綁定CPU:

numactl -C 0-27,32-59,64-91,96-123 gaussdb --single_node -D {DATA_DIR} -p {PORT} &

或者:

numactl --interleave=all gaussdb --single_node -D {DATA_DIR} -p {PORT} &

2. 服務器端參數設置

postgresql.conf中新增如下參數:- advance_xlog_file_num = 10
此參數表示後臺線程BackgroundWALWriter週期性地提前檢測並初始化未來10個XLog文件,避免事務提交時纔去執行XLog文件初始化,從而降低事務提交時延。只有在性能壓力測試時作用纔會體現出來,一般不用配置。默認爲0,即不進行提前初始化。- numa_distribute_mode = 'all'
此參數目前有all和none兩個取值。all表示啓用NUMA優化,將工作線程和對應的PGPROC、WALInsertlock進行統一分組,分別綁定到對應的NUMA Node下,以減少關鍵路徑上的CPU遠端訪存。默認取值爲none,表示不啓用NUMA分佈特性。只有在涉及到多個NUMA節點,且遠端訪存代價明顯高於本地訪存時使用。當前建議在性能壓力測試情況下開啓。

thread_pool_attr線程池配置
thread_pool_attr = '812,4,(cpubind: 0-27,32-59,64-91,96-123)'

相關參數:

max_connections = 4096

allow_concurrent_tuple_update = true

audit_enabled = off

checkpoint_segments = 1024

checkpoint_timeout = 15min

cstore_buffers = 16MB

enable_alarm = off

enable_codegen = false

enable_data_replicate = off

full_page_writes = on

max_files_per_process = 100000

max_prepared_transactions = 2048

shared_buffers = 350GB   

use_workload_manager = off  

wal_buffers = 1GB

work_mem = 1MB

log_min_messages = FATAL

transaction_isolation = 'read committed'

default_transaction_isolation = 'read committed'

synchronous_commit = on

fsync = on

maintenance_work_mem = 2GB

vacuum_cost_limit = 2000

autovacuum = on

autovacuum_mode = vacuum

autovacuum_max_workers = 5

autovacuum_naptime = 20s

autovacuum_vacuum_cost_delay = 10

xloginsert_locks = 48

update_lockwait_timeout = 20min

 

enable_mergejoin = off

enable_nestloop = off

enable_hashjoin = off

enable_bitmapscan = on

enable_material = off

 

wal_log_hints = off

log_duration = off

checkpoint_timeout = 15min

autovacuum_vacuum_scale_factor = 0.1

autovacuum_analyze_scale_factor = 0.02

enable_save_datachanged_timestamp = false

 

log_timezone = 'PRC'

timezone = 'PRC'              

lc_messages = 'C'

lc_monetary = 'C'

lc_numeric = 'C'

lc_time = 'C'              

 

enable_thread_pool = on  

thread_pool_attr = '812,4,(cpubind:0-27,32-59,64-91,96-123)'

enable_double_write = off

enable_incremental_checkpoint = on

enable_opfusion = on

advance_xlog_file_num = 10

numa_distribute_mode = 'all'  

 

track_activities = off

enable_instr_track_wait = off

enable_instr_rt_percentile = off

track_counts = on

track_sql_count = off

enable_instr_cpu_timer = off

 

plog_merge_age = 0

session_timeout = 0

 

enable_instance_metric_persistent = off

enable_logical_io_statistics = off

enable_page_lsn_check = off

enable_user_metric_persistent = off

enable_xlog_prune = off

 

enable_resource_track = off

instr_unique_sql_count=0

enable_beta_opfusion=on

enable_beta_nestloop_fusion=on

3. TPCC客戶端綁核設置

客戶端通過 numactl 將客戶端綁定在除網卡外的核上,下圖以 128 核環境舉例,共80個核用於處理業務邏輯,剩餘48個核處理網絡中斷。

對應tpmc程序應該使用爲:

numactl -C 0-19,32-51,64-83,96-115 ./runBenchmark.sh props.pg

其他核用來處理網絡中斷。

構建TPCC初始數據

1. 修改benchmark配置

複製props.pg並重命名爲props.opengauss.1000w,編輯該文件,將如下配置覆蓋到文件裏面:

cp props.pg props.opengauss.1000w

vim props.opengauss.1000w

db=postgres

driver=org.postgresql.Driver

// 修改連接字符串, 包含ip, 端口號, 數據庫

conn=jdbc:postgresql://ip:port/tpcc1000?prepareThreshold=1&batchMode=on&fetchsize=10

// 設置數據庫登錄用戶和密碼

user=user

password=******

 

warehouses=1000

loadWorkers=200

 

// 設置最大併發數量, 跟服務端最大work數對應

terminals=812

//To run specified transactions per terminal- runMins must equal zero

runTxnsPerTerminal=0

//To run for specified minutes- runTxnsPerTerminal must equal zero

runMins=5

//Number of total transactions per minute

limitTxnsPerMin=0

 

//Set to true to run in 4.x compatible mode. Set to false to use the

//entire configured database evenly.

terminalWarehouseFixed=false

 

//The following five values must add up to 100

//The default percentages of 45, 43, 4, 4 & 4 match the TPC-C spec

newOrderWeight=45

paymentWeight=43

orderStatusWeight=4

deliveryWeight=4

stockLevelWeight=4

 

// Directory name to create for collecting detailed result data.

// Comment this out to suppress.

resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS

osCollectorScript=./misc/os_collector_linux.py

osCollectorInterval=1

// 收集OS負載信息

//[email protected]

//osCollectorDevices=net_enp3s0 blk_nvme0n1 blk_nvme1n1 blk_nvme2n1 blk_nvme3n1

2. TPCC導入數據前準備

<1> 替換tableCreats.sql文件

下載文件tableCreates.sql (https://blog.opengauss.org/zh/post/optimize/images/tableCreates.sql)。 使用該文件替換benchmarkSQL中路徑 benchmarksql-5.0/run/sql.common/ 下的對應文件。

該文件主要做了如下修改:

◾增加了兩個表空間

CREATE TABLESPACE example2 relative location 'tablespace2';

CREATE TABLESPACE example3 relative location 'tablespace3';

◾  刪除序列bmsql_hist_id_seq

◾ 給每一個表增加FACTOR屬性

create table bmsql_stock (

  s_w_id       integer       not null,

  .....

  s_dist_10    char(24)

) WITH (FILLFACTOR=80) tablespace example3;

<2> 修改索引indexCreates.sql

修改run/sql.common/indexCreates.sql文件 

修改上圖中紅框中的內容如下:

在該文件中添加下圖中紅色內容,可以在benchmark自動生成數據的時候自動生成到不同的數據表空間,如果未添加可以在benchmark生成數據之後再數據庫端修改,用於分盤。

<3> 修改runDatabaseBuild.sh文件 修改下圖內容可避免生產數據時候的外鍵不支持錯誤。

3. 導入數據

運行runDatabaseBuild.sh導入數據

4. 數據備份

爲了方便多次測試, 減少導數據的時間, 可以將導好的數據備份, 一種常用的做法是: 停止數據庫, 將整個數據目錄做一次拷貝。恢復時參考腳本如下:

#!/bin/bash

rm -rf /ssd/omm108/gaussdata

rm -rf /usr1/omm108dir/tablespace2

rm -rf /usr2/omm108dir/tablespace3

rm -rf /usr3/omm108dir/pg_xlog

cp -rf /ssd/omm108/gaussdatabf/gaussdata /ssd/omm108/ &

job0=$!

cp -rf /usr1/omm108dir/tablespace2bf/tablespace2 /usr1/omm108dir/ &

job1=$!

cp -rf /usr2/omm108dir/tablespace3bf/tablespace3 /usr2/omm108dir/ &

job2=$!

cp -rf /usr3/omm108dir/pg_xlogbf/pg_xlog /usr3/omm108dir/ &

job3=$!

wait $job1 $job2 $job3 $job0

5. 數據分盤

在性能測試過程中, 爲了增加IO的吞吐量, 需要將數據分散到不同的存儲介質上。由於我們機器上有4塊NVME盤, 可以將數據分散到不同的盤上。我們主要將pg_xlog, tablespace2, tablespace3這三個目錄放置在其他3個NVME盤上, 並在原有的位置給出指向真實位置的軟連接. pg_xlog位於數據庫目錄下, tablespace2, tablespace3分別位於數據庫目錄pg_location下。對tablespace2分盤的示例命令如下:

mv $DATA_DIR/pg_location/tablespace2 $TABSPACE2_DIR/tablespace2

cd $DATA_DIR/pg_location/

ln -svf $TABSPACE2_DIR/tablespace2 ./

6. 運行TPCC程序

numactl –C 0-19,32-51,64-83,96-115 ./runBenchmark.sh props.opengauss.1000w

7. 性能監控

使用htop監控數據庫服務端和tpcc客戶端CPU利用情況, 極限性能測試情況下, 各個業務CPU的佔用率都非常高(> 90%), 若有CPU佔用率沒有達標, 可能是綁核方式不對, 需要進行調整 

 上圖中黃線框中的是處理網絡中斷的CPU.

8. 調優後的監控狀態

經過調優後的htop狀態呈現這種狀態是比較可靠的狀態

數據庫調優是一個繁瑣的工作,需要不斷去修改配置,運行TPCC,反覆去調試以達到最優性能配置。

TPCC運行結果: 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章