文章編寫計劃
待完成: 詳細介紹用到的各個工具
作者: 萬千鈞(祝星)
適合閱讀人群
文中的調優思路無論是php, java, 還是其他任何語言都適用. 如果你有php使用經驗, 那肯定就更好了
業務背景
框架及相應環境
- laravel5.7, mysql5.7, redis5, nginx1.15
- centos 7.5 bbr
- docker, docker-compose
- 阿里雲 4C和8G
問題背景
php已經開啟opcache, laravel也運行了optimize命令進行優化, composer也進行過dump-autoload命令.
首先需要聲明的是, 系統的環境中是一定有小問題的(沒有問題也不可能能夠提升如此大的性能), 但是這些問題, 如果不通過使用合適的工具, 可能一輩子也發現不出來.
本文關注的就是如何發現這些問題, 以及發現問題的思路.
我們首先找到系統中一個合適的API或函數, 用來放大問題.
這個api設計之初是給nginx負載均衡做健康檢查的. 使用ab -n 100000 -c 1000 進行壓測, 發現qps只能到140個每秒.
我們知道Laravel的性能是出了名的不好, 但是也不至於到這個程度, 從api的編寫來看不應該這麼低. 所以決定一探究竟.
public function getActivateStatus()
{
try {
$result = DB::select(select 1);
$key = 1;
if ($result[0]->$key !== 1) {
throw new Exception("mysql 檢查失敗");
}
} catch (Exception $exception) {
Log::critical("資料庫連接失敗: {$exception->getMessage()}", $exception->getTrace());
return
esponse(null, 500);
}
try {
Cache::getRedis()->connection()->exists("1");
} catch (Exception $exception) {
Log::critical("緩存連接失敗: {$exception->getMessage()}", $exception->getTrace());
return
esponse(null, 500);
}
return
esponse(null, 204);
}
問題表現以及排查思路
top
top命令發現系統CPU佔用100% 其中用戶態佔80%, 內核態佔20%, 看起來沒什麼大問題. 有一個地方看起來很奇怪