Part 1
— 前言 —
壓力測試過程中,因為資源使用瓶頸等問題引發的最直接的性能問題是業務交易響應時間偏大,TPS逐漸降低等。而問題定位分析通常情況下,最優先排查的是監控服務器資源利用率,例如先用TOP 或者nmon等查看CPU、內存使用情況,然后在排查IO問題,例如網絡IO、磁盤IO的問題。 如果是磁盤IO問題,一般問題是SQL語法問題、MYSQL參數配置問題、服務器自身硬件瓶頸導致IOPS吞吐率問題。
今天主要是講解MYSQL 參數配置不合理導致在高并發下磁盤IO問題。
Part 2
— 三種問題 —
1、 打開日志跟蹤引起的磁盤IO問題
例如:MySQL的日志包括錯誤日志(ErrorLog),更新日志(UpdateLog),二進制日志(Binlog),查詢日志(QueryLog),慢查詢日志(SlowQueryLog)等,正常情況下,在生產系統或者壓力測試環境中很少有系統會時時打開查詢日志。因為查詢日志打開之后會將MySQL中執行的每一條Query都記錄到日志中,會該系統帶來比較大的IO負擔,而帶來的實際效益卻并不是非常大。
2、 SQL寫法問題引起磁盤IO高
例如:曾經在做某一個項目時,在看到數據庫磁盤IO使用率偏高,前端查詢業務交易loadrunner顯示事物響應時間偏長,通過監控工具抓取對應SQL,通過計劃分析,發現該SQL中使用distinct 又多表關聯且是大表、然后使用order by,最終顯示10筆數據,而在產生中間過程數據進行篩選時,使用的是臨時表,并把數據放入臨時表中,內存剛好設置不大,于是放到磁盤中導致IO偏高。
備注:MySQL在執行SQL查詢時可能會用到臨時表,臨時表存儲,MySQL會先創建內存臨時表,但內存臨時表超過配置指定的值后,MySQL會將內存臨時表導出到磁盤臨時表。
3、 MYSQL參數配置問題
MYSQL默認配置性能低下,只能通過并發下嘗試調整參數配置來逐步優化數據庫性能,2017年底根據公司要求配合幫助某一家銀行業務系統做性能測試,因為測試環境硬件資源有限,我跟公司申請了幾臺過時的筆記本,然后根據生產環境軟件版本等配置要求,進行模擬搭建性能測試環境,基礎軟件包含:MYSQL5.6、centos7.2、tomcat7、 JDK1.7、redis。使用的是聯想L421 筆記本當MYSQL數據庫服務器、L440當tomcat應用服務器,壓力測試工具loadrunner、并發用戶100,壓力測試業務場景:用戶登錄退出、相關票據信息查詢、電子匯票交易流程等,在壓力測試過程中發現部分交易在50用戶并發時,數據庫磁盤I0使用率都偏高,特別是寫操作一直很高,例如測試登錄退出交易,經監控數據庫磁盤IO率一直偏高,下面我將以此為例作為講解。
Part 3
— 優化前后 —
優化前
壓力測試時,數據庫磁盤IO使用率大于75%,響應時間1.6秒,通過NMON監控到的數據庫資源使用情況,如下圖一與圖二:
圖一:
圖二:
優化后
數據庫服務器資源使用率:
圖三:
圖四:
Part 4
— 優化內容 —
通過優化innndb等影響IO、內存的一些參數后,性能問題明顯解決,優化參數內容,例如:innodb_write_io_threads、innodb_read_io_threads、innodb_flush_log_at_trx_commi等InnoDB 引擎優化IO 子系統參數配置若干。