用sysbench快速裝載MySQL測試數據
問題描述
我們在對數據庫進行性能測試的時候最常用到的測試工具是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/目錄下
腳本中會自動調用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小時內刪除侵權內容。