1. 程式人生 > >伺服器響應慢的分析與解決

伺服器響應慢的分析與解決

一、排除自身網路問題

可以使用站長工具測試網站速度:站長之家

image.png

二、檢查是否和瀏覽器有關

換一個瀏覽器訪問網站,進行同樣的操作,看是否存在差異。之前有遇到一個問題是在 MacBook 的谷歌瀏覽器上,有一步操作始終無法呈現結果,按 F12 檢視控制檯也沒有報錯,但是有一個介面始終處於pending狀態。於是換個瀏覽器嘗試,沒有出現該問題。最後發現是由於該介面Get請求後攜帶的引數在瀏覽器中的預設編碼方式不一樣導致的,改為 utf-8 編碼後解決問題

三、檢視各項服務的日誌

看看是不是程式丟擲了異常。當然這裡是服務響應比較慢,並不是不返回,也不是http返回500。檢視一下 tomcat 中的日誌或者是程式記錄的業務日誌。一般來說,也就:

// linux 中

# cd xx/tomcat/logs
# tail -f catalina.out

四、檢視伺服器各項引數

現在大多公司都有服務監控系統,有cpu、記憶體、網絡卡、磁碟、url請求的響應時間請求併發、jvm相關等等的監控。當然公司沒有監控系統也不用慌,監控系統只是看起來直觀一點。沒有監控系統,還是可以通過linux命令、JDK自帶的jps, jstack, jmap, jconsole、IBM的HeapAnalyzer以及比較直觀監控的JProfiler等來看。

top 命令檢視負載(可以安裝一個 htop 工具,比 top 更直觀更強大)

                      top命令介面
                        htop介面

可以直接使用 yum install -y htop 命令安裝htop

Tasks行展示了目前的程序總數及所處狀態,要注意zombie,表示殭屍程序,不為0則表示有程序出現問題

Cpu(s)行展示了當前CPU的狀態,us表示使用者程序佔用CPU比例,sy表示核心程序佔用CPU比例,id表示空閒CPU百分比,wa表示IO等待所佔用的CPU時間的百分比。wa佔用超過30%則表示IO壓力很大

Mem行展示了當前記憶體的狀態,total是總的記憶體大小,userd是已使用的,free是剩餘的,buffers是目錄快取。

Swap行同Mem行,cached表示快取,使用者已開啟的檔案。如果Swap的used很高,則表示系統記憶體不足

在top命令下,按1,則可以展示出伺服器有多少CPU,及每個CPU的使用情況。一般而言,伺服器的合理負載是CPU核數*2。也就是說對於8核的CPU,負載在16以內表明機器執行很穩定流暢。如果負載超過16了,就說明伺服器的執行有一定的壓力了。

如果CPU佔用過高,可以根據 pid 和 jstack 工具詳細檢視是由於哪些程式碼造成的。

五、專案本身分析

檢查專案中的一些比如 執行緒池、 資料庫連線池 等引數的配置。(一些生產服務上不需要開啟的服務也應該關閉,比如 swagger UI 等)

六、虛擬機器分析

使用top指令檢視虛擬機器的記憶體佔用情況,有時候可以發現雖然虛擬機器佔用記憶體的百分比不大卻有明顯的上限值,我們就需要去檢視虛擬機器的配置情況。

解決方法(以tomcat為例):

image

具體的數值根據實際情況而定。

七、資料庫分析

  1. 開啟專案中的 sql 執行語句的日誌列印,拿出該語句分析並加以優化(優化語句本身或者優化資料庫)

  2. 設定最大連線數

-- 檢視最大連線數
show variables like '%max_connections%'; 
-- 當前連線的使用情況
show status like 'Threads%';

如果最大連線數的值太小可以根據實際情況進行修改,一般修改為1000即可

  1. 超時控制

mysql存在一項屬性“wait_timeout”,預設值為28800秒(8小時),wait_timeout的值可以設定,但最多隻能是2147483,不能再大了。也就是約24.85天 ,可以通過show global variables like 'wait_timeout';命令來檢視。

wait_timeout的含義是:一個connection空閒超過8個小時,Mysql將自動斷開該connection,通俗的講就是一個連線在8小時內沒有活動,就會自動斷開該連線。由於dbcp沒有檢驗該connection是否有效,用其進行資料操作便會出現異常。

如果是由超時控制引起的問題,不建議修改wait_timeout的值,在資料庫連線的url的後面加上“&autoReconnect=true&failOverReadOnly=false”即可解決。

  1. DNS反向解析

MySQL資料庫收到一個網路連線後,首先拿到對方的IP地址,然後對這個IP地址進行反向DNS解析從而得到這個IP地址對應的主機名。用主機名在許可權系統裡面進行許可權判斷。反向DNS解析是耗費時間的,有可能讓使用者感覺起來很慢。甚至有的時候,反向解析出來的主機名並沒有指向這個IP地址,這時候就無法連線成功了。 可以在配置檔案裡面禁止MySQL進行反向DNS解析,只需在my.cnf的[mysqld]段落中加入如下行即可:

skip-name-resolve (windows與linux下一樣的)

  1. 表快取記憶體
-- 檢視開啟的表的數量
show global status like 'open%tables%';
-- 檢視快取的上限值
show variables like 'table_open_cache';

open_tables:是當前在快取中開啟表的數量。opened_tables:是mysql自啟動起,開啟表的數量。當Opened_tables數值非常大,說明cache太小,導致要頻繁地open table,可以檢視下當前的table_open_cache設定

  1. 慢查詢日誌記錄的慢查詢日誌的目的是確認是否是由於某些語句執行緩慢而導致的伺服器響應慢。需要開啟慢日誌查詢記錄,以及設定慢查詢日誌的時間閾值(秒)
-- 查詢慢日誌記錄是否開啟。預設為關 OFF
show variables like '%slow_query_log%';
-- 查詢時間閾值(秒),超過這個執行時間的sql會被記錄
show variables like 'long_query_time';