?小菜一直對操作系統心存畏懼,以前也很少接觸,這次創業購買了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日志文件。
???????? 其他參數就不那么重要了,有興趣的讀者可以自己去谷歌一下~
?
五、結束語
?
???????? 這些服務器的優化配置,小菜也是第一次接觸,花了很多時間從網上搜集而來的,因此整理一下,方便像小菜這樣的菜鳥。
???????? 這些配置,很多都是經驗數據,具體的參數需要根據您服務器的實際情況,進行一定的綜合分析、壓力測試之后,才得到的,小菜列舉的這些只是一般經驗,僅供參考。
???????? 最后祝愿大家優化順利!
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
