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

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

直觀 lan sql數據庫 cat 方法 閾值 ack time www

一、排除自身網絡問題

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

技術分享圖片 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‘;


參考:https://www.cnblogs.com/yangc/p/6859985.html

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