MYSQL 寫入效能引數優化
技術標籤:MYSQL
寫入效能優化的一些引數
說完了如何修改和檢視RDS引數,我們接下來看一下一些和寫入效能相關的引數,限於篇幅,我們不能介紹所有的MYSQL引數。
innodb_buffer_pool_size
在MYSQL中buffer pool用來快取表和索引的資料,以便加速對資料的處理。如果在buffer在pool中無法獲取資料(所謂cache miss),那麼就會產生磁碟的隨機IO請求,這會降低處理速度,所以配置一個合適大小的buffer pool對效能至關重要。RDS中innodb_buffer_pool_size會設定為{DBInstanceClassMemory*3/4}。
我們可以通過show engine innodb status \G和SHOW GLOBAL STATUS命令觀察innodb_buffer_pool_size設定是否合適。
通過show engine innodb status \G我們可以看到free buffers、buffer pool hit rate以及evicted without access(資料被載入到buffer pool沒有被訪問前就又被推出buffer pool)。
- 如果較長時間內即使業務高峰期,free buffers都很大,buffer pool hit rate 高於99.5%,evicted without access為0,則innodb_buffer_pool_size可能過量設定了。
- 如果較長時間內尤其業務高峰期,free buffers都很小,buffer pool hit rate 低於99%,evicted without access不為0,則說明innodb_buffer_pool_size設定得太小,需要增大。
show global status where variable_name in (‘Innodb_buffer_pool_read_requests’, ‘Innodb_buffer_pool_reads’); 我們可以關注以下資料,來判斷innodb_buffer_pool_size設定的是否合適。
- innodb_buffer_pool_reads表示InnoDB緩衝池無法滿足的請求數。需要從磁碟中讀取。
- innodb_buffer_pool_read_requests表示從記憶體中邏輯讀取的請求數。
- Innodb_buffer_pool_read_requests / (Innodb_buffer_pool_read_requests + Innodb_buffer_pool_reads) * 100 = InnoDB Buffer Pool hit ratio
注意:對於 MySQL 5.7,管理 InnoDB 緩衝池的方式當前存在錯誤https://bugs.mysql.com/bug.php?id=79379。MySQL 5.7 可能將innodb_buffer_pool_size引數的值調整為較大的值,這會導致 InnoDB 緩衝池增長得過大並佔用過多記憶體。此效果會導致 MySQL 資料庫引擎停止執行或阻止 MySQL 資料庫引擎啟動。可用記憶體較少的資料庫例項類更易出現此問題。要解決此問題,請將innodb_buffer_pool_size引數的值設定為innodb_buffer_pool_instances引數值和innodb_buffer_pool_chunk_size引數值的積的倍數。例如,您可以將innodb_buffer_pool_size引數值設定為innodb_buffer_pool_instances引數值和innodb_buffer_pool_chunk_size引數值的積的 8 倍,如以下示例所示。
innodb_buffer_pool_chunk_size = 536870912
innodb_buffer_pool_instances = 4
innodb_buffer_pool_size = (536870912 * 4) * 8 = 17179869184
innodb_log_file_size
在mysql 5.5和5.5以前innodb的logfile最大設定為4GB,在5.6以後的版本中innodb_log_file_size*innodb_log_files_in_group(每個log group中日誌檔案的個數,預設為2)不能超過512GB。innodb的logfile就是事務日誌,用來在mysql 崩潰後的恢復,設定合理的大小對於mysql的效能非常重要。logfile大小對於效能的影響主要體現在checkpoint上,對於 checkpoint的原理可以參考相關的關係資料庫理論,更大的logfile大小可以減少checkpoint的次數,減少disk I/O,但是也會增加崩潰後恢復時間。
在MYSQL RDS預設引數組中,innodb_log_file_size預設值為134,217,728 (大約128 MB),通常對您的應用來說該數值嫌小。那麼設定多大的logfile合適呢? 通常我們建議innodb_log_file_size*innodb_log_files_in_group要可以承載我們業務高峰期一個小時的日誌量,我們可以用命令show engine innodb status\G select sleep(60); show engine innodb status\G 計算每分鐘的日誌量,進而確定引數的合適大小。此外,基於Bug #69477,日誌檔案大小應該至少是資料庫中最大的BLOB的大小的十倍。
5.0以上版本的MYSQL也可以通過以下命令去查詢一分鐘內生成日誌的大小:
show global status like ‘Innodb_os_log_written%’;
innodb_io_capacity與innodb_io_capacity_max
innodb_io_capacity決定了innodb後臺任務(譬如從buffer pool重新整理頁面或從change pool合併頁面)每秒可用的IO操作次數(IOPS)。innodb_io_capacity預設值是200,可選範圍100–18,446,744,073,709,551,615,而innodb_io_capacity_max是當重新整理滯後時,後臺任務可以執行的最大IOPS,可選範圍100–18,446,744,073,709,551,615,如果您設定了innodb_io_capacity但沒有設定innodb_io_capacity_max,則innodb_io_capacity_max預設是innodb_io_capacity的兩倍,。
關於這兩個引數,若你真的需要對它進行調整,最好的方法是要了解系統可以支援多大的 IOPS。對於SSD我們可以設定innodb_io_capacity為1000,雖然可以設定很大值,但是innodb_io_capacity一般很少設定超過20000,除非您已經嘗試過較低的值否則不要設定較大的值。
那麼我們如何判斷髒頁重新整理不夠快呢?我們可以通過SHOW GLOBAL STATUS LIKE ‘Innodb_buffer_pool_%’;命令,如下圖所示,髒頁在buffer中的百分比就是Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total * 100%
- Innodb_buffer_pool_pages_data和Innodb_buffer_pool_bytes_data: buffer pool中buffer總數。
- Innodb_buffer_pool_pages_dirty和Innodb_buffer_pool_bytes_dirty: buffer pool中髒buffer的數量。
- Innodb_buffer_pool_pages_total: buffer pool總頁數。
如果使用了information_schema,我們也可以通過以下語句來查詢
mysql> SELECT dirty.Value AS 'Dirty Pages', total.Value AS 'Total Pages', ROUND(100*dirty.Value/total.Value, 2) AS 'Dirty Pct' FROM (SELECT VARIABLE_VALUE AS Value FROM information_schema.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total') AS total INNER JOIN (SELECT VARIABLE_VALUE AS Value FROM information_schema.GLOBAL_STATUS WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty') AS dirty;
+-------------+-------------+-----------+
| Dirty Pages | Total Pages | Dirty Pct |
+-------------+-------------+-----------+
| 0 | 131072 | 0.00 |
+-------------+-------------+-----------+
1 row in set (0.00 sec)
總之,如果髒頁佔比長時間較高且從監控看IO有較大餘裕,則可調大innodb_io_capacity,但不要一下調整過大,要逐步提高。
innodb_flush_log_at_trx_commit
innodb_flush_log_at_trx_commit定義資料庫寫log buffer到磁碟的頻率以及方式 ,磁碟寫入會影響效能,故而此引數讓您可以在效能和永續性之間做出選擇。
- 如果innodb_flush_log_at_trx_commit設定為0,每秒一次會將log buffer寫入log file(這時資料只是從innodb記憶體到了作業系統的cache,依然沒有進入磁碟), log file的flush(刷到磁碟)操作也同時進行。該模式下,在事務提交的時候,不會主動觸發寫入磁碟的操作。
- 如果innodb_flush_log_at_trx_commit設定為1,每次事務提交時MySQL都會把log buffer的資料寫入log file,並且flush(刷到磁碟)中去。
- 如果innodb_flush_log_at_trx_commit設定為2,每次事務提交時MySQL都會把log buffer的資料寫入log file.但是flush(刷到磁碟)操作並不會同時進行。該模式下,MySQL會每秒執行一次 flush(刷到磁碟)操作。
當設為0和2的時候,flush操作不能100%保證,所以在崩潰或斷電的時候可能會丟失最後一秒的資料,而1是預設也是最安全的設定,保證commit的資料不會丟失。MYSQL RDS預設 innodb_flush_log_at_trx_commit也是1,這會對效能有消極影響但除非您可以接受丟失資料,否則不建議修改。
sync_binlog
sync_binlog 控制 MySQL server 將 binary log 同步到磁碟的頻率,MYSQL RDS預設設定為最安全的1,但是同樣會對效能有消極影響,除非您可以接受丟失資料,否則不建議修改。
- sync_binlog=0: MySQL不控制binlog的重新整理,由檔案系統自己控制它的快取的重新整理。這時候的效能是最好的,但是風險也是最大的。因為一旦系統崩潰,在binlog_cache中的所有binlog資訊都會被丟失。
- sync_binlog=1: 這是最安全的設定,表示每次事務提交,MySQL都會把binlog刷下去,不過最安全也是效能損耗最大的設定,尤其對高併發的場景sync_binlog設定為0和1之間寫入效能相差會很大,甚至達到5倍之多。
- sync_binlog=N, N是 0 和1以外的正整數: binary log 會在收集N個binary log commit groups 之後同步,同樣在系統崩潰的時候 ,可能會丟失資料,N越大效能越好但同時丟失資料的風險也越大。
tmp_table_size與max_heap_table_size
MYSQL在很多場景譬如UNION操作,子查詢,排序分組操作中都可能會生成temporary table,我們通過EXPLAIN輸出執行計劃的Extra列可以看到SQL是否使用了temporary table。temporary table的最大大小由tmp_table_size與max_heap_table_size其中較小的值決定(MYSQL RDS這兩個引數預設值都是16777216即16M),temporary table在大小未超過上限時建立在記憶體中,一旦超過該上限,temporary table就會自動轉為磁碟上的表,這將增加磁碟IO和消耗的時間。我們可能都遇到過複雜查詢執行很長時間,從show full processlist可以看到copying to tmp table on disk的狀態,這就說明我們的temporary table超過了上限,轉為了磁碟上的表。
我們可以通過命令SHOW GLOBAL STATUS LIKE ‘Created_tmp%’;檢視記憶體和磁碟中temporary table得數量,我們可以通過Created_tmp_disk_tables和Created_tmp_tables瞭解在磁碟中temporary table的比例。
如果您的應用有大量複雜查詢,Created_tmp_disk_tables比例居高不下,IO成為系統瓶頸而記憶體又有較大餘裕,您可以考慮逐步調大tmp_table_size與max_heap_table_size。但是請注意,這會給記憶體帶來壓力,此外,某些場景下,temporary table一定會建立在磁碟而不是記憶體中,譬如:
- 表中存在BLOB或文字列。這包括具有字串值的使用者定義變數,依據列值是二進位制還是非二進位制字串而分別被視為BLOB或文字列。
- 在一個GROUP BY或DISTINCT子句中存在大於512位元組(二進位制字串)或大於512字元(非二進位制字串)的任何字串列。
- 使用UNION或UNION ALL,且選擇列表中存在最大長度大於512(二進位制字串為位元組,非二進位制字串為字元)的任何字串列。
- SHOW列和DESCRIBE語句使用BLOB作為某些列的型別,因此用於結果的臨時表是磁碟上的表
foreign_key_checks與unique_checks
當我們對MYSQL RDS進行大批量資料匯入或載入,尤其涉及大表時,我們可以通過暫時關閉外來鍵和唯一約束檢查來提高插入效能,但是這會帶來潛在的風險,您務必要確保相應的資料一致和唯一性。否則約束檢查不能通過。
我們可以按以下方式進行資料庫匯入:
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;
... SQL載入語句 ...
SET foreign_key_checks=1;
SET UNIQUE_CHECKS =1;
commit;
Innodb_read_io_threads 和 Innodb_write_io_threads
innodb_read_io_threadsandinnodb_write_io_threads決定了InnoDB使用多少後臺執行緒來處理各種型別的IO請求。通過這個配置InnoDB可以有更好的擴充套件性,每個後臺程序可以處理256個IO請求,InnoDB希望可以平衡請求的負載。兩個引數有效值範圍是1-64,預設值是4。引數決定後臺程序數,但是linux系統預設會設定innodb_use_native_aio不為0,啟動非同步IO,就會突破引數限制
如果您有高階的IO系統,且在SHOW ENGINE INNODB STATUS的輸出中看到64 × innodb_read_io_threads的pending read requests,那麼提升innodb_read_io_threads的值會對提升效能有幫助。
測試
硬體環境
本次測試將通過sysbench軟體對AWS MYSQL5.6 RDS default引數組以及調整後的引數組進行壓測,比對調優效果。請注意:sysbench測試是用來輔助我們判斷系統性能的一個方法,用您的實際業務進行壓測永遠更有針對性。而且在效能測試中,不同的資源配置(包括測試客戶端,資料庫本身以及網路等),引數配置乃至測試流程都會導致不同的結果,所以進行比對分析永遠要先統一測試環境、流程才有意義。
隨著軟體迭代,本文中描述的測試流程可能需要更新,請讀者把握測試流程和指標含義,在工作中按實際情況進行調整。
本文所用硬體環境如下:
2個sysbench客戶端配置如下:
機型 | vCPU | 記憶體(GiB) | 磁碟 | IOPS |
r5.2xlarge EC2 | 8 | 64 | IO1 SSD 50G | 2020 |
資料庫配置如下:資料庫開啟了multi-AZ,保證資料庫高可用,但是會對寫入效能有較大影響
資料庫 | instance class | vCPU | 記憶體(GiB) | 磁碟 | IOPS | 多AZ |
MYSQL5.6 RDS | db.r5.2xlarge | 8 | 64 | IO1 SSD 500G | 18000 | 是 |
引數調整
根據硬體環境以及測試時產生的日誌量,對引數做了針對性調整,有些引數需要資料庫重啟才能生效,請在執行相應測試步驟前確認引數值。
請注意:下面的引數僅僅針對本測試中的硬體環境和測試工作量負載,並不具有普遍性,請讀者理解引數的含義,根據自身環境和工作負載進行相應配置。正如前述,除非您可以接受丟失資料,否則不建議修改innodb_flush_log_at_trx_commit、sync_binlog等引數為了效能而犧牲安全性,所以本次測試沒有對這兩個引數進行修改,如果您有類似需求,可以根據本文提供的方法自行測試。
引數 | 預設值 | 調整後的值 |
innodb_io_capacity | 200 | 2000 |
innodb_io_capacity_max | 2000 | 18000 |
innodb_log_file_size | 134217728 | 4294967296 |
innodb_read_io_threads | 4 | 8 |
innodb_write_io_threads | 4 | 8 |
innodb_flush_log_at_trx_commit | 1 | 1 |
sync_binlog | 1 | 1 |
多可用區 | 是 | 是 |
注意:因為sysbench1.0.18會有大量prepared statement,所以要設定max_prepared_stmt_count為最大值1048576保證測試順利進行,否則初始化時可能遇到錯誤FATAL: MySQL error: 1461 “Can’t create more than max_prepared_stmt_count statements (current value: 16382)”
測試環境準備
在2臺測試客戶端安裝sysbench1.0.18
1.從git中下載sysbench
sudo yum install gcc gcc-c++ autoconf automake make libtool bzr mysql-devel git mysql
git clone https://github.com/akopytov/sysbench.git
2.開啟sysbench目錄
cd sysbench
3.切換到sysbench 1.0.18版本,執行autogen.sh
git checkout 1.0.18
sudo ./autogen.sh
4.編譯
sudo ./configure --prefix=/usr --mandir=/usr/share/man
sudo make
sudo make install
開啟限制
開始測試前,需要在Sysbench客戶端執行 以下配置,告訴Linux kernel可以用所有的CPU cores 去處理 packets(預設只可以用兩個),且減少cores 之間的context switching. 這兩個設定是為了用更少的Sysbench 客戶端達成吞吐目標.( ffffffff表示使用32個核。請根據實際配置修改,例如實際只有8核,則輸入ff)
sudo sh -c 'for x in /sys/class/net/eth0/queues/rx-*; do echo ff > $x/rps_cpus; done'
sudo sh -c "echo 32768 > /proc/sys/net/core/rps_sock_flow_entries"
sudo sh -c "echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt"
sudo sh -c "echo 4096 > /sys/class/net/eth0/queues/rx-1/rps_flow_cnt"
vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
測試流程
只讀負載測試
測試資料注入
首先通過sysbench客戶端在測試資料庫上生成測試表,這裡生成250個表,每個表有行數25000條,您也可以根據您的目標,調整表的數目和大小,請替換<>之中的各種連線資訊,再執行命令,如果您直接從blog拷貝命令請注意格式。後續命令的注意事項相同,將不再贅述
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-port=<port> --mysql-user=<username> --mysql-password=<password> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --time=600 oltp_read_only prepare
測試
在所有sysbench client同時執行命令模擬負載,每次持續20分鐘,同時從console檢視資料庫CPU,IO,網路等metrics。在這裡我們將通過修改num_threads引數連續測試2*32, 2*64,2*128,2*256多種併發連線的場景。
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-user=<username> --mysql-password=<password> --mysql-port=<port> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --max-time=1200 --threads=32 --percentile=95 --range_selects=0 --skip-trx=1 --report-interval=20 oltp_read_only run >> <dbname>_read.log
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-user=<username> --mysql-password=<password> --mysql-port=<port> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --max-time=1200 --threads=64 --percentile=95 --range_selects=0 --skip-trx=1 --report-interval=20 oltp_read_only run >> <dbname>_read.log
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-user=<username> --mysql-password=<password> --mysql-port=<port> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --max-time=1200 --threads=128 --percentile=95 --range_selects=0 --skip-trx=1 --report-interval=20 oltp_read_only run >> <dbname>_read.log
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-user=<username> --mysql-password=<password> --mysql-port=<port> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --max-time=1200 --threads=256 --percentile=95 --range_selects=0 --skip-trx=1 --report-interval=20 oltp_read_only run >> <dbname>_read.log
清除測試資料
測試後清除資料命令如下:
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-port=<port> --mysql-user=<username> --mysql-password=<password> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --time=600 oltp_read_only cleanup
只寫負載測試
資料注入
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-port=<port> --mysql-user=<username> --mysql-password=<password> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --time=600 oltp_write_only prepare
測試
同樣地,在所有sysbench client同時執行命令模擬只寫負載,每次持續20分鐘,同時從console檢視資料庫CPU,IO,網路等metrics。在這裡我們將通過修改num_threads引數連續測試4*32,4*64,4*128和4*256多種併發連線的場景。
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-user=<username> --mysql-password=<password> --mysql-port=<port> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --max-time=1200 --threads=32 --percentile=95 --report-interval=20 oltp_write_only run >> <dbname>_write.log
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-user=<username> --mysql-password=<password> --mysql-port=<port> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --max-time=1200 --threads=64 --percentile=95 --report-interval=20 oltp_write_only run >> <dbname>_write.log
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-user=<username> --mysql-password=<password> --mysql-port=<port> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --max-time=1200 --threads=128 --percentile=95 --report-interval=20 oltp_write_only run >> <dbname>_write.log
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-user=<username> --mysql-password=<password> --mysql-port=<port> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --max-time=1200 --threads=256 --percentile=95 --report-interval=20 oltp_write_only run >> <dbname>_write.log
清除測試資料
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-port=<port> --mysql-user=<username> --mysql-password=<password> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --time=600 oltp_write_only cleanup
讀/寫混合壓力測試
測試資料注入
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-port=<port> --mysql-user=<username> --mysql-password=<password> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --time=600 oltp_read_write prepare
測試
同樣地,在所有sysbench client同時執行命令模擬讀寫混合負載,每次持續20分鐘,同時從console檢視資料庫CPU,IO,網路等metrics。在這裡我們將通過修改num_threads引數連續測試4*32,4*64,4*128和4*200多種併發連線的場景。
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-user=<username> --mysql-password=<password> --mysql-port=<port> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --max-time=1200 --threads=32 --percentile=95 --report-interval=20 oltp_read_write run >> <dbname>_read_write.log
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-user=<username> --mysql-password=<password> --mysql-port=<port> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --max-time=1200 --threads=64 --percentile=95 --report-interval=20 oltp_read_write run >> <dbname>_read_write.log
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-user=<username> --mysql-password=<password> --mysql-port=<port> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --max-time=1200 --threads=128--percentile=95 --report-interval=20 oltp_read_write run >> <dbname>_read_write.log
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-user=<username> --mysql-password=<password> --mysql-port=<port> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --max-time=1200 --threads=200--percentile=95 --report-interval=20 oltp_read_write run >> <dbname>_read_write.log
清除測試資料
sysbench --db-driver=mysql --mysql-host=<mysql host> --mysql-port=<port> --mysql-user=<username> --mysql-password=<password> --mysql-db=<dbname> --table_size=25000 --tables=250 --events=0 --time=600 oltp_read_write cleanup
結果分析
結果解讀
資料庫效能測試輸出結果中的指標包括:
- 每秒執行事務數TPS(Transactions Per Second) 資料庫每秒執行的事務數,以COMMIT成功次數為準。
- SysBench標準OLTP讀寫混合場景中一個事務包含18個讀寫SQL。
- SysBench標準OLTP只讀場景中一個事務包含14個讀SQL(10條主鍵查詢、4條範圍查詢)。
- SysBench標準OLTP只寫場景中一個事務包含4個寫SQL(2條UPDATE、1條DETELE、1條INSERT)。
- 每秒執行請求數QPS(Queries Per Second) 資料庫每秒執行的SQL數。
結果統計
在不同併發連線數下,使用預設引數組和優化引數組的MYSQL RDS只讀負載測試資料如下:
64併發 | 128併發 | 256併發 | 512併發 | |
QPS MYSQL RDS預設引數組 | 125.8K | 125K | 123.8K | 116.8K |
QPS MYSQL RDS優化引數組 | 129.4K | 129.8K | 123.9K | 118.5K |
Response time MYSQL RDS預設引數組(ms) | 5.08 | 10.19 | 20.65 | 43.73 |
Response time MYSQL RDS優化引數組(ms) | 4.87 | 9.82 | 20.6 | 43.05 |
在不同併發連線數下,使用預設引數組和優化引數組的MYSQL RDS只寫負載測試資料如下:
64併發 | 128併發 | 256併發 | 512併發 | |
TPS MYSQL RDS預設引數組 | 1723 | 3025 | 2252 | 1554 |
TPS MYSQL RDS優化引數組 | 1747 | 3372 | 5770 | 8005 |
Response time MYSQL RDS預設引數組(ms) | 37.09 | 42.27 | 113.24 | 325.31 |
Response time MYSQL RDS優化引數組(ms) | 36.85 | 37.94 | 44.29 | 63.73 |
在不同併發連線數下,使用預設引數組和優化引數組的MYSQL RDS讀/寫混合負載測試資料如下:
64併發 | 128併發 | 256併發 | 400併發 | |
TPS MYSQL RDS預設引數組 | 1360 | 2128 | 2430 | 1863 |
TPS AWS MYSQLP RDS | 1399 | 2129 | 2623 | 2787 |
QPS MYSQL RDS預設引數組 | 27.1K | 42.5K | 48.5K | 37.2K |
QPS AWS MYSQLP RDS | 27.9K | 42.6K | 52.4K | 55.7K |
Response time MYSQL RDS預設引數組(ms) | 46.94 | 60.11 | 105.31 | 213.54 |
Response time MYSQL RDS優化引數組(ms) | 45.72 | 59.99 | 97.42 | 142.87 |
結論
通過以上測試資料,我們可以發現:
- 因為我們調整的引數主要針對寫入效能,故而對讀取效能影響較小,而對寫入效能影響較大 ,這從測試結果中得到了體現。
- 併發連線越多,優化相關引數對MYSQL RDS寫入和讀寫混合場景下的效能提升越明顯,最多時,只寫場景下同等負載,優化引數組後RDS的平均響應時間可以縮小到預設引數組RDS平均響應時間的約1/5,TPS可以提升到預設引數組TPS的約5倍。
- 同理,對於讀寫混合場景,當併發數較大或者說寫入負載達到一定量時,引數調整的效果才可以展現出來,這是因為同樣的併發數讀寫混合場景的寫入負載小於只寫場景。
- 測試資料庫開啟了Multi-AZ以保證安全性,這會對效能產生較大影響,在分析資料時也必須考慮。