对SQL server、Oracle、MySQL和PostgreSQL进行OLTP性能测试(Benchmark)
📢歡迎點贊 :👍 收藏 ?留言 📝 如有錯誤敬請指正,賜人玫瑰,手留余香!
📢本文作者:由webmote 原創,首發于 【掘金】
📢作者格言:生活在于折騰,當你不折騰生活時,生活就開始折騰你,讓我們一起加油!💪💪💪
1.為什么做性能測試
在工作中,完全基于新的數據庫開發的場景并不是很多,畢竟現在這個年代,從頭跟著公司干到上市的并不多了。因此我們常常遇到的是經過業務的迅速上升,會發現當初的數據庫選型到目前為止,有諸多的不合適,那么就需要評估數據庫的新選型了,既然是評估工作,避免不了性能的測試。
2.業界標準 TPC-C
TPC-C是業界較認可的在線事務處理基準。
TPC-C是一個在線事務處理(OLTP)基準,于1992年7月批準。TPC-C比以前的OLTP基準測試(如TPC-A)更復雜,因為它引入了更多的事務類型、更復雜的數據庫和整體執行結構。
TPC-C混合了5個不同類型和復雜性的并發事務,它們要么在線執行,要么排隊等待延遲執行。該數據庫由9種類型的表組成,這些表的記錄和填充大小各不相同。TPC-C是以每分鐘事務數(tpmC)來衡量的。雖然基準描述以批發供應商的為例子,但TPC-C并不局限于任何特定業務部門的活動,而是代表必須管理、銷售或分發產品或服務的任何行業。
其涉及的表以及業務數量如下,更詳細的介紹可參見標準:
3.測試工具
為了支持這些數據庫的測試,當然需要選擇一個合適的工具,而目前最合適的測試工具莫過于BenchmarkSQL。
github地址如下.
BenchmarkSQL采用Java語言編寫,使用JDBC對SQL數據庫進行壓力測試。整體架構是處理模擬終端、用戶和應用程序線程的一系列數據結構、隊列和線程組。
其架構上做了一系列優化,允許配置驅動至數千個倉庫(稱為縮放因子),而不會壓倒測試驅動程序本身的工作機器,這是非常重要的。
從標椎上看,每個倉庫必須有 10 個終端。將這些數字放在一起很容易看出,"每個終端一個線程"的實現很可能不得行哦。
如果要驅動一個 100GB 的數據庫(在 2016 年,我認為是一個中小型服務器),我們需要配置 1,000 個倉庫,這將導致 10,000 個終端線程。
在 CentOS-7 64bit 等操作系統上,每個線程默認使用 1MB 的堆??臻g,上下文切換在 10,000 個線程之間已經足夠CPU忙碌的了,甚至于可能會影響測試的結果,而嘗試為大型服務器驅動 1TB 數據庫,那測試機器將崩潰。
而BenchmarkSQL采用了類似隊列的結構而不是真正的線程去驅動它們,因此可以滿足性能壓測的要求。
4.安裝 BenchmarkSQL 6.0
先配置編譯環境:
Java 開發環境 (java-1.8.0-openjdk-devel or newer).
Maven build 工具.
Docker
Git
構建:
git clone https://github.com/pgsql-io/benchmarksql.git cd ~/benchmarksql mvn5.運行壓測工具
先準備數據庫測試配置文件:
$ cd benchmarksql/target/run $ cp sample.RDBMS.properties my.properties $ vi my.properties目錄中包含了支持數據庫的測試配置文件,說明如下:
# firebird數據庫配置 sample.firebird.properties # mariadb / MySQL 數據庫配置 sample.mariadb.properties # oracle數據庫配置 sample.oracle.properties # postgresql 數據庫配置 sample.postgresql.properties # SQL Server 數據庫配置 sample.transact-sql.properties特別需要注意的是MySQL數據庫的配置,其和mariadb是兼容的,因此直接使用即可。
使用壓測非常簡單,配置好文件后,只需要運行三個命令即可。
# 銷毀上次配置的數據庫表數據 ./runDatabaseDestroy.sh my.properties # 初始化壓測數據庫數據 ./runDatabaseBuild.sh my.properties # 開始壓測 ./runDatabaseBuild.sh my.properties復制代碼如果需要臨時增大linux測試機線程數,請使用命令
ulimit -HSn 65536測試結果如下:
2021-09-26 08:48:00,024 INFO - result, _____ latency (seconds) _____ 2021-09-26 08:48:00,024 INFO - result, TransType count | mix % | mean max 90th% | rbk% errors 2021-09-26 08:48:00,024 INFO - result, +--------------+---------------+---------+---------+---------+---------+---------+---------------+ 2021-09-26 08:48:00,025 INFO - result, | NEW_ORDER | 18,909 | 43.934 | 0.053 | 0.146 | 0.073 | 1.026 | 0 | 2021-09-26 08:48:00,035 INFO - result, | PAYMENT | 18,661 | 43.357 | 0.014 | 0.071 | 0.016 | 0.000 | 0 | 2021-09-26 08:48:00,036 INFO - result, | ORDER_STATUS | 1,851 | 4.301 | 0.005 | 0.011 | 0.006 | 0.000 | 0 | 2021-09-26 08:48:00,036 INFO - result, | STOCK_LEVEL | 1,834 | 4.261 | 0.003 | 0.012 | 0.004 | 0.000 | 0 | 2021-09-26 08:48:00,036 INFO - result, | DELIVERY | 1,785 | 4.147 | 0.000 | 0.001 | 0.001 | 0.000 | 0 | 2021-09-26 08:48:00,036 INFO - result, | DELIVERY_BG | 1,785 | 0.000 | 0.098 | 0.191 | 0.104 | 0.000 | 0 | 2021-09-26 08:48:00,037 INFO - result, +--------------+---------------+---------+---------+---------+---------+---------+---------------+ 2021-09-26 08:48:00,037 INFO - result, 2021-09-26 08:48:00,037 INFO - result, Overall NOPM: 630 (98.02% of the theoretical maximum) 2021-09-26 08:48:00,037 INFO - result, Overall TPM: 1,4356. 配置文件參數說明
6.1 數據庫驅動程序和連接參數
| db | 數據庫類型 | postgres |
| driver | 要加載的 JDBC 類名稱。 | driver=org.postgresql.Driver |
| application | 客戶端應用程序類型,支持通用應用類型中的所有數據庫類型,該類型使用 JDBC。 | application=Generic |
| conn | Jdbc 連接 Uri | conn=jdbc:postgresql://localhost:5432/postgres |
| user | 數據庫用戶名 | user |
| password | 數據庫用戶密碼 | password |
6.2 性能調節參數
| warehouses | 倉庫數據庫大小參數 這不僅影響初始數據庫的大小,還影響將模擬多少終端,默認是10倍倉庫數量 |
| loadWorkers | 用于創建初始數據庫內容的并行線程數。僅影響初始化,不影響壓測。 |
| monkeys | 用于處理終端輸入和輸出的猴子線的數量。 |
| sutThreads | 要啟動的應用程序線程數。將創建這么多并行數據庫連接來處理傳入請求。 |
| maxDeliveryBGThreads | 允許在任何時候處理交付交易的背景部分的最大線程數。 |
| maxDeliveryBGPerWarehouse | 允許"為同一倉庫"處理交貨交易的背景線程數。 |
7. 生成可視化統計界面
需要安裝R包,來把測試報告數據轉化為統計數據界面。
利用generateReport.py腳本來完成該項任務。
./generateReport.py --resultdir=my_result_2021-09-26_080750/# 參數有下列可選,resultdir是必須參數 --template --resultdir --disk --interface8. 小結
性能測試的結果呢?
結果重要嗎?掌握了方法,結果唾手可得。
嗯嗯,這點成果還是不太適合直接公開的,暫時保個密,等過段時間再來更新吧。
👓都看到這了,還在乎點個贊嗎?
👓都點贊了,還在乎一個收藏嗎?
👓都收藏了,還在乎一個評論嗎?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的对SQL server、Oracle、MySQL和PostgreSQL进行OLTP性能测试(Benchmark)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF实现截屏(仿微信)
- 下一篇: NoSQL 是否可以用来做日志中心 ?