sysbench快速裝載MySQL測試數據

      網友投稿 1154 2022-05-28

      問題描述

      我們在對數據庫進行性能測試的時候最常用到的測試工具是sysbench,這款工具功能強大,已經成為業界測試主流數據庫性能的標準,目前用sysbench測試的時候采用的測試數據量一般是64張表,每張表10000000筆數據,這個數據量大概有150GB,一般情況下這些數據是用sysbench的prepare參數通過oltp.lua腳本一條一條的生成隨機數據,再一條一條的插入到數據庫中,這個準備過程類似于重復的插入單條數據到數據庫,所以比較慢,正常情況下準備64張表,每表1000W筆數據需要10幾個小時,即使是SSD磁盤也需要4個小時,這個過程漫長,浪費時間,對于經常需要做性能測試的人來說不可忍受。

      需求描述

      也許是sysbench工具在設計的時候考慮到各個數據庫的通用性,才沒有考慮裝載數據比較慢的問題,不過sysbench提供了強大大lua自定義接口,針對以上裝載數據慢的問題,已經有人發布了oracle和PostgreSQL快速插入數據方法,了解到oracle用的sqlldr,PG用的也是類似的方法,不過都需要有客戶端來完成數據裝載,這種方法是利用工具先生成需要插入的數據,然后批量裝載到數據庫,這樣,比一條一條的生成、插入數據會快很多,Mysql的LOAD DATA INFILE類似于這種方式,我們可以設計sysbench提供的lua接口,實現一個lua腳本,通過?load data infile的方式來加速數據裝載。

      原理介紹

      在使用sysbench測試數據庫性能的時候,最常用到的兩個命令是參數是prepare和run,分別對應于數據準備和測試執行,prepare階段使用單線程來插入數據,效率低下,例如,以下命令是用prepare的方式單線程執行oltp.lua來插入數據

      sysbench?–test=./sysbench/tests/db/oltp.lua??--oltp-tables-count=64?--oltp-table-size=10000000?--mysql-host=xx.xx.xx.xx?--mysql-port=xxxx?--mysql-db=testdbx?--mysql-user=root?--mysql-password=xxxxxx??prepare

      而run的方式是可以指定并行參數多線程并發來執行,例如,在執行階段,sysbench產生了32個線程來執行測試任務。

      sysbench?--test=./sysbench/tests/db/xxx.lua??--oltp-tables-count=64?--oltp-table-size=10000000?--mysql-host=?xx.xx.xx.xx?--mysql-port=?xxxx?--mysql-db=testdbx?--mysql-user=root?--mysql-password=?xxxxxx??--num-threads=32?run

      那么,我們為什么不用run的方式來并行造數據呢,這樣,我們就可以并行執行MySQL load data infile以加速數據的加載。

      用這種方式,只需實現一個生成原始數據的工具,再實現一個lua腳本用來加載數據就可以了。

      數據的生成

      Sysbench的表結構比較簡單,數據的生成主要是生成隨機數,這里為了提高效率,采用c語言來完成數據生成的代碼。

      代碼保存為gendata.c

      編譯上面c語言的方式如下:

      gcc?gendata.c?-o?gendata

      生成gendata可執行文件后,執行gendata?加上要生成的數據量,就可以生成需要的數據了,例如:

      ./gendata?2 ?1,0,89972079288-04286136280-27548240250-91378609072-62125630986-31031597636-48809504488-66368343240-64737407520-08070207568,16823019800-26761011658-25884599296-42689212400-64702665950 ?2,2,98945650624-93173592422-60892765221-01539165792-94510835936-02724198826-08373766004-71825491844-16642099974-59473284405,76897098852-02055441101-97671756059-41804656608-33688540610

      這樣就生成了兩筆數據

      可以通過重定向將數據輸出到文件里,例如,以下方式生成1000W筆數據,并保存到testdb1.dat中:

      ./gendata?10000000?>?testdb1.dat

      實際測試生成1000W筆數據只需30秒左右。

      數據加載腳本的設計

      數據加載使用sysbench提供的lua接口來實現,這里實現了一個可以使用mysql load data infile方式加載數據的lua腳本

      腳本保存為loaddata.lua并放在. /sysbench/tests/db/目錄下

      用sysbench快速裝載MySQL測試數據

      腳本中會自動調用gendata工具生成數據文件,然后用并行的方式將文件加載到數據庫中。

      測試與驗證

      加載數據使用sysbench run的方式啟動多個線程來并行執行loaddata.lua腳本,例如:

      sysbench?--test=./sysbench/tests/db/loaddata.lua??--oltp-tables-count=64?--oltp-table-size=100000000?--mysql-host=xx.xx.xx.xx?--mysql-port=xxxx?--mysql-db=testdbx?--mysql-user=root?--mysql-password=xxxx?--num-threads=4?run

      實際測試中發現同樣的測試環境這種方式會比sysbench的方式快10倍左右,在數據加載的過程中磁盤性能會成為瓶頸,磁盤性能越高,加載越快。

      MySQL

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:(更新時間)2021年04月25日 網絡安全 滲透測試
      下一篇:華為云云原生訓練營學習(二)在鯤鵬的k8s部署NFS
      相關文章
      最新亚洲人成网站在线观看| 亚洲AV无码精品国产成人| 亚洲精品成人片在线观看| 国产精品亚洲四区在线观看| 亚洲短视频在线观看| 亚洲国产精品一区第二页| 亚洲一区二区三区AV无码 | 亚洲国产主播精品极品网红| 国产精品亚洲精品爽爽| 国产精品亚洲综合网站| 大胆亚洲人体视频| 亚洲国产精品成人久久蜜臀 | 国产精品亚洲专区无码牛牛| 色噜噜噜噜亚洲第一| 无码不卡亚洲成?人片| 亚洲成人高清在线| 亚洲精品在线视频| 亚洲人精品亚洲人成在线| 亚洲国产精品久久丫| 亚洲精品在线播放视频| 久久久久无码精品亚洲日韩| 亚洲色中文字幕无码AV| 亚洲熟妇av一区二区三区漫画| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 亚洲国产成人无码AV在线| 亚洲天堂2016| 亚洲午夜精品国产电影在线观看| 亚洲AV无码国产丝袜在线观看| 久久久久亚洲AV无码专区桃色| 激情综合色五月丁香六月亚洲| 亚洲av无码成人影院一区| 亚洲av成人综合网| 亚洲AV无码国产精品色| 亚洲乱码一区av春药高潮| 亚洲中文无码a∨在线观看| 亚洲免费人成视频观看| 亚洲国产成+人+综合| 国产成人精品日本亚洲网址| 亚洲成_人网站图片| 亚洲色大情网站www| 久久亚洲AV成人无码国产最大|