解決了一個oracle登錄緩慢的問題


今天接到同事反映,說項目的頁面訪問緩慢,要我們查一下原因。

前端開發的同事查了一下,說是由於數據庫操作緩慢,導致頁面響應時間比較長。

我登錄到數據庫服務器,用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安裝使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM