Java, Only Java!

          統(tǒng)計

          留言簿(20)

          積分與排名

          好友空間

          文檔技巧

          閱讀排行榜

          評論排行榜

          HP-UX+JDK+Apusic+SQL-Server的調(diào)優(yōu)記錄

          最近的項目,面臨情況如下:
          1. 并發(fā)壓力大。平時并發(fā)連接大約在3000左右,高峰期是8000人上線訪問,預(yù)期未來會達到20,000人同時在線。
          2. 受到網(wǎng)絡(luò)攻擊。系統(tǒng)是接在公網(wǎng)上致使網(wǎng)絡(luò)爬蟲和攻擊工具都可能給系統(tǒng)帶來未知壓力,甚至突然增加的并發(fā)訪問導致系統(tǒng)癱瘓。
          3. 數(shù)據(jù)庫壓力大。有大量的數(shù)據(jù)庫訪問操作,并且SQL語句中含有COUNT(*)或者JOIN等消耗系統(tǒng)資源的代碼。

          為了滿足應(yīng)用需要,特別對以下環(huán)境進行了調(diào)優(yōu)。系統(tǒng)基本配置如下:
          HP-UX V11.11 2CPU 4G
          HP JDK V1.5
          Apusic V5.0
          SQL Server 2005

          系統(tǒng)硬件條件已經(jīng)確定,系統(tǒng)資源調(diào)用變化最頻繁的就是應(yīng)用服務(wù)器,因此應(yīng)用服務(wù)器所在的操作系統(tǒng)、Java虛擬機(Java Virtual Machine, JVM)和Apusic AS都需要調(diào)優(yōu)。而應(yīng)用服務(wù)器對數(shù)據(jù)庫的數(shù)據(jù)庫連接池大小也必定會影響數(shù)據(jù)庫服務(wù)器的相關(guān)壓力,因此最后再根據(jù)穩(wěn)定后的應(yīng)用服務(wù)器調(diào)整數(shù)據(jù)庫服務(wù)器配置。

          1. 先調(diào)整JVM。這個先根據(jù)JVM所在的應(yīng)用服務(wù)器物理內(nèi)存的大小和JDK所支持的大小決定,建議是將空閑內(nèi)存的70%~80%分配給JVM使用。下面是Java啟動時用的配置參數(shù):
          -server -Xms1024m -Xmx1024m -Xmn?m -XX:MaxPermSize=256m -XX:NewSize=128m -XX:MaxNewSize=128m -XX:SurvivorRatio=8 -Xincgc、

          注:1. 不同JDK在不同OS下所能使用的內(nèi)存大小是不同
          ?2. Heap的大小和分配現(xiàn)在設(shè)置的是經(jīng)驗值,是否調(diào)整最終還需要分析應(yīng)用來定,一般經(jīng)驗值已經(jīng)滿足需要。
          ?3. GC的機制對系統(tǒng)穩(wěn)定也比較重要,盡可能參考JDK提供的最新GC參數(shù)。
          ?4. 使用server版的JVM一般都會對應(yīng)用系統(tǒng)提升帶來幫助。

          2. 再調(diào)整Apusic應(yīng)用服務(wù)器。因為并發(fā)壓力大,也意味著系統(tǒng)對CPU和內(nèi)存的資源消耗都會比較大,為保證應(yīng)用服務(wù)器的穩(wěn)定修改apusic.conf的配置如下(只保留了修改的部分):
          2.1. 線程池調(diào)整
          ?為了平衡用戶訪問速度與并發(fā)支持的關(guān)系,必須調(diào)整Apusic的線程池。調(diào)整前依據(jù)以下原則:
          ?● 每CPU50用戶的原則(線程池的設(shè)置可參考《Apusic AS V5.1線程池配置和調(diào)優(yōu)》)。
          ?● HTTPHandler是MuxHandler的三倍。
          <SERVICE
          ??? CLASS="com.apusic.util.ThreadPoolService"
          ??? NAME="Apusic:service=ThreadPool,name=MuxHandler"
          ??? >
          ??? <ATTRIBUTE NAME="MaxThreads" VALUE="100"/>
          ??? <ATTRIBUTE NAME="MaxSpareThreads" VALUE="30"/>
          ??? <ATTRIBUTE NAME="MinSpareThreads" VALUE="30"/>
          </SERVICE>

          <SERVICE
          ??? CLASS="com.apusic.util.ThreadPoolService"
          ??? NAME="Apusic:service=ThreadPool,name=HTTPHandler"
          ??? >
          ??? <ATTRIBUTE NAME="MaxThreads" VALUE="300"/>
          ??? <ATTRIBUTE NAME="MaxSpareThreads" VALUE="100"/>
          ??? <ATTRIBUTE NAME="MinSpareThreads" VALUE="100"/>
          </SERVICE>

          2.2. Mux(多路復用服務(wù))調(diào)優(yōu)。多路復用是將客戶端的服務(wù)申請分發(fā)給相應(yīng)的服務(wù),如:HTTP服務(wù)、JMS服務(wù)等等。因此該服務(wù)對資源占用時間較短,不需要分配太多線程,只需要關(guān)注他的接收能力和申請排隊,保證申請不會丟失。
          <SERVICE
          ??? CLASS="com.apusic.net.Muxer"
          ??? >
          ??? <ATTRIBUTE NAME="NumberSelectors" VALUE="2"/>
          ?<!-- 系統(tǒng)CPU核數(shù),多個CPU使用多個Selectors可以加快并發(fā)處理能力 -->
          ??? <ATTRIBUTE NAME="Port" VALUE="80"/>
          ?<!-- 默認的服務(wù)端口 -->
          ??? <ATTRIBUTE NAME="Backlog" VALUE="50"/>
          ?<!-- TCP/IP的隊列大小,如果有大量客戶端連接超時,而服務(wù)器又沒有足夠的CPU壓力,可以調(diào)大這個值 -->
          </SERVICE>

          2.3. WEB服務(wù)調(diào)優(yōu)。
          <SERVICE
          ??? CLASS="com.apusic.web.WebService"
          ??? >
          ??? <ATTRIBUTE NAME="NumberSelectors" VALUE="2"/>
          ?<!-- 系統(tǒng)CPU核數(shù),多個CPU使用多個Selectors可以加快并發(fā)處理能力 -->
          ??? <ATTRIBUTE NAME="MaxKeepAliveConnections" VALUE="300"/>
          ?<!-- 最大保持KeepAlive的連接數(shù),與HTTPHandler保持一致 -->
          ??? <ATTRIBUTE NAME="MaxKeepAliveRequests" VALUE="600"/>
          ?<!-- 最大保持KeepAlive的請求數(shù),設(shè)HTTPHandler×2,大約一個連接支持兩次請求,如果服務(wù)器硬件條件允許可以再開大些 -->
          ??? <ATTRIBUTE NAME="WaitingClientTimeout" VALUE="15"/>
          ??? <ATTRIBUTE NAME="MaxWaitingClients" VALUE="200"/>
          ?<!-- 等待隊列滿了后,將客戶端請求拋棄的等待時間。如果關(guān)注系統(tǒng)反應(yīng)的及時性,就把這個值調(diào)小,還可以把請求隊列MaxWaitingClients調(diào)小;如果關(guān)注系統(tǒng)服務(wù)的有效性則要調(diào)大。-->
          ??? <ATTRIBUTE NAME="KeepAlive" VALUE="True"/>
          ?<!-- 默認打開KeepAlive,了解這個參數(shù)配置需要參看HTTP 1.1協(xié)議 -->
          ??? <ATTRIBUTE NAME="ServletReloadCheckInterval" VALUE="-1"/>
          ?<!-- 設(shè)為-1,意思就是不檢查,因為這個功能是為開發(fā)階段提供熱部署的 -->
          ??? <ATTRIBUTE NAME="KeepAliveTimeout" VALUE="15"/>
          ?<!-- 服務(wù)器關(guān)閉客戶端連接前等待下一次請求的時間,如果系統(tǒng)壓力較大可以將這個值設(shè)小,以便應(yīng)對更多的請求。 -->
          </SERVICE>

          2.3. Session服務(wù)
          基本上采用默認值就可以了,如果需要配置集群才需要調(diào)整Session里面某些配置選項,具體可以參考Apusic集群配置。

          2.4. 數(shù)據(jù)庫連接池服務(wù)
          <datasources>
          ? <datasource name="test"
          ???? jndi-name="jdbc/test"
          ???? driver-class="net.sourceforge.jtds.jdbc.Driver"
          ???? url="Jdbc:jtds:sqlserver://192.168.0.1:1433/test"
          ???? min-spare-connections="50"
          ???? max-spare-connections="50"
          ???? max-connections="150"
          ???? initial-connections="50"
          ? >
          ??? <property name="user" value="sa"/>
          ??? <property name="test-before-reused" value="false"/>
          ??? <property name="password" value="test"/>
          ??? <property name="stmt-cache-size" value="50"/>
          ??? <property name="pre-fetch-size" value="50"/>
          ? </datasource>
          </datasources>
          min-spare-connections、max-spare-connections:在池中保留的空閑數(shù)據(jù)庫連接數(shù);
          initial-connections:初始化的空閑數(shù)據(jù)庫連接數(shù);
          三個值相同,保證在初始化時就有足夠的數(shù)據(jù)庫連接使用。
          數(shù)據(jù)庫連接數(shù)×2=HTTP線程池數(shù)目
          注:max-connections在現(xiàn)實中被調(diào)小。因為數(shù)據(jù)庫服務(wù)器無法處理更多響應(yīng),因此原則是先保證擁有數(shù)據(jù)庫連接的線程能夠有效響應(yīng)。

          3. 調(diào)整HP-UX操作系統(tǒng)。
          3.1. 首先調(diào)整核心資源,使用ulimit -a查看核心參數(shù),特別關(guān)注file和memory兩部分的使用,有些時候操作系統(tǒng)限制了進程打開文件數(shù)和內(nèi)存使用數(shù),無法有效利用硬件資源也會限制應(yīng)用服務(wù)器性能的發(fā)揮。

          3.2. 因為應(yīng)用系統(tǒng)受到攻擊,致使出現(xiàn)大量的CLOSE_WAIT、FIN_WAIT_2這樣狀態(tài)的連接,消耗大量系統(tǒng)資源。因此使用ndd進行網(wǎng)絡(luò)參數(shù)配置,先用:ndd /dev/tcp,然后輸入?,可以得到所有網(wǎng)絡(luò)參數(shù)情況。使用:ndd -get /dev/tcp 參數(shù)名稱,可以獲得原參數(shù)的值。使用:ndd -set /dev/tcp 參數(shù)名稱 參數(shù)值,可以設(shè)置新參數(shù)的值。例如:獲得初始值:ndd -get /dev/tcp tcp_time_wait_interval,設(shè)置新值:ndd -set /dev/tcp tcp_time_wait_interval 30000,30000是毫秒單位=30秒。不能設(shè)置為0,0似乎是無限長的意思。需要關(guān)注的參數(shù)如下:
          #與TIME_WAIT相關(guān)的參數(shù),當系統(tǒng)出現(xiàn)大量此狀態(tài)的連接時可以調(diào)小這個值
          tcp_time_wait_interval ??30000
          tcp_tw_cleanup_interval ?60000
          #與FIN_WAIT相關(guān)的參數(shù)
          tcp_fin_wait_2_timeout? ?1000
          #與KeepAlive相關(guān)的參數(shù),因為應(yīng)用服務(wù)器不負責KeepAlive連接的管理,因此這里由操作系統(tǒng)負責
          tcp_keepalive_interval ??120000
          tcp_keepalive_detached_interval?120000
          tcp_keepalives_kill ??1
          tcp_ip_abort_interval ??600000
          #與TCP連接數(shù)相關(guān)的參數(shù)
          tcp_conn_request_max ??4096

          注:使用ndd重新啟動后就無效了。可以修改/etc/rc.config.d/nddconf就可以在機器重新啟動時有效。

          4. 調(diào)整SQL Server數(shù)據(jù)庫的參數(shù)。這個是因為數(shù)據(jù)庫壓力較大,才關(guān)注到這個部分調(diào)優(yōu)。
          4.1. 內(nèi)存調(diào)整。因為SQL Server內(nèi)存管理默認無限大,結(jié)果把系統(tǒng)資源全部耗盡,因此將服務(wù)器內(nèi)存按照70~80%原則分配給SQL Server使用。
          4.2. 處理器設(shè)置。主要是選擇提升SQL Server的優(yōu)先級和使用Windows纖程,保證SQL Server在操作系統(tǒng)中的執(zhí)行速度。
          4.3. 連接設(shè)置。控制最大并發(fā)連接數(shù),比數(shù)據(jù)庫連接池所設(shè)的連接數(shù)稍大就可以了,防止過多連接導致系統(tǒng)切換線程帶來的資源消耗。同時合理設(shè)置查詢的超時時間,保證資源不會被某個訪問占用。
          4.4. 活動監(jiān)視器。通過活動監(jiān)視器查看系統(tǒng)中的活動進程,以及執(zhí)行的SQL語句,并且在系統(tǒng)壓力較大時觀察是否有資源被鎖。
          ?不過這些其實都只是幫助系統(tǒng)更好的運行,實際上SQL Server資源消耗問題的解決仍然領(lǐng)先應(yīng)用的調(diào)整,應(yīng)用發(fā)現(xiàn)某些表關(guān)聯(lián)有問題,重新調(diào)整后CPU壓力立刻降低。

          ?以上是整個調(diào)優(yōu)的過程記錄。

          posted on 2008-07-04 17:40 zYx.Tom 閱讀(2300) 評論(2)  編輯  收藏 所屬分類: 1.Java世界

          評論

          # re: HP-UX+JDK+Apusic+SQL-Server的調(diào)優(yōu)記錄[未登錄] 2008-07-07 16:40 棒棒

          可有調(diào)優(yōu)前后性能數(shù)據(jù)的比較結(jié)果?  回復  更多評論   

          # re: HP-UX+JDK+Apusic+SQL-Server的調(diào)優(yōu)記錄 2008-07-07 17:13 朱遠翔-Apusic技術(shù)顧問

          因為這個是現(xiàn)場環(huán)境,不是性能測試,因此沒有比較結(jié)果。
          調(diào)優(yōu)都是因為在現(xiàn)場環(huán)境中出現(xiàn)嚴重的性能問題才進行操作的。  回復  更多評論   

          主站蜘蛛池模板: 诸暨市| 唐山市| 华亭县| 什邡市| 榆社县| 图片| 民乐县| 丹巴县| 永济市| 临清市| 新津县| 新河县| 达拉特旗| 新乐市| 盖州市| 凤阳县| 濮阳县| 鱼台县| 平乡县| 宁夏| 藁城市| 铁力市| 洛阳市| 襄汾县| 康保县| 中西区| 麦盖提县| 辛集市| 盐源县| 莲花县| 读书| 田阳县| 晋城| 临湘市| 灵寿县| 德安县| 惠东县| 本溪| 彰武县| 肥西县| 武定县|