Java, Only Java!

          統(tǒng)計(jì)

          留言簿(20)

          積分與排名

          好友空間

          文檔技巧

          閱讀排行榜

          評(píng)論排行榜

          Apusic AS V5.1線程池配置和調(diào)優(yōu)

          “沒有最優(yōu),只有平衡”。因此在配置與調(diào)優(yōu)之前,我總喜歡先介紹理論基礎(chǔ)。
          Apusic AS V5.1的線程池只是個(gè)池服務(wù),池中沒有具體的線程,池中管理的線程是與業(yè)務(wù)相關(guān)的服務(wù)啟動(dòng)后并加入的。線程池只負(fù)責(zé)管理池中線程的數(shù)量和生命周期,從而簡(jiǎn)化了Apusic應(yīng)用服務(wù)器的池管理框架。驗(yàn)證線程池的方法有以下幾種:
          1. 在Windows下啟動(dòng)Apusic V5.1的mydomain域,里面不帶任何自啟動(dòng)線程的應(yīng)用,在命令行窗口下按Ctrl+Break結(jié)果見附一(各人機(jī)器可能有所不同),發(fā)現(xiàn)系統(tǒng)沒有任何與線程池相關(guān)的線程啟動(dòng)。打開IE訪問一個(gè)HTML頁面,再Ctrl+Break結(jié)果見附二,發(fā)現(xiàn)多了兩個(gè)線程:Running HTTPHandler-1(HTTP服務(wù)線程)和Idle MuxHandler-1(多路復(fù)用服務(wù)線程),Mux空閑是因?yàn)槎嗦窂?fù)用的分配工作已經(jīng)完成,而HTTP忙是因?yàn)镠TTP服務(wù)剛結(jié)束,KeepAlive仍然保持著。可見線程池啟動(dòng)時(shí)是空的,當(dāng)有服務(wù)時(shí)才生成線程加入到池中,池主要負(fù)責(zé)線程的數(shù)量和生命周期。這樣的設(shè)定可以避免受到攻擊時(shí)無限制地創(chuàng)建線程而導(dǎo)致系統(tǒng)宕機(jī);或者合理使用機(jī)器的性能,平衡分配不同線程池中的線程數(shù)量。

          2. 在apusic.conf文件中自定義一個(gè)線程池Test,然后可以在自己的代碼中使用Apusic AS提供的池管理技術(shù),當(dāng)然如果沒有使用這個(gè)池系統(tǒng)也仍然可以正常運(yùn)行,因?yàn)檫@只是個(gè)池服務(wù),只是沒有線程加入到池中而已。
          <SERVICE
          ??? CLASS="com.apusic.util.ThreadPoolService"
          ??? NAME="Apusic:service=ThreadPool,name=Test"
          ??? >
          ??? <ATTRIBUTE NAME="MaxThreads" VALUE="150"/>
          ??? <ATTRIBUTE NAME="Priority" VALUE="5"/>
          ??? <ATTRIBUTE NAME="ServicePriority" VALUE="H"/>
          ??? <ATTRIBUTE NAME="IdleTimeout" VALUE="300"/>
          ??? <ATTRIBUTE NAME="MaxSpareThreads" VALUE="30"/>
          ??? <ATTRIBUTE NAME="MinSpareThreads" VALUE="5"/>
          ??? <ATTRIBUTE NAME="MaxQueueSize" VALUE="500"/>
          </SERVICE>

          3. 只提供default池,其他池都注釋掉,系統(tǒng)依然能夠正常運(yùn)行,也是因?yàn)槌嘏c服務(wù)之間不是緊耦合,沒有的相關(guān)的池,所有的線程統(tǒng)一使用default池,如果有自己的池就通過自定義池處理。
          注意:如果有了自定義池,池中線程數(shù)達(dá)到最大值后,系統(tǒng)不會(huì)使用defalut池來處理的,從而充分保證相應(yīng)服務(wù)池的控制。
          例如:定義了HTTPHandler池,當(dāng)HTTPHandler線程達(dá)到最大值后,其他只能在Queue中排隊(duì),如果Queue也滿了,則其他請(qǐng)求將會(huì)被拒絕。

          Apusic AS自己使用了五種池:
          default:Apusic AS系統(tǒng)默認(rèn)的線程池
          MuxHandler:多路復(fù)用的線程池,主要是將請(qǐng)求向不同的服務(wù),如:HTTP、JMS、ORB等服務(wù)上分配
          HTTPHandler:HTTP服務(wù)的線程池
          JMSHandler:JMS服務(wù)的線程池
          ORBHandler:ORB服務(wù)的線程池
          了解了線程池的基本概念,就可以知道在線程池配置中default池最為重要,其他池可以根據(jù)需要增加或者注釋,所有線程池的配置參數(shù)都是相同的,具體的配置參數(shù)解釋如下:
          MaxThreads:線程池中能夠運(yùn)行的最大線程數(shù),也就是提供服務(wù)的線程數(shù),-1代表無限制
          MinSpareThreads,MaxSpareThreads:線程池中最小/最大空閑的線程數(shù),當(dāng)線程數(shù)符合這個(gè)區(qū)間時(shí)無論空閑多久都不會(huì)被銷毀
          IdelTimeout:空閑線程超時(shí)的時(shí)間,超時(shí)后會(huì)如果運(yùn)行的線程總數(shù)大于MaxSpareThreads則被銷毀
          Priority(1~10):受Java線程優(yōu)先級(jí)管理
          ServicePriority:服務(wù)啟動(dòng)的優(yōu)先級(jí),五種(H > A > N > B > L)
          MaxQueueSize:當(dāng)所有線程都忙時(shí),為無法獲得線程的請(qǐng)求提供隊(duì)列進(jìn)行排隊(duì),Size代表隊(duì)列長度,隊(duì)列滿時(shí)請(qǐng)求被拋棄

          Apusic AS的線程池優(yōu)化:
          ● 一般的WEB應(yīng)用部署在Apusic上時(shí),不會(huì)用到JMS和ORB服務(wù),因此可以將這兩個(gè)池注釋掉,減少資源消耗。
          ● 如果應(yīng)用現(xiàn)階段使用人數(shù)不多,但是伴隨著發(fā)展應(yīng)用人數(shù)會(huì)不斷增長,可以將MinSpareThreads調(diào)整為符合現(xiàn)階段情況的值,將MaxSpareThreads調(diào)整為符合將來的值,這樣系統(tǒng)無須再變動(dòng)就可以有效支持很長一段時(shí)間;
          ● 如果應(yīng)用一段時(shí)間內(nèi)訪問量變化不大,但是系統(tǒng)偶爾會(huì)遇到高峰訪問,那么可以設(shè)置MinSpareThreads=MaxSpareThreads;
          ● MaxThreads的值依據(jù)CPU數(shù)量來定,參考值50×CPU核數(shù),具體值還需要根據(jù)應(yīng)用執(zhí)行過程中對(duì)CPU的壓力決定。
          ● 關(guān)于Apusic AS V5.1服務(wù)的配置,下篇文章會(huì)單獨(dú)介紹。


          附一、
          Full thread dump Java HotSpot(TM) Client VM (1.5.0_14-b03 mixed mode, sharing):

          "AutoDeployer" prio=6 tid=0x030f2970 nid=0x9e0 in Object.wait() [0x03cef000..0x03cefc6c]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x23460458> (a com.apusic.deploy.runtime.AutoDeployer)
          ??????? at com.apusic.deploy.runtime.AutoDeployer.run(Unknown Source)
          ??????? - locked <0x23460458> (a com.apusic.deploy.runtime.AutoDeployer)
          ??????? at java.lang.Thread.run(Thread.java:595)

          "Thread-4" prio=6 tid=0x031ca7f0 nid=0x21c in Object.wait() [0x0349f000..0x0349fd6c]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x2321c188> (a com.sun.corba.se.impl.javax.rmi.CORBA.KeepAlive)
          ??????? at java.lang.Object.wait(Object.java:474)
          ??????? at com.sun.corba.se.impl.javax.rmi.CORBA.KeepAlive.run(Util.java:736)
          ??????? - locked <0x2321c188> (a com.sun.corba.se.impl.javax.rmi.CORBA.KeepAlive)

          "HTTPSessionSwapper" prio=6 tid=0x031d8168 nid=0xb98 in Object.wait() [0x0345f000..0x0345fa6c]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x2318ba58> (a java.lang.Object)
          ??????? at com.apusic.web.session.SessionManager$HouseKeeper.run(Unknown Source)
          ??????? - locked <0x2318ba58> (a java.lang.Object)

          "HttpLogger" prio=2 tid=0x031be630 nid=0xfe8 in Object.wait() [0x0341f000..0x0341f9ec]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x2317d2b8> (a com.apusic.web.http.HttpLogger)
          ??????? at java.lang.Object.wait(Object.java:474)
          ??????? at com.apusic.web.http.HttpLogger.getNextRecord(Unknown Source)
          ??????? - locked <0x2317d2b8> (a com.apusic.web.http.HttpLogger)
          ??????? at com.apusic.web.http.HttpLogger.run(Unknown Source)

          "MuxListener" prio=6 tid=0x031a8be8 nid=0x7dc runnable [0x033df000..0x033dfaec]
          ??????? at java.net.PlainSocketImpl.socketAccept(Native Method)
          ??????? at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)
          ??????? - locked <0x23177890> (a java.net.SocksSocketImpl)
          ??????? at java.net.ServerSocket.implAccept(ServerSocket.java:450)
          ??????? at java.net.ServerSocket.accept(ServerSocket.java:421)
          ??????? at com.apusic.net.BlockingListenerThread.run(Unknown Source)

          "Timer-0" prio=6 tid=0x031c3b08 nid=0xc98 in Object.wait() [0x0339f000..0x0339fb6c]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x23133120> (a java.util.TaskQueue)
          ??????? at java.util.TimerThread.mainLoop(Timer.java:509)
          ??????? - locked <0x23133120> (a java.util.TaskQueue)
          ??????? at java.util.TimerThread.run(Timer.java:462)

          "LogManager" prio=2 tid=0x02e2c680 nid=0xb20 waiting on condition [0x0335f000..0x0335fbec]
          ??????? at sun.misc.Unsafe.park(Native Method)
          ??????? at java.util.concurrent.locks.LockSupport.park(LockSupport.java:118)
          ??????? at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:
          841)
          ??????? at com.apusic.util.concurrent.LinkedBlockingQueue.take(Unknown Source)
          ??????? at com.apusic.logging.manager.ServerLogManager$PushThread.dequeue(Unknown Source)
          ??????? at com.apusic.logging.manager.ServerLogManager$PushThread.run(Unknown Source)

          "Low Memory Detector" daemon prio=6 tid=0x00a83bf0 nid=0xa6c runnable [0x00000000..0x00000000]

          "CompilerThread0" daemon prio=10 tid=0x00a537b8 nid=0xdc4 waiting on condition [0x00000000..0x02c2f6cc]

          "Signal Dispatcher" daemon prio=10 tid=0x00a95a58 nid=0xeb0 waiting on condition [0x00000000..0x00000000]

          "Finalizer" daemon prio=8 tid=0x00a50870 nid=0xbd0 in Object.wait() [0x02baf000..0x02bafa6c]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x230d25c8> (a java.lang.ref.ReferenceQueue$Lock)
          ??????? at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:120)
          ??????? - locked <0x230d25c8> (a java.lang.ref.ReferenceQueue$Lock)
          ??????? at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:136)
          ??????? at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

          "Reference Handler" daemon prio=10 tid=0x00a4f3e8 nid=0xf94 in Object.wait() [0x02b6f000..0x02b6faec]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x230d2650> (a java.lang.ref.Reference$Lock)
          ??????? at java.lang.Object.wait(Object.java:474)
          ??????? at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
          ??????? - locked <0x230d2650> (a java.lang.ref.Reference$Lock)

          "main" prio=6 tid=0x00038c00 nid=0x718 in Object.wait() [0x0007f000..0x0007fc3c]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x230e0ed8> (a com.apusic.server.J2EEServer)
          ??????? at java.lang.Object.wait(Object.java:474)
          ??????? at com.apusic.server.J2EEServer.startup(Unknown Source)
          ??????? - locked <0x230e0ed8> (a com.apusic.server.J2EEServer)
          ??????? at com.apusic.server.Main.main(Unknown Source)

          "VM Thread" prio=10 tid=0x00a80190 nid=0x490 runnable

          "VM Periodic Task Thread" prio=10 tid=0x00a8e780 nid=0xcec waiting on condition

          附二、
          Full thread dump Java HotSpot(TM) Client VM (1.5.0_14-b03 mixed mode, sharing):

          "Running HTTPHandler-1" prio=6 tid=0x02febe58 nid=0xbd8 runnable [0x03d6f000..0x03d6fb6c]
          ??????? at java.net.SocketInputStream.socketRead0(Native Method)
          ??????? at java.net.SocketInputStream.read(SocketInputStream.java:129)
          ??????? at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
          ??????? at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)
          ??????? at java.io.BufferedInputStream.read(BufferedInputStream.java:313)
          ??????? - locked <0x234dd378> (a java.io.BufferedInputStream)
          ??????? at com.apusic.web.http.tcp.TCP_BIOProtocol.readLine(Unknown Source)
          ??????? at com.apusic.web.http.tcp.TCP_BIOProtocol.readRequestLine(Unknown Source)
          ??????? at com.apusic.web.http.tcp.TCP_BIOProtocol.read(Unknown Source)
          ??????? at com.apusic.web.http.tcp.TCP_BIOConnection.getNextRequest(Unknown Source)
          ??????? at com.apusic.web.http.ConnectionHandler.processConnection(Unknown Source)
          ??????? at com.apusic.web.http.ConnectionHandler.run(Unknown Source)
          ??????? at com.apusic.util.ThreadPoolImpl$WorkerThread.run(Unknown Source)

          "Idle MuxHandler-1" prio=6 tid=0x02cc0d90 nid=0x54c in Object.wait() [0x03d2f000..0x03d2fbec]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x23147df0> (a java.lang.Object)
          ??????? at com.apusic.util.ThreadPoolImpl.getWork(Unknown Source)
          ??????? - locked <0x23147df0> (a java.lang.Object)
          ??????? at com.apusic.util.ThreadPoolImpl$WorkerThread.run(Unknown Source)

          "AutoDeployer" prio=6 tid=0x03146980 nid=0x7bc in Object.wait() [0x03cef000..0x03cefc6c]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x2344f8c0> (a com.apusic.deploy.runtime.AutoDeployer)
          ??????? at com.apusic.deploy.runtime.AutoDeployer.run(Unknown Source)
          ??????? - locked <0x2344f8c0> (a com.apusic.deploy.runtime.AutoDeployer)
          ??????? at java.lang.Thread.run(Thread.java:595)

          "Thread-4" prio=6 tid=0x031e3868 nid=0xdc8 in Object.wait() [0x0349f000..0x0349fd6c]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x2321c188> (a com.sun.corba.se.impl.javax.rmi.CORBA.KeepAlive)
          ??????? at java.lang.Object.wait(Object.java:474)
          ??????? at com.sun.corba.se.impl.javax.rmi.CORBA.KeepAlive.run(Util.java:736)
          ??????? - locked <0x2321c188> (a com.sun.corba.se.impl.javax.rmi.CORBA.KeepAlive)

          "HTTPSessionSwapper" prio=6 tid=0x031c1948 nid=0x9f4 in Object.wait() [0x0345f000..0x0345fa6c]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x2318ba58> (a java.lang.Object)
          ??????? at com.apusic.web.session.SessionManager$HouseKeeper.run(Unknown Source)
          ??????? - locked <0x2318ba58> (a java.lang.Object)

          "HttpLogger" prio=2 tid=0x031b8830 nid=0xb2c in Object.wait() [0x0341f000..0x0341f9ec]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x2317d2b8> (a com.apusic.web.http.HttpLogger)
          ??????? at java.lang.Object.wait(Object.java:474)
          ??????? at com.apusic.web.http.HttpLogger.getNextRecord(Unknown Source)
          ??????? - locked <0x2317d2b8> (a com.apusic.web.http.HttpLogger)
          ??????? at com.apusic.web.http.HttpLogger.run(Unknown Source)

          "MuxListener" prio=6 tid=0x02e654a8 nid=0xa28 runnable [0x033df000..0x033dfaec]
          ??????? at java.net.PlainSocketImpl.socketAccept(Native Method)
          ??????? at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)
          ??????? - locked <0x23177890> (a java.net.SocksSocketImpl)
          ??????? at java.net.ServerSocket.implAccept(ServerSocket.java:450)
          ??????? at java.net.ServerSocket.accept(ServerSocket.java:421)
          ??????? at com.apusic.net.BlockingListenerThread.run(Unknown Source)

          "Timer-0" prio=6 tid=0x02e65c08 nid=0xdf0 in Object.wait() [0x0339f000..0x0339fb6c]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x23133120> (a java.util.TaskQueue)
          ??????? at java.util.TimerThread.mainLoop(Timer.java:509)
          ??????? - locked <0x23133120> (a java.util.TaskQueue)
          ??????? at java.util.TimerThread.run(Timer.java:462)

          "LogManager" prio=2 tid=0x02e2d488 nid=0xbfc waiting on condition [0x0335f000..0x0335fbec]
          ??????? at sun.misc.Unsafe.park(Native Method)
          ??????? at java.util.concurrent.locks.LockSupport.park(LockSupport.java:118)
          ??????? at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1
          841)
          ??????? at com.apusic.util.concurrent.LinkedBlockingQueue.take(Unknown Source)
          ??????? at com.apusic.logging.manager.ServerLogManager$PushThread.dequeue(Unknown Source)
          ??????? at com.apusic.logging.manager.ServerLogManager$PushThread.run(Unknown Source)

          "Low Memory Detector" daemon prio=6 tid=0x00a83c78 nid=0xc5c runnable [0x00000000..0x00000000]

          "CompilerThread0" daemon prio=10 tid=0x00a53910 nid=0x780 waiting on condition [0x00000000..0x02c2f6cc]

          "Signal Dispatcher" daemon prio=10 tid=0x00a95ae8 nid=0xc8c waiting on condition [0x00000000..0x00000000]

          "Finalizer" daemon prio=8 tid=0x00a50870 nid=0xd10 in Object.wait() [0x02baf000..0x02bafa6c]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x230d25c8> (a java.lang.ref.ReferenceQueue$Lock)
          ??????? at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:120)
          ??????? - locked <0x230d25c8> (a java.lang.ref.ReferenceQueue$Lock)
          ??????? at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:136)
          ??????? at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

          "Reference Handler" daemon prio=10 tid=0x00a4f3e8 nid=0x1d0 in Object.wait() [0x02b6f000..0x02b6faec]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x230d2650> (a java.lang.ref.Reference$Lock)
          ??????? at java.lang.Object.wait(Object.java:474)
          ??????? at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
          ??????? - locked <0x230d2650> (a java.lang.ref.Reference$Lock)

          "main" prio=6 tid=0x00038c00 nid=0x7fc in Object.wait() [0x0007f000..0x0007fc3c]
          ??????? at java.lang.Object.wait(Native Method)
          ??????? - waiting on <0x230e0ed8> (a com.apusic.server.J2EEServer)
          ??????? at java.lang.Object.wait(Object.java:474)
          ??????? at com.apusic.server.J2EEServer.startup(Unknown Source)
          ??????? - locked <0x230e0ed8> (a com.apusic.server.J2EEServer)
          ??????? at com.apusic.server.Main.main(Unknown Source)

          "VM Thread" prio=10 tid=0x00a80190 nid=0xab4 runnable

          "VM Periodic Task Thread" prio=10 tid=0x00a8e808 nid=0x684 waiting on condition

          參考:
          http://infocenter.apusic.com/help/index.jsp?topic=/com.apusic.studio.doc.server/output/eclipse/threadpool.html

          posted on 2008-06-25 11:57 zYx.Tom 閱讀(2171) 評(píng)論(0)  編輯  收藏 所屬分類: 1.Java世界

          主站蜘蛛池模板: 河东区| 杭锦旗| 札达县| 太湖县| 宜兰县| 平陆县| 察雅县| 石门县| 边坝县| 曲周县| 宣恩县| 西畴县| 和龙市| 分宜县| 莱阳市| 枣阳市| 黄浦区| 鄂托克旗| 凯里市| 香格里拉县| 德钦县| 若尔盖县| 浦县| 南陵县| 普兰店市| 图木舒克市| 宾阳县| 上杭县| 会宁县| 灵川县| 香河县| 邵阳市| 江源县| 武夷山市| 博乐市| 司法| 安义县| 资溪县| 安仁县| 淄博市| 灌云县|