小菜一直對操作系統心存畏懼,以前也很少接觸,這次創業購買了Linux雲主機,由於木有人幫忙,只能自己動手優化服務器了。。。。
小菜的雲主機配置大致為:centeos6(32位),4核心cpu,4G內存,5M獨享帶寬。
一、jvm內存優化方案。
要優化服務器,首先從jvm入手,分配好jvm內存,配置方案如下:
declare -x JAVA_OPTS="-server -Xms1280M -Xmx1280M -Xmn512M -Xss1024k -XX:+AggressiveOpts -XX:+UseParallelGC -XX:+UseBiasedLocking"
其中,-server是讓jvm在服務模式下運行,可以提高jvm運行效率,其他的就不用多操心了。
-Xmx是最大內存,如果是32操作系統,2G內存以上,設置為1280G是最優的,設置太大了會造成jvm崩潰,這是32位jvm本身的限制造成的。
-Xmn是最小內存,官方推薦為最大內存的3/8,這里取下整,就521M了
-Xms為初始化內存,直接與最大內存一致,這樣可以避免內存重復分配,降低效率,直接上來就是最大的,jvm也不用再擴展內存了,節省時間。
-Xss是每個線程所占用的內存,也就是每個線程的堆棧大小,太小了容易溢出,太大了會導致創建的線程數量減少,因為最大容量是有限的。這里最大內存為1280M,理論上可以創建1000個左右線程,差不多支持500個並發訪問(是並發訪問哦,也就是500個用戶同一時刻點擊),已經相當可以了。
-XX:+AggressiveOpts,加快編譯。
-XX:+UseParallelGC,優化垃圾回收。
-XX:+UseBiasedLocking,優化鎖機制。
將上邊這條配置,添加到tomcat安裝目錄下的\bin\catalina.sh文件中,放在哪個位置無所謂,只要在cygwin=false這句話之前就可以了。
二、tomcat服務器優化方案
搞定了jvm,接下來就要配置tomcat了,配置如下:
1 <Connector port="80" protocol="HTTP/1.1" 2 3 maxHttpHeaderSize="8192" 4 5 maxThreads="1000" minSpareThreads="100" maxSpareThreads="300" 6 7 enableLookups="false" redirectPort="8443" acceptCount="200" 8 9 connectionTimeout="50000" disableUploadTimeout="true"/>
這些配置中,我們關心的有:
maxThreads最大線程數,設為1000可以創建1000個線程,也就是1000個並發事務,大約可以支持500個完全並發訪問,這是一個相當恐怖的數字,可以試想一下,500個用戶同時點擊,是什么概率。
minSpareThreads最小備用線程數,可以理解為,服務器一旦啟動,馬上創建這么多線程以備使用,因此設置太大了浪費資源,太小了會降低效率,這個就要根據讀者的服務器配置和具體的訪問量來衡量,不能一概而論,我這里的設置僅僅是個參考,本服務器訪問量大約每天幾十萬pv,並且比較集中。
maxSpareThreads最大備用線程數,創建的線程數量超過這個數量時,如果某些線程空閑,那么這些會被回收,直到線程總數量小於這個值。
acceptCount當tomcat啟動的線程數達到最大時,等待的線程數量(注意並沒有新線程創建,只是預定了而已)。這個數值也需要根據實際情況設置,如果設置的偏小,會造成很多請求直接被拒絕;如果設置的偏大,會造成很多請求超時,讀者理解一下吧!
enableLookups關閉tomcat的dns查詢,節省帶寬,無需過多了解。
disableUploadTimeout這個標志允許servlet container在一個servlet執行的時候,使用一個不同的,更長的連接超時。最終的結果是給servlet更長的時間以便完成其執行,或者在數據上載的時候更長的超時時間,總之,就是為了保證每次請求都能順利完成。
將這段話復制到tomcat安裝目錄下的\conf\server.xml文件中。
注意,這個配置在server.xml中本來就存在,可能要和讀者以前的配置融合一下,別直接盲目覆蓋。。。
三、MySQL優化方案
Mysql優化,小菜了解到的就是修改最大連接數,因為mysql默認的最大連接數是100,對於稍微大點的項目,肯定是不夠的。
項目端配置
最大連接數,首先要在程序里設定,如果您的項目采用的是JNDI方式配置的數據源,那么就要去tomcat安裝目錄下的\conf\server.xml文件或\conf\context.xml文件里找到如下配置(小菜只是舉個例子,里邊的配置都是隨便寫的,關鍵是找到Resource節點):
1 <Resource name="demo" 2 auth="Container" 3 type="javax.sql.DataSource" 4 maxActive="500" 5 maxIdle="30" 6 maxWait="5000" 7 username="sa" 8 password="" 9 driverClassName="org.hsqldb.jdbcDriver" 10 url="jdbc:hsqldb:hsql://localhost/runqianDB" />
這里我們需要關注的有:
maxActive是指最大激活連接數為500,也就是說同時最多只可以有500個數據庫連接。這里也可以理解為並發,小菜覺得500已經不少啦,畢竟數據讀完會自動釋放連接,如果您的主機配置不夠高,這里設置太多,比如什么3000,可能導致MySQL啟動失敗。
maxIdle是最大空閑連接數,就算沒有使用數據庫,依然保持這么多連接,以便需要時直接用,提高效率。因為數據庫連接的創建過程相當的耗費時間。參考了很多網站,一般都是30左右,僅供參考!
maxWait是最大等待時間,如果數據庫連接數不夠用,那么等待這么長時間,超過這個時間了就超時,設為-1表示無限等待。
如果您的項目采用的是JDBC配置,也就是項目中有一個properties文件,一般叫什么JDBC.properties、config.properties,具體叫什么小菜就不知道啦,然后里邊會有類似如下配置:
JDBC.DriverClass=com.mysql.jdbc.Driver
JDBC.Url=jdbc\:mysql\://localhost\:3306/xxx?useUnicode\=true&characterEncoding\=utf8
JDBC.User=xxx
JDBC.Password=xxx
JDBC.MaxPoolSize=500
JDBC.MinPoolSize=30
JDBC.WaitTime=5000
這里的MaxPoolSize、MinPoolSize、WaitTime分別和上邊講的maxActive、maxIdle、maxWait對應,但這是小菜的項目,您的項目需要具體分析。。。。
服務器端配置
項目配置好了之后,就要配置MySQL服務器了。
如果您的MySQL是5.0之前的版本,包括5.0,那么可以嘗試用如下方法修改MySQL最大連接數。
在linux系統中找到/usr/bin/mysqld_safe編輯它,找到mysqld啟動的那兩行,在后面加上參數 :
-O max_connections=1000
用紅字特別說明:
if test -z "$args"
then
$NOHUP_NICENESS $ledir/$MYSQLD $defaults --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR $USER_OPTION --pid-file=$pid_file --skip-external-locking -O max_connections=1000 >> $err_log 2>&1
else
ev al "$NOHUP_NICENESS $ledir/$MYSQLD $defaults --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR $USER_OPTION --pid-file=$pid_file --skip-external-locking $args -O max_connections=1000 >> $err_log 2>&1"
這段代碼很不好找,在下也無法說清楚它具體在哪個位置。不過建議從最后往前找會比較快。
重啟mysql服務:# service mysql restart
查看當前最大連接數: mysqladmin -uroot -p variables
如果您的MySQL服務器是5.1之后的版本,包括5.1,或者您用上邊的方法不行,那么可以嘗試如下方法。
在linux系統中找到/etc/my.cnf文件,在里邊的[mysqld]節點下,添加:max_connections=500即可,500就是指最大連接數,可以隨意改。例如:
[mysqld]
datadir=/home/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
default-character-set = utf8
default-collation = utf8_general_ci
max_connections=500
這樣就搞了,重啟MySQL即可。
四、日志優化
日志的重要性不必多說,項目開發時,日志一般是直接輸出到控制台上,方便查看。
但是項目實際發布時,就不能這樣做了,影響效率不說,我們也無法查看這些日志。
小菜的項目中用的是log4j,它有一個配置文件,叫log4j.properties,配置大致如下:
log4j.rootLogger = INFO, R
log4j.appender.R = org.apache.log4j.RollingFileAppender
log4j.appender.R.File = /home/westjavatest/logs/ivlifelog4j.txt
log4j.appender.R.MaxFileSize = 500KB
log4j.appender.R.MaxBackupIndex = 1
log4j.appender.R.layout = org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n
這里我們需要的關注的有:
log4j.rootLogger = INFO, R,這里的INFO指明了日志的級別,一般用INFO就可以了;R是輸出配置,名字隨便起,和下邊log4j.appender.R對應就可以了。
log4j.appender.R.File指明了日志輸出路徑,注意linux下目錄的/和windows下目錄的\相反哦。
log4j.appender.R.MaxFileSize是指每個日志文件的大小,這里設成了不超過500kb,一旦超過,會重新創建一個.txt日志文件。
其他參數就不那么重要了,有興趣的讀者可以自己去谷歌一下~
五、結束語
這些服務器的優化配置,小菜也是第一次接觸,花了很多時間從網上搜集而來的,因此整理一下,方便像小菜這樣的菜鳥。
這些配置,很多都是經驗數據,具體的參數需要根據您服務器的實際情況,進行一定的綜合分析、壓力測試之后,才得到的,小菜列舉的這些只是一般經驗,僅供參考。
最后祝願大家優化順利!