首頁 > 軟體

Tomcat伺服器響應過慢解決方案

2020-09-22 21:01:21

一.分析思路

  1.排除本機自身原因

  2.伺服器效能分析

  3.專案本身分析(不詳細說)

  4.虛擬機器器分析

  5.資料庫分析

二.詳細分析方法

1.排除本機自身原因

  可以使用站長工具測試網站速度。

2.伺服器效能分析

  使用top命令檢視伺服器的資源使用情況,主要分析CPU和記憶體的使用情況(top 命令是 Linux 下常用的效能分析工具,能夠實時顯示系統中各個程序的資源佔用狀況,預設5秒重新整理一下程序列表,所以類似於 Windows 的工作管理員。):

    

  第三行顯示的是Cpu的使用情況,詳細含義如下:

  us---使用者空間佔用CPU的百分比、sy---核心空間佔用CPU的百分比、ni---改變過優先順序的程序佔用CPU的百分比、id---空閒CPU百分比、wa---IO等待佔用CPU的百分比、hi---硬中斷(Hardware IRQ)佔用CPU的百分比、si---軟中斷(Software Interrupts)佔用CPU的百分比、st---Steal Time,分配給執行在主機上其它虛擬機器器的任務的實際CPU時間,一般只有在虛擬機器器OS。

  第4行是當前的記憶體情況,伺服器總記憶體8054352k,已使用2879468k,剩餘5174884k,緩衝265728k。

  我個人的理解是:當us的百分比小於50%時,是不需要去考慮伺服器的設定問題的,如果伺服器的us百分比長時間在70%以上時,可以考慮加強伺服器的硬體設定。此外,還需要檢視伺服器的網路情況,下載一個大型檔案基本就可以確定網路情況了。

3.專案本身分析

  如果使用JDBC連線池,需要對連線池的設定進行分析(分析執行緒池的最大數量和釋放時間等等)。

  這裡以C3P0為例,下面是我曾經做的一個專案的設定,如下圖:

      

  這裡本來只是本地測試的設定方案,由於粗心,上線後忘記修改了,當多人存取時,會出現等待連線超時的情況,我們需要根據專案的實際情況設定合適的設定資料。

還有可能專案的設計方面不合理導致響應緩慢,這裡就不詳細說明了。

  checkoutTimeout---當連線池連線耗盡時,使用者端呼叫getConnection()後等待獲取新連線的時間,超時後將丟擲SQLException,如設為0則無限期等待。單位毫秒。預設: 0
  minPoolSize---連線池中保留的最小連線數,預設為:3
  maxPoolSize---連線池中保留的最大連線數。預設值: 15
  maxIdleTime---最大空閒時間,設定時間內未使用則連線被丟棄。若為0則永不丟棄。預設值: 0
  maxIdleTimeExcessConnections---default : 0 單位 s 這個設定主要是為了減輕連線池的負載,比如連線池中連線數因為某次資料存取高峰導致建立了很多資料連線 ,但是後面的時間段需要的資料庫連線數很少,則此時連線池完全沒有必要維護那麼多的連線,所以有必要將斷開丟棄掉一些連線來減輕負載,必須小於maxIdleTime。設定不為0,則會將連線池中的連線數量保持到minPoolSize。為0則不處理
  acquireIncrement---當連線池中的連線耗盡的時候c3p0一次同時獲取的連線數。預設值: 3

4.虛擬機器器分析

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

  解決方法(以tomcat為例):

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

5.資料庫分析(MySql)

  資料庫的分析內容和需要考慮的方面有很多,這裡只說本人遇到過的幾種情況:

a.最大連線數    

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

  

  Threads_connected---開啟的連線數

  Threads_running---這個數值指的是啟用的連線數,這個數值一般遠低於connected數值

  如果最大連線數的值太小可以根據實際情況進行修改,一般修改為1000即可,設定方法有兩種:

    1.臨時設定,重啟服務後將失效

    

    2.修改資料庫組態檔

      在/etc/my.cnf 檔案的[mysqld]下增減一行:max_connections = 1000

b.超時控制

  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」即可解決。

c.DNS反向解析  

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

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

d.錶快取記憶體

  show global status like 'open%tables%';檢視開啟的表的數量:

        

  open_tables:是當前在快取中開啟表的數量。

  opened_tables:是mysql自啟動起,開啟表的數量。

  當Opened_tables數值非常大,說明cache太小,導致要頻繁地open table,可以檢視下當前的table_open_cache設定:

  show variables like 'table_open_cache'; 檢視快取的上限值

  

  設定table_open_cache的值有兩種方式(如果是4G左右記憶體的伺服器,建議設為2048):

    1.臨時設定,重啟服務後將失效

      set global table_open_cache=2048;

    2.修改資料庫組態檔

      在/etc/my.cnf 檔案的[mysqld]下增減一行:table_open_cache = 2048

e.慢查詢紀錄檔

  記錄的慢查詢紀錄檔的目的是確認是否是由於某些語句執行緩慢而導致的伺服器響應慢。

  慢查詢就不詳細說了,網上可以查到很多。

不過,最後,根據我實際的專案分析,這些都沒有問題,是MongoDb的CPU直接滿了,註釋掉就好了

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com