分類  >  Web前端 >

一個Web表格項目的性能分析和優化實踐(三) :提高Web應用伺服器Tomcat的內存配置,並確認配置正確

tags:    時間:2013-12-09 23:31:52
一個Web報表項目的性能分析和優化實踐(三) :提高Web應用伺服器Tomcat的內存配置,並確認配置正確

摘要

上一篇,一個Web報表項目的性能分析和優化實踐(一):小試牛刀,統一顯示SQL語句執行時間 ,講述了項目優化的整體背景,重點講述了統一顯示了Web項目SQL語句的執行時間。

本篇,將重點介紹提高Web應用伺服器Tomcat的內存配置,並確認配置正確的方法。

背景

這個Web報表項目,用的Linux系統,Web應用伺服器使用的是Tomcat7.0。

根據已有程序開發的經驗,我認為手動分配和提高Tomcat的內存,能夠降低Web請求響應時間,提高系統的性能。

手動提高Tomcat內存前後的響應時間,沒有記錄和進行對比,因此「提高了系統的性能」現在只能算是一種「感覺」。

實際提升了多大幅度的性能,還需要有真實數據進行對比才能知道。

本文,不再探討此問題,重點闡述如何配置Linux下的Tomcat的內存。

1.配置方法

Linux系統

在/usr/local/tomcat/bin 目錄下的catalina.sh添加:

JAVA_OPTS='-Xms512m -Xmx1024m'
要加「m」說明是MB,否則就是KB了,在啟動tomcat時會 報內存不足。

-Xms:初始值
-Xmx:最大值
-Xmn:最小值

註:Tomcat的路徑可能有所不同。

catalina.sh

# -----------------------------------------------------------------------------(上面還有很多#開頭的註釋)

# OS specific support.  $var _must_ be set to either true or false.
JAVA_OPTS= 『-Xms512m -Xmx1024m』
cygwin=false
darwin=false
os400=false
case "`uname`" in
CYGWIN*) cygwin=true;;
Darwin*) darwin=true;;
OS400*) os400=true;;
esac

Windows系統
在catalina.bat最前面加入
set JAVA_OPTS=-Xms128m -Xmx350m

經驗教訓

Linux下的配置方法和Windows下的是不一樣的。

這類問題是很常見的,總結成文,而不是放在大腦里,很有必要。

2.查看Tomcat的內存配置

如果,我們只是根據自己的或者網友的方法,配置了參數,就認為「萬事大吉」,是非常不科學的,是不負責任的表現。

Tomcat完整的壓縮包中,webapps目錄含有manager這個項目。

比如C:\apache-tomcat-7.0.22\webapps\manager

我們Linux系統的項目中,已經把這個模塊刪除了。

現在,重新拷貝這個模塊到Tomcat的webapps目錄。

第一次訪問的時候,沒有許可權。

需要修改tomcat的conf目錄下的tomcat-users.xml這個配置文件,增加以下配置

<tomcat-users>

  <role rolename="manager-gui"/>

  <user username="username" password="123456" roles="manager-gui"/>

</tomcat-uses>

然後,使用配置的用戶名和密碼,訪問 http://ip:port/manager。

點擊Server Status 超鏈接,或者直接訪問 http://ip:port/manager/status。

可以看到以下信息

看到「Free memory: 268.18 MB Total memory: 970.18 MB Max memory: 1758.25 MB」才真正表明,我們的配置成功了。

3.真相何在

  細心的讀者可能會發現,「Free memory: 268.18 MB Total memory: 970.18 MB Max memory: 1758.25 MB」與我們配置的 『-Xms512m -Xmx1024m』不完全吻合。
  從上面的參數中,我們只能知道Tomcat的內存確實增大了,但是增大的規則和我們預期的不完全一樣。

  Total memory和Max memory等具體表示啥含義,為什麼會是這樣,我現在還不是很清楚。

  這個問題暫時不再深究,今後,再看Tomcat的書籍和文檔,可能能夠找到這個問題的答案。

  知道的同學,可以留言告訴我下。

4.回答一個熱心網友的評論

評論內容

我沒有仔細看你寫的代碼,但是看你的標題之後,我處理的流程會是:
在程序沒有錯的情況下,
一、看hql語句是否被濫用了,該用select col from table的寫成select * from table了
二、看where子句的執行順序,一般最後面的條件是過濾掉大部分數據的條件,以次類推。看看是否改用join的地方使用了select col from table where col in (select ...)的語句,檢查視圖的sql語句
三、給表的列適當建立索引
四、再高級一些的就是讀寫分離或者mysql集群了(我也木有搞過)

--評論參見:http://blog.csdn.net/fansunion/article/details/13620783

我的回復

1."該用select col from table的寫成select * from table了"
查詢了過多的欄位,這種情況是存在的。
這個晚點優化。
2.看where子句的執行順序。
咱們用的大多數 關聯查詢,很少用子查詢。
這個晚點優化。

3.給表的列適當建立索引。
這個是本周的重點。
我們有一個資料庫,全是數據和維度,有數據更新的時候,才會插入。
索引會比較有效。
4.讀寫分離或者mysql集群。
等正式上線,數據量大了之後,應該會弄。
我也不熟悉,需要邊學邊用,不會的就去問boss或者公司相關大牛。
 

相關閱讀

一個Web報表項目的性能分析和優化實踐(一):小試牛刀,統一顯示SQL語句執行時間

一個Web報表項目的性能分析和優化實踐(二):MySQL資料庫連接不夠用(TooManyConnections)問題的一次分析和解決案例

原文參見http://FansUnion.cn/articles/3019

推薦閱讀文章

Bookmark the permalink ,來源:互聯網