今天接到同事反映,說專案的頁面訪問緩慢,要我們查一下原因,
前端開發的同事查了一下,說是由于資料庫操作緩慢,導致頁面回應時間比較長,
我登錄到資料庫服務器,用vmstat查了一下,發現系統的idle非常高,說明服務器基本沒有壓力,
又讓前臺把前臺用到的sql發給我,分別執行了一下,發現查詢時間都很短,
感覺應該不是資料庫的問題,于是讓前臺同事加多點日志繼續定位,看是不是其它問題,
前端同事忙了一會兒,終于發現了真正的原因:每次連接請求第一次操作資料庫時都比較慢,
查了一下原始碼,發現每個請求程式第一次操作資料庫時都需要先連接一次資料庫,而我們的資料庫登錄一次普通都要花上幾秒鐘,
而一個頁面有時需要發好幾個請求,如果順序處理就要花上十幾秒才能回傳,(由于是測驗環境,設定的并發數不高,才4個)
我讓前端同事改為資料庫連接后不要釋放,在所有請求里面復用,但前端同事表示它用的是php傳統的部署方式,每次請示都需要fork一個新行程處理,請求處理完所有資源都會被釋放,沒辦法這樣做,
沒辦法,只能回到資料庫來,看有沒有辦法優化資料庫登錄速度,
我登錄到資料庫主機,執行以下命令查看資料庫連接情況:
while [ 1 ]; do tnsping orcl; sleep 1; done
發現即使在資料庫主機上,執行tnsping耗時也是比較長的,網上查了一下,說可能是由于監聽日志太大導致的,
雖然想不通為什么日志的大小會影響程式性能,不過還是試了一下:找到資料庫的監聽檔案,發現有2G多,于是把監聽停了,然后洗掉日志檔案重啟,
同時我還查了一下資料庫的表空間占用情況,發現system空間幾乎要滿了,于是我順便清理了一下system空間,
清理程序中發現占用空間最大的是審計結果表,考慮到我們的資料庫是在開發環境用的,不需要開審計,浪費空間又浪費性能,于是順手把資料庫審計也關了,
經過以上操作后,發現資料庫連接快了不少,大部分時候tnsping在1秒之內,
但奇怪的是偶爾還會有一兩次(出現概率大概是1/20)tnsping要花上幾秒鐘才回傳的情況,
網上查了一下,看有沒有人碰上oracle資料庫登錄時快時慢的問題,沒找到相關的文章,但發現有一個人提到他們資料庫服務器配置的dns服務器id錯誤,導致資料庫連接緩慢的問題,原因是oracle在客戶端登錄時,會嘗試使用客戶端的機器名去dns服務器查找對應的ip,如果dns服務器ip配置錯誤就會導致登錄耗時比較長,
于是我打開機器的組態檔/etc/resolv.conf 看一下,看會不會我們也配置錯誤了,
不過發現里面配置的dns服務器為114.114.114.114,這是電信提供的公開的dns(類似谷歌提供的8.8.8.8),在我們機器上是可以正常連接的,
dns服務器沒配置錯,不過我想了一下,我們的機器都是內網的,使用公網的dns查局域網機器名肯定是查不到的,
根據以前的開發經驗,查不到資料耗時肯定比查得到耗時長不少(因為本地快取找不到,要訪問遠端機器),
如果希望通過dns查找內網機器名ip,需要搭建局域網內部的dns服務器,太麻煩了,
考慮到這臺資料庫服務器除了使用yum安裝軟體外,平時沒必要訪問外網,于是把dns配置屏蔽了,
# Generated by NetworkManager
# nameserver 114.114.114.114
修改配置后重新執行
while [ 1 ]; do tnsping orcl; sleep 1; done
發現現在回傳的tnsping資料都很正常了,不會再出現偶爾耗時例外的情況,
讓前臺同事試一下網頁操作,也反饋現在系統反應速度很快,問題到此完美解決了,
后記:每次請求連接一次資料庫始終不是一個好做法,后來我請教了一個比較有經驗的同事,他介紹了一個資料庫連接池中間件,說用這個可以解決php頻繁連接資料庫的問題
https://blog.csdn.net/21aspnet/article/details/50774684
PHP資料庫連接池SQL Relay安裝使用
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/159289.html
標籤:其他
