1、基準測試php
基準測試的做用:mysql
瞭解當前系統的性能,創建MySQL服務器性能基準線(爲以後的性能優化提供一個超始線)linux
模擬比當前系統更高的負載,找出系統的擴展瓶頸,爲系統擴展與優化提供參考條件git
測試不一樣的硬件、軟件和操做系統配置github
證實新的硬件設備是否配置正確和是不是最優配置web
基準測試能夠分爲集成式測試和單組件式測試。sql
集成式測試就是對整個應用系統進行測試,如一個網站應用系統,對整個網站系統進行測試。數據庫
單組件式測試是對系統中的某個組件進行測試,如對網站中的數據庫這個組件進行測試,或對web服務器這個組件進行測試等。apache
(一)、集成式測試工具性能優化
有http_load,ab,jMeter,wrk等
一、ab的使用
ab即apache bench,是apache httpd包含的一個http壓測工具
(1)ab的安裝
安裝apache httpd便可(詳細安裝教程請參照:Linux下安裝apache httpd及httpd常見用法
(2)ab的經常使用用法
ab [options] url
options表示參數
-n:請求數
-c:併發數(請求人數)
-s:超時時間
url表示壓力測試的地址
如:
1
|
ab -n 2000 -c 10000 http:
//localhost/hello
.php
|
結果以下:
二、wrk的使用
wrk是一款簡單的http壓測工具,安裝和使用都比較簡單(推薦使用)
(1)安裝
1
2
3
|
cd
wrk
make
cp
wrk
/usr/local/bin/wrk
|
(2)使用
wrk <options> url
- options:參數
-c:鏈接數
-d:壓測時間(可使用m(分鐘)、s(秒)這種單位)
-t:使用的線程數
- url:壓測地址
1
|
wrk -c20000 -t10 -d1m http:
//localhost/index
.php
|
結果以下:
三、jMeter的使用
jmeter相對於其餘工具來講相對複雜,以後會有專門的文章來介紹jMeter的使用
(二)、單組件式測試工具
有mysqlslap,sysbench等
一、mysqlslap
它是mysql自帶的壓測工具
使用:mysqlslap <options>
經常使用options詳解:
--auto-generate-sql(或者使用-a),表示使用mysqlslap工具本身生成的sql腳原本測試併發壓力
--concurency(或者使用-c),表示模擬的多少個客戶端同時執行操做
--engine(或者使用-e),表示要測試的存儲引擎
--iterations(或者使用-i),表示在不一樣的併發環境下,各自測試多少次
--number-of-queries=N,表示總的測試查詢次數
如:測試單個用戶
1
|
./mysqlslap -a
|
或:模擬多個用戶(100個)
1
|
./mysqlslap -a -c200
|
二、sysbench
詳細使用請參照:mysql優化調優之一:發現問題-基準測試之sysbench的使用
2、性能分析
與測試同樣,性能分析也包括對整個應用的性能分析和對單個組件的性能分析,針對整個應用,針對不一樣的開發平臺,有不一樣的解決方案。如openresty中能夠經過火焰圖來分析,PHP中可使用xhprof來分析,或者藉助第三方的性能分析工具(通常是收費的,搜索APM便可)
一、應用級性能分析
針對整個應用級的性能分析,非本文的重點,能夠根據項目特性選擇或開發對應的工具來分析。
二、MySQL性能分析
(1)分析慢查詢日誌
可使用mysqldumpslow或者pt-query-digest來分析,具體可參考 mysql慢查詢日誌分析工具的使用
(2)經過show status和show engine innodb status等
show status能夠查看當前服務器的狀態:
查看服務器正在執行的命令
1
|
show status
like
'Com_%'
;
|
查看和服務器之間來往的流量:
1
|
show status
like
'Bytes_%'
;
|
查看在查詢執行期間建立的臨時表和文件:
1
|
show status
like
'Created_%'
;
|
查看服務器運行時間:
1
|
show status
like
'uptime'
;
|
show engine innodb status:查看innodb這種存儲引擎的狀態
(3)經過show profile
經過show profile能夠查看mysql語句的性能損耗在哪些地方
第一步:要打開profiling(能夠先查看是否打開)
1
2
|
show variables
like
'profiling'
;
set
profiling = 1;
|
第二步:執行sql
第三步:查看執行的sql的性能損耗分析報告
查看最近的一條執行結果:
1
|
show profile;
|
查看打開profling後全部的結果:可是隻顯示每條的執行時間:
1
|
show profiles;
|
例如:
1
2
3
4
5
|
mysql>
set
profling =1;
mysql>
select
*
from
population
where
country=
"cn"
;
mysql>
select
*
from
population
where
city =
"beijing"
;
mysql>
select
*
from
population
where
population>=1000000;
mysql>show profile;
|
查看結果:
經過上圖能夠看出整個執行過程每一個階段消耗的時間。
經過show profiles查看:
經過上圖能夠查找每條執行語句消耗的時間
(4)經過show processlist
經過show processlist能夠查看目前有哪些線程進行運行,也能夠認爲這是查找當前mysql鏈接數的方法,對於出現too many connections的錯誤,是一個很好的排查方式。
1
|
show processlist
|
結果以下:
Id:鏈接的編號
User:鏈接的用戶
Host:鏈接的主機
db:鏈接的數據庫名稱
Command:執行的命令
Time:鏈接持續時間
State:鏈接狀態
Info:具體執行的SQL語句
主要的State狀態:(這個狀態值有不少,這裏只列舉經常使用的幾個,能夠根據名稱很容易知道其含義)
Locked:被其餘查詢鎖定
Sending data:正在處理Select查詢的記錄,時時正在把結果發送給客戶端
Connect Out:複製從服務器正在鏈接主服務器
Updating:正在搜索匹配的記錄,而且修改這些數據