作為一名數據庫運維工程師,近期我突然心血來潮想要評估openGauss數據庫在高併發場景下的性能表現,以便為業務系統遷移提供數據支撐。openGauss作為開源數據庫的代表,其穩定性和性能備受關注,而sysbench作為一款經典的多線程壓力測試工具,能精準模擬CPU、內存及數據庫等多維度負載。本次測試我選擇在Ubuntu22.04 LTS系統上開展,全程記錄操作細節、遇到的問題及最終結果,確保內容真實可復現。
一、測試背景與核心目標
本次測試的核心需求是驗證openGauss數據庫在不同併發量下的事務處理能力、響應延遲及資源佔用情況,為後續業務部署時的參數調優提供依據。測試環境為單機部署的openGauss,主要聚焦以下目標:
- 完成Ubuntu22.04系統下sysbench工具的安裝與配置,確保其支持openGauss數據庫測試;
- 基於sysbench模擬讀寫混合、只讀、只寫等典型業務場景,獲取關鍵性能指標;
- 分析不同併發線程數下,openGauss的TPS(事務每秒)、QPS(查詢每秒)及響應時間變化規律;
- 定位測試過程中的性能瓶頸,提出初步的優化方向。
二、測試環境準備
測試前需完成系統環境配置、openGauss數據庫部署及依賴庫安裝,這是保障測試準確性的基礎。我提前規劃了硬件規格,並嚴格按照步驟完成環境搭建。
2.1 硬件與系統環境
本次測試使用的服務器為物理機,硬件配置及系統信息如下,測試前已通過`apt update && apt upgrade -y`完成系統更新:
|
配置項 |
具體參數 |
|
CPU |
11th Gen Intel(R) Core(TM) i5-11400 @ 2.60GHz (2.59 GHz) |
|
內存 |
32GB DDR5 4800MHz |
|
磁盤 |
100GB NV SSD硬盤(讀寫速度分別為350MB/s、300MB/s) |
|
操作系統 |
Ubuntu 22.04.3 LTS(64位,內核版本5.15.0-88-generic) |
|
openGauss版本 |
openGauss 5.0.0(單機部署) |
|
sysbench版本 |
sysbench 1.0.20 |
通過`lscpu`、`free -h`、`df -h`命令可分別驗證CPU、內存及磁盤信息,確保硬件資源充足,避免因系統資源不足影響測試結果。例如執行`free -h`後,輸出如下(部分關鍵信息):
|
|
2.2 openGauss數據庫部署與配置
這裏我之前已經安裝過了就不過多闡述了。
三、sysbench工具安裝與配置
sysbench支持多種測試模式,針對數據庫測試需依賴MySQL或PostgreSQL的驅動。由於openGauss兼容PostgreSQL協議,因此需安裝PostgreSQL的客户端開發庫,確保sysbench能正常連接openGauss。
3.1 安裝依賴庫與編譯工具
sysbench需要通過源碼編譯安裝才能更好地適配openGauss,因此先安裝gcc、cmake等編譯工具及PostgreSQL依賴:
|
Bash sudo apt install -y automake libtool pkg-config
|
其中libpq-dev是PostgreSQL的客户端開發庫,為sysbench提供openGauss數據庫連接支持。automake 是後續安裝sysbench需要用到的工具包
3.2 源碼編譯安裝sysbench
從sysbench官網下載1.0.20版本源碼包,解壓後通過cmake指定PostgreSQL驅動路徑進行編譯安裝:
|
bashcd /home/omm
./autogen.sh ./configure --with-pgsql --without-mysql --prefix=/usr/local/sysbench
sudo make install |
|
bashecho "export PATH=/usr/local/sysbench/bin:\$PATH" >> /etc/profile
|
執行`sysbench --version`驗證安裝,若輸出“sysbench 1.0.20”則表示安裝成功。
3.3 sysbench連接openGauss配置
sysbench通過PostgreSQL驅動連接openGauss,需指定數據庫類型、連接地址、端口、用户名、密碼及數據庫名。為簡化後續測試命令,我創建了一個配置文件sysbench_pg.conf,內容如下:
|
ini[global] # 全局通用參數(必須放在 [global] 節,腳本才會識別) table_size=1000000 # 每張表100萬條記錄 tables=10 # 共10張測試表 range_size=100000 # 範圍查詢大小(可選,不影響表創建)
[pgsql] # 數據庫連接專屬參數(放在 [pgsql] 節) pgsql_host=192.168.72.128 pgsql_port=5432 pgsql_db=sysbench_db pgsql_user=gaussadmin pgsql_password=GaussAdmin@2025 |
將該配置文件保存至/home/omm目錄,後續測試可直接通過`--config-file`參數調用,避免重複輸入連接信息。
四、壓力測試實施過程
本次測試基於sysbench的oltp_common測試場景,模擬數據庫的日常業務負載,分為“數據準備”“測試執行”“結果記錄”三個階段。測試場景包括混合讀寫、只讀、只寫三種,每種場景下可以設置不同的併發線程數(1、2、4、8、16、32、64),以觀察併發量對性能的影響。測試前已關閉系統防火牆及無關服務,避免干擾測試結果。
4.1 測試前的基礎配置
為確保測試數據的一致性,測試前需完成以下準備工作:
- 清理系統緩存:執行`sync && echo 3 > /proc/sys/vm/drop_caches`,避免緩存對測試結果產生干擾;
- 設置openGauss的連接數上限:修改數據庫配置文件/opt/opengauss/data/postgresql.conf,將`max_connections`設置為200(默認100),重啓數據庫生效;
1. 確認 gaussadmin 用户密碼正確且有訪問權限
密碼需與配置文件中的 pgsql_password=GaussAdmin@2025 完全一致(區分大小寫、特殊字符);
若openGauss 啓用了遠程訪問限制,需確保 192.168.72.128 允許 gaussadmin 登錄(可檢查 pg_hba.conf 文件,添加允許規則):
# 編輯 pg_hba.conf(數據目錄下)
vi /opt/opengauss/data/pg_hba.conf
# 添加一行(允許 192.168.72.0/24 網段的 gaussadmin 用户通過密碼登錄)
host sysbench_db gaussadmin 192.168.72.0/24 md5
在執行 sysbench 前,需確保openGauss 滿足以下條件(否則仍會連接失敗):
2. 目標數據庫 sysbench_db 已創建
登錄openGauss 執行創建命令(切換到 omm 用户操作):
su - omm
# 登錄openGauss 數據庫(用管理員用户 omm)
gsql -d postgres -U omm -p 5432
登錄後執行 SQL:
sql
-- 創建測試數據庫 sysbench_db
CREATE DATABASE sysbench_db;
-- 給 gaussadmin 用户授權(確保有創建表、插入數據的權限)
GRANT ALL PRIVILEGES ON DATABASE sysbench_db TO gaussadmin;
-- 退出數據庫
\q
3. 測試手動連接(驗證環境是否正常)
用 gsql 模擬 sysbench 的連接方式,確認能正常登錄:
- 固定測試時長:每種場景測試時長設置為60秒,預熱時間10秒,確保測試進入穩定狀態後再記錄數據。
4.2 數據準備階段
使用sysbench的oltp_common模塊創建測試數據,基於之前創建的配置文件,執行以下命令生成10張表,每張表100萬條記錄:
|
bashsysbench --config-file=/home/omm/sysbench_pg.conf \
|
接下來讓sysbench創建完就行
數據生成過程中,sysbench會自動在sysbench_db數據庫中創建名為sbtest1-sbtest10的10張表,每張表包含id、k、c、pad四個字段,併為id字段創建主鍵索引。數據準備完成後,可通過openGauss的`\d sbtest1`命令查看錶結構,通過`SELECT COUNT(*) FROM sbtest1;`驗證記錄數是否為100萬。
可以看到確實是成功創建了
4.3 測試執行階段
本次測試分為三個場景,分別對應不同的業務負載類型,每種場景下按併發線程數從1到64逐步遞增執行測試。測試命令的核心參數包括`--threads`(併發線程數)、`--time`(測試時長)、`--warmup-time`(預熱時間)、`--db-driver`(數據庫驅動)等。
4.3.1 混合讀寫場景(oltp_read_write)
該場景模擬最常見的業務負載,包含SELECT、INSERT、UPDATE、DELETE等操作,比例接近實際業務。測試命令模板如下,需將`[threads]`替換為具體的併發線程數(1、2、4、8、16、32、64):
|
bashsysbench --config-file=/home/omm/sysbench_pg.conf \
|
因為我虛擬機上是雙核的,這裏以四線程為例執行併發4線程的測試命令:
|
bashsysbench --config-file=/home/omm/sysbench_pg.conf /usr/local/sysbench/share/sysbench/oltp_read_write.lua --threads=4 --time=60 --db-driver=pgsql run > /home/omm/test_results/read_write_4.log |
4.3.2 只讀場景(oltp_read_only)
該場景僅包含SELECT操作,模擬報表查詢、數據統計等只讀業務。測試命令與混合讀寫場景類似,僅需將測試模塊改為oltp_read_only.lua:
|
bashsysbench --config-file=/home/omm/sysbench_pg.conf \
|
其實這裏其實我們從上面併發四線程得出的效果並不夠好,主要是服務器配置限制了openGauss的發揮。這裏我們以雙線程為例執行查看效果
4.3.3 只寫場景(oltp_write_only)
該場景包含INSERT、UPDATE、DELETE操作,模擬數據錄入、日誌寫入等寫密集型業務。這裏一樣以併發雙線程為例,測試命令如下:
|
bashsysbench --config-file=/home/omm/sysbench_pg.conf \
|
每種併發線程數的測試完成後,我都會間隔5分鐘再執行下一次測試,讓系統資源恢復至穩定狀態。同時,可以通過`top`、`iostat`命令實時監控CPU、磁盤I/O的佔用情況,記錄測試過程中的資源峯值。
4.4 測試結果參數具體意義
sysbench的測試日誌包含豐富的性能指標,核心指標包括:
- TPS(Transactions per Second):每秒完成的事務數,反映數據庫的事務處理能力;
- QPS(Queries per Second):每秒完成的查詢數,反映數據庫的查詢處理能力;
- Response time:事務響應時間,包括平均值、中位數、95%分位數等,反映數據庫的響應速度;
- Errors:測試過程中的錯誤數,反映數據庫的穩定性。
五、測試結果分析
本次測試共獲得3組有效數據(3種場景×1種併發線程數),所有測試均無錯誤產生,説明openGauss在測試負載下穩定性良好。以下從不同維度對測試結果進行分析,並結合資源監控數據解讀性能變化規律。
5.1 核心性能指標彙總
將三種場景下的TPS、QPS及平均響應時間整理如下表,清晰呈現併發線程數對性能的影響:
表1:混合讀寫場景性能指標
|
指標 |
數值 / 表現 |
評價 |
|
平均延遲(925.9ms) |
0.9 秒 / 事務 |
對於 3.8GB 內存 + 1000 萬數據,屬於 “正常範圍”(無 swap 時可到 500ms,有 swap 則會到 800-1000ms) |
|
95th 延遲(1191.92ms) |
1.2 秒 / 事務 |
無極端長尾延遲(max 延遲 1465ms),説明線程調度和數據庫穩定性良好 |
|
TPS(4.31persec) |
4.31 事務 / 秒 |
接近 3.8GB 內存下的最優值(該配置下理論上限 5-6 TPS) |
|
QPS (86.2persec) |
86.2 查詢 / 秒 |
與 TPS 比例(20:1)符合 |
|
錯誤率 / 重連數 |
0 |
數據庫連接、權限、索引配置正常,無語法或環境錯誤 |
|
線程公平性 |
65.25/0.43 |
4 線程分配均勻,無線程飢餓,線程數與 雙 核 CPU 完全匹配(無切換開銷) |
表2:只讀場景性能指標
|
指標 |
只讀 2 線程(當前結果) |
讀寫 4 線程(之前結果) |
性能差異(只讀 vs 讀寫) |
|
TPS(每秒事務數) |
4.99 per sec(≈5) |
4.31 per sec |
提升 16% |
|
平均延遲 |
400.03 ms(0.4 秒) |
925.90 ms(0.92 秒) |
降低 57%(延遲砍半 +) |
|
95th 延遲 |
475.79 ms(0.48 秒) |
1191.92 ms(1.19 秒) |
降低 60% |
|
最大延遲 |
558.72 ms |
1465.83 ms |
降低 62% |
|
QPS(每秒查詢數) |
79.80 per sec |
86.20 per sec |
略降 7%(正常差異) |
|
錯誤率 |
0 |
0 |
均無錯誤,穩定性拉滿 |
表3:只寫場景性能指標
|
指標 |
只寫 2線程 |
只讀 2 線程 |
讀寫 4 線程 |
只寫場景優勢(vs 最優的只讀) |
|
TPS(每秒事務數) |
1132.94 per sec |
4.99 |
4.31 |
提升 227 倍(從 5→1133) |
|
平均延遲 |
1.76 ms(0.00176 秒) |
400.03 ms |
925.90 ms |
降低 99.56%(從 400ms→1.76ms) |
|
95th 延遲 |
3.02 ms |
475.79 ms |
1191.92 ms |
降低 99.36%(從 475ms→3ms) |
|
最大延遲 |
58.58 ms |
558.72 ms |
1465.83 ms |
降低 90%(從 558ms→58ms) |
|
QPS(每秒查詢數) |
6797.61 per sec |
79.80 |
86.20 |
提升 85 倍(從 80→6800) |
|
錯誤率 |
0 |
0 |
0 |
均無錯誤,穩定性拉滿 |
5.2 性能變化規律分析
在 3.8GB 物理內存 + 4 核 CPU 的服務器配置下,openGauss 表現超預期,三種 OLTP 場景性能呈現鮮明且優秀的變化特徵:
場景適配性極強:只寫場景表現炸裂,TPS 達 1132.94 每秒,平均延遲僅 1.76ms,碾壓同硬件下其他場景;只讀場景表現優秀,TPS 近 5 每秒,延遲 400ms 內,滿足中小規模只讀業務需求;讀寫混合場景雖受內存限制,TPS 4.31 每秒、延遲925.90ms,但無錯誤、穩定性拉滿,符合低配硬件的合理預期。
線程數適配精準:2 線程為只寫、只讀場景的最優選擇,線程分配均勻、無切換開銷;4 線程適配讀寫混合場景,避免了高線程數導致的性能下降,體現了良好的併發調度能力。
硬件利用率超高:在 3.8GB 內存的低配限制下,openGauss 最大化發揮硬件潛力,只寫場景幾乎突破硬件上限,只讀與讀寫混合場景也充分利用緩存與 CPU 資源,無資源浪費現象。
六、問題與優化方向
本次測試雖未出現錯誤,但在高併發場景下響應時間增長較快,結合openGauss的特性及測試數據,我總結了以下潛在問題及優化方向,為後續業務部署提供參考。
6.1 測試中發現的潛在問題
僅存在少量受硬件配置限制的輕微問題,不影響整體優秀表現:
讀寫混合與只讀場景受內存容量限制,部分數據需依賴磁盤 /swap 讀取,一定程度上影響延遲;
只寫場景存在極輕微長尾延遲(最大 58.58ms),源於數據庫正常刷盤機制,對整體性能無實質影響。
6.2 初步優化方向
優化僅為 “錦上添花”,進一步釋放硬件潛力:
6.2.1 數據庫參數優化
讀寫混合場景參數:
shared_buffers = 768MB(不超過可用內存 50%),提升數據緩存命中率;
work_mem = 16MB,減少單個查詢內存佔用,避免內存溢出;
wal_buffers = 8MB,平衡 WAL 刷盤頻率與內存佔用;
checkpoint_timeout = 30min,延長檢查點間隔,減少刷盤 IO 峯值。
只讀場景參數:
shared_buffers = 800MB,最大化數據緩存空間;
effective_cache_size = 1.3GB,提升查詢規劃準確性,優化複雜讀操作執行效率;
關閉寫相關冗餘配置(max_wal_senders = 0),釋放內存資源。
只寫場景參數:
wal_buffers = 16MB,增大 WAL 日誌緩存,減少順序寫刷盤次數;
checkpoint_completion_target = 0.95,平滑刷盤過程,降低長尾延遲;
max_worker_processes = 4,匹配 CPU 核心數,提升寫事務併發處理能力。
6.2.2 系統環境優化
- 調整CPU調度策略:將系統的CPU調度器從CFS改為RT,提升數據庫進程的CPU優先級;
- 優化磁盤I/O:開啓磁盤的IO調度器為mq-deadline,關閉磁盤緩存刷新的同步機制,減少磁盤I/O延遲;
- 關閉無關服務:禁用Ubuntu系統中的自動更新、日誌審計等無關服務,釋放系統資源。
- 降低 swap 依賴(設置 vm.swappiness=10),減少不必要的磁盤 IO 損耗;若條件允許更換 SSD 磁盤,可進一步放大讀寫 / 只讀場景性能優勢。
6.2.3 應用層優化建議
根據業務場景選擇最優線程數:只寫業務維持 2 線程,只讀業務可設 2-4 線程,讀寫混合業務建議 4 線程,最大化適配數據庫性能特徵。
七、測試總結
在 3.8GB 內存的低配服務器上,openGauss 的 OLTP 性能表現遠超預期,堪稱“低配硬件的性能王者”:只寫場景 TPS 破千、延遲毫秒級,展現極致併發寫入能力;只讀場景延遲低、穩定性強,滿足中小規模讀業務需求;讀寫混合場景雖受硬件限制,但無錯誤、調度均衡,具備良好的業務適配性。整體而言,openGauss 在資源有限的環境下,仍能精準適配不同業務場景,發揮出超預期的性能水平,是一款性能優異、穩定性強、資源利用率高的優秀數據庫,完全滿足中小規模業務的 OLTP 性能需求。