一次接口壓力測試qps極低原因分析及解決過程
<p>9-2日在做內部的性能測試相關培訓時,發現注冊接口壓力測試qps極低(20左右),這個性能指標遠不能達到上線標准 ,經過一系列調試,最后定位 98%的時間都花在對 用戶 表 做update更新 (時間達100ms以上)。</p>
涉及sql語句:
update User set loginName='q'
where userId='ec171d27-f4a8-478c-b557-dffec8f00826'
分析問題思路:
1) userId字段沒有加索引 驗證: 連接數據庫之后查看表結構,確實沒有做索引。 方案: 給userId加上索引 結果: 未達預期,花費時間基本沒變化 分析: 觀察表的記錄數,才200多條,確實索引不索引對性能影響不會太大,但這個索引還是得加上,只不過沒有索引並不是產生這個問題的原因。
2) 數據表的引擎問題 驗證: 連接數據庫之后查看表結構,引擎為innodb。 方案: 換成myisam 結果: 達到預期,花費時間不到1ms, 再進行壓測,qps達1500以上 分析: 猜測是由於innodb配置導致,查看了my.cnf的配置,一切都用默認的配置,其中 innodbflushlogattrx_commit 默認值1的意思是每一次事務提交或事務外的指令都需要把日志寫入(flush)硬盤,這是很費時的。
3) 換回innodb,優化配置 驗證: 連接數據庫之后查看表結構,引擎為myisam。 方案: 換成innodb, 把innodbflushlogattrx_commit設置為2 結果: 達到預期,花費時間不到1ms, 再進行壓測,qps達1500以上 分析: 結果驗證了之前的設想。
總結, innodb本身在設計上比myisam要先進些,但配置相對復雜,有很多優化的點,希望各位同學能多看些文章,理解innodb和myisam的區別以及innodb的優化方案。
</div>
</div>