Coherence調試
本章介紹瞭如何配置日誌和連貫性應用程序進行故障排除的一般意見。
本章包含以下各節:
概述調試連貫性
配置日誌
執行遠程調試
故障排除相干爲基礎的應用程序
5.1概述調試的連貫性
通常一臺計算機上開發的cohernce應用。緩存服務器和應用程序內啓動IDE和調試應用程序需要。這種類型的開發環境,易於安裝,執行,易於調試。大部分應用程序可以創建和測試這種方式。請參閱“啓用單服務器模式”配置的連貫性,在單個服務器上運行的詳細信息。
理想的情況下,大多數錯誤可以被檢測到在開發過程中使用的日誌記錄,使JVM調試選項,需要捕獲線程和堆轉儲。此外,IDE和分析工具,如Oracle的Java VisualVM的,JConsole的,JRockit任務控制,提供了用於診斷問題的功能。但是,coherence應用程序最終必須進行測試,在一個分佈式環境。調試和故障排除測試環境中是比較困難的,因爲數據和流程完全分佈在整個集羣,因爲網絡現在可以影響到應用程序。遠程調試與Java調試線協議(JDWP)一起連貫性的JMX管理和報告功能,方便調試和在分佈式環境中的故障排除。
使用Oracle支持
Oracle支持可以幫助調試問題和可通過https://support.oracle.com。發送支持問題時,總是在壓縮文件中包括以下項目:
應用程序代碼
配置文件
所有集羣成員的日誌文件
在某些情況下,需要主題和堆轉儲。如果應用程序運行緩慢和/或似乎已被掛起,應該發送線程轉儲。如果應用程序內存用完或消耗更多的內存比預期應送交堆轉儲。
5.2配置日誌
cohernce有它自己的日誌框架,還支持使用log4j和Java記錄的應用程序提供了一個通用的記錄環境中。記錄發生在連貫性上的一個專用的低優先級線程登錄系統的關鍵部分減少的影響。日誌是預配置和默認設置應根據需要改變。
在本節包括以下主題:
更改日誌級別
更改日誌目的地
修改日誌消息格式
設置日誌記錄的字符數限制
使用JDK測井連貫性日誌
連貫性日誌使用log4j日誌
5.2.1更改日誌級別
該記錄器的日誌級別決定發出的日誌消息。默認的日誌級別發出的錯誤,警告,信息,和一些調試信息。在開發過程中,日誌級別應提升到其最大設置,以確保記錄所有調試消息。下面的日誌級別可供選擇:
0 - 此級別包括不相關聯的日誌記錄級別的消息。
1 - 此級別包括以前的水平的消息,再加上錯誤訊息。
2 - 此級別包括以前的水平的消息,並警告消息。
3 - 此級別包括以前的水平的消息加上信息性消息。
4-9 - 這級別包括以前的水平的消息加上內部調試消息。發出更多的日誌信息日誌級別增加。默認的日誌級別爲5。
-1 - 日誌消息發出。
要更改日誌級別,編輯業務覆蓋文件和添加<severity-level>的的元素,內<logging-config>元素,包括水平號碼。例如:
...
<logging-config>
...
<severity-level system-property="tangosol.coherence.log.level">9
</severity-level>
...
</logging-config>
...
tangosol.coherence.log.level系統屬性用於指定日誌級別,而不是使用業務覆蓋文件。例如:
-Dtangosol.coherence.log.level=9
5.2.2修改日誌目的地
記錄器可以配置爲發射日誌消息發送到多個目的地。對於標準輸出到控制檯,stdout和stderr都(默認值)可以使用。該記錄儀也能發射消息發送到指定的文件。
coherence也支持的JDK和log4j日誌框架允許使用的應用程序和連貫性,共享一個通用的日誌框架。請參閱“使用JDK日誌連貫性日誌”和“使用log4j記錄的連貫性日誌”的詳細說明使用這些記錄與連貫性框架。
要改變日誌目的地,編輯業務覆蓋文件,並添加<目的地>的元素,內<logging-config>元素,包括目的地。例如:
...
<logging-config>
<destination system-property="tangosol.coherence.log">stdout</destination>
...
</logging-config>
...
的tangosol.coherence.log系統屬性用於指定日誌目的地,而不是使用的業務覆蓋文件。例如:
-Dtangosol.coherence.log=stdout
5.2.2.1日誌消息發送到一個文件
記錄器可以配置到一個文件中提供了一個路徑和文件名,在<目的地>元素髮出日誌消息。指定的路徑必須已經存在。確保可以訪問指定的目錄有寫權限。輸出追加到文件有沒有大小限制。進程無法共享一個日誌文件,日誌文件被替換,當一個進程被重新啓動。將日誌消息發送到一個文件中通常用於在開發和測試是有用的,如果需要的日誌消息被髮送到Oracle支持。
下面的例子演示了指定的日誌文件名爲coherence.log,寫入到/ tmp目錄:
...
<logging-config>
<destination system-property="tangosol.coherence.log">/tmp/coherence.log
</destination>
...
</logging-config>
...
5.2.3修改日誌消息格式
可以更改默認格式的日誌消息,這取決於所需要的細節量。日誌消息可以包括靜態文本,以及任何在運行時被替換以下參數。
注意事項:
更改日誌消息的格式必須謹慎,因爲這使得問題更難調試,可能會丟失關鍵信息(如成員或線程)。
參數 |
說明 |
date |
此參數顯示記錄消息時的日期/時間(毫秒)。 |
uptime |
此參數顯示的集羣成員一直運作的時間量。 |
product |
該參數顯示的產品名稱和許可證類型。 |
version |
此參數顯示coherence版本,並建立詳細資料。 |
level |
此參數顯示記錄的嚴重性級別的消息。 |
thread |
此參數顯示記錄該消息的線程名稱。 |
member |
此參數顯示羣集成員的ID(如果當前正在運行的集羣)。 |
location |
此參數顯示全羣集成員識別:羣集名稱,站點名稱,機架名,機器名,進程名稱和成員名稱(如果當前正在運行的集羣)。 |
role |
此參數顯示指定集羣成員的作用。 |
text |
此參數顯示的消息文本。 |
要改變日誌消息格式,編輯業務覆蓋文件,並添加<message-format>的元素,內<logging-config>元素,包括格式。例如:
...
<logging-config>
...
<message-format>[{date}] <{level}> (thread={thread}) -->{text}
</message-format>
...
</logging-config>
...
5.2.4設置記錄字符數限制
記錄字符的限制指定的最大字符數,丟棄隊列中的所有剩餘消息從消息隊列中的日誌守護進程。被丟棄的消息由一個日誌條目的日誌記錄系統概述的信息被丟棄的消息的數量和它們的總大小。例如:
異步日誌超出字符限制;丟棄5日誌消息(行= 14,字符=968)
截斷只是暫時的處理隊列時(清空),以便後續的消息會被記錄,記錄器復位。
注意事項:
永遠不會被截斷的消息造成的總字符數超過最大。
字符限制是爲了避免情況記錄,防止恢復從失敗的條件。例如,日誌可以增加已緊張的計時,這會導致額外的故障,產生更多的日誌。這個週期可能會繼續下去,直到恢復是不可能的。限價日誌防止循環的發生。
要設置日誌字符的限制,編輯業務覆蓋文件,並添加一個<character-limit>元素,內<logging-config>元素。輸入的最大字符數爲0(Integer.MAX_VALUE的)或正整數。例如:
...
<logging-config>
...
<character-limit system-property="tangosol.coherence.log.limit">12288
</character-limit>
</logging-config>
...
tangosol.coherence.log.limit系統屬性用於指定日誌字符的限制,而不是使用的業務覆蓋文件。例如:
-Dtangosol.coherence.log.limit12288
5.2.5使用JDK日誌連貫性日誌
使用JDK日誌框架的應用程序可以配置的連貫性,以及使用JDK日誌記錄。 JDK日誌的詳細信息不在本文檔的範圍。 JDK日誌的詳細信息,請參閱http://download.oracle.com/javase/6/docs/technotes/guides/logging/overview.html。
要使用JDK日誌連貫性日誌:
創建一個logging.properties文件。下面的例子配置JDK記錄器發出信息到控制檯和文件。輸出到控制檯被配置爲使用全局日誌級別(INFO)和輸出到文件被配置爲使用最好的日誌級別。對於文件處理模式,指定的路徑必須已經存在。此外,請確保可以訪問指定的目錄有寫權限。
handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level=INFO
java.util.logging.FileHandler.pattern=/tmp/coherence%u.log
java.util.logging.FileHandler.limit=50000
java.util.logging.FileHandler.level=FINEST
java.util.logging.FileHandler.count=1
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
配置的coherence,使用JDK日誌通過指定JDK作爲業務覆蓋文件<destination>元素的價值。例如:
...
<logging-config>
<destination system-property="tangosol.coherence.log">jdk</destination>
...
</logging-config>
...
確保logging.properties文件在運行時或在classpath中找到指定使用java.util.logging.config.file系統屬性。例如:
-Djava.util.logging.config.file=myfile
5.2.6使用log4j記錄coherence日誌
使用log4j日誌框架的應用程序可以配置的連貫性,以及使用log4j日誌。 log4j日誌的詳細信息不在本文檔的範圍。 log4j日誌的詳細信息,請參閱http://logging.apache.org/log4j/1.2/manual.html。
要使用log4j日誌的一致性日誌:
創建一個log4j.properties文件。下面的例子配置log4j的記錄器發出消息到控制檯和文件。輸出到控制檯被配置爲使用全局日誌級別(INFO)和輸出到文件被配置爲使用DEBUG日誌級別。文件附加,確保可以訪問指定的目錄有寫權限。
log4j.logger.Coherence=INFO, stdout, file
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%m%n
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/tmp/coherence.log
log4j.appender.file.threshold=DEBUG
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%m%n
注意事項:
在上面的例子中,使用coherence Logger對象的名稱和連貫性使用的是默認的名稱。業務覆蓋文件內<logger-name>的元素或指定名稱的值的tangosol.coherence.log.logger系統屬性指定的名稱,可以使用不同的名稱。
使用log4j日誌配置的coherence ,通過指定log4j的業務覆蓋文件中的<目的地>元素的價值。例如:
...
<logging-config>
<destination system-property="tangosol.coherence.log">log4j</destination>
...
</logging-config>
...
確保log4j.jar文件log4j.properties文件在運行時在classpath中找到。
5.3執行遠程調試
Java調試線協議(JDWP)提供的能力,遠程調試JVM。大多數IDE工具支持JDWP是用來連接到遠程JVM啓用遠程調試功能。請參閱IDE的文件說明如何連接到遠程JVM。
要啓用遠程調試的緩存服務器上,啓動緩存服務器與下列JVM選項。一旦緩存服務器已經啓動,使用IDE的調試器連接到JVM使用指定的端口(例如5005)。
-Xdebug
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
遠程調試相干應用可能會很困難,當應用程序不再是單節點羣集,因爲數據分佈在集羣的成員。例如,當執行並行網格操作時,操作其中的數據是位於在集羣成員上執行。由於有成員不保證數據的位置,它是最好的約束測試使用單個高速緩存服務器。
此外,監護人和數據包超時可以使集羣調試困難。如果調試器暫停包發佈,集羣和服務線程,它會導致整個集羣的中斷。在這種情況下,禁用的監護人和提高報文的超時在調試會話期間。配置這些設置的詳細信息,請參閱“服務監護人”。
5.4故障基於coherence應用
本節中的主題提供一般故障排除建議。排除coherence爲基礎的應用是,在大多數情況下,排除其他Java應用程序沒有什麼不同。大多數IDE提供的功能,促進這一進程。此外,許多工具,如:Java VisualVM的JConsole的,JRockit任務控制,和第三方工具提供了簡單的方法來監視和故障排除Java應用程序。見故障排除Java SE節的OTN上的詳細信息,故障排除爪哇:
http://www.oracle.com/technetwork/java/javase/index-138283.html
一個的coherence 應用程序在單一服務器上集羣故障排除通常是直線前進。最受歡迎的coherence 的發展工作是在這樣的環境下,因爲它便於調試。分佈式集羣上部署的應用程序的故障排除變得更具挑戰性。
在本節包括以下主題:
使用相干日誌
使用JMX管理和coherence 報告
使用JVM選項來幫助調試
捕獲線程轉儲
捕獲堆轉儲
監視操作系統
5.4.1使用coherence日誌
日誌消息提供的信息,用於監控和故障排除連貫性。大多數日誌消息日誌詞彙解釋在Oracle Coherence的管理員指南。詞彙表提供了額外的細節,以及可以採取的具體行動,當遇到一封。
超過默認配置日誌記錄盒配置是非常重要的,當應用程序的開發和調試。具體來說,使用的日誌級別最高(9級或全部使用JDK或log4j日誌時),以確保所有的日誌消息發出。另外,考慮使用JDK或log4j日誌。這些框架都支持同時滾動文件和控制檯輸出使用。最後,考慮把所有的日誌文件,在一個共同的目錄。一個常見的目錄,使得它更容易查看日誌文件,並把它們打包的連貫性的支持團隊。請參閱“配置日誌記錄”的詳細信息,配置各方面的記錄。
5.4.2使用JMX管理和coherence報告
連貫性管理使用Java管理擴展(JMX)來實現。許多MBean的前提是詳細的健康和穩定的連貫性。 MBean提供了寶貴的見解和移動應用程序從開發環境到一個完全分佈式環境時,應始終使用。 MBean是使用JConsole和VisualVM的或任何支持JMX的管理工具,訪問。此外,連貫性包括收集信息的報告,隨着時間的推移,並提供了一個歷史背景下,這是不可能僅僅通過監視的MBean的MBean。該報告是最經常被用來確定趨勢是有價值的故障排除。管理和報告是不是默認啓用的,必須啓用。與連貫性的管理功能,包括使用的詳細說明,請參閱Oracle Coherence的管理指南。
5.4.3使用JVM選項來幫助調試
大多數JVM中包括選項,方便調試和故障排除。應使用這些選項,儘可能得到儘可能多的信息。請諮詢您的JVM廠商的文檔,其可用的選項。 JVM選項在本節所討論的Java HotSpot具體的。所有JVM選項的詳細信息和使用說明,請參閱Java HotSpot虛擬機選項網頁:
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
下面的JVM選項(標準和非標準)可以幫助調試和故障排除應用程序:
詳細:GC-Xloggc:文件 - 這些選項用於啓用額外的每個垃圾收集事件日誌。在分佈式系統中,單個JVM GC暫停會影響許多JVM的性能,所以它是必不可少的非常密切監控垃圾收集。 Xloggc選項詳細GC相似,但包括時間戳。
-Xprof and -Xrunhprof
這些選項用來查看JVM配置文件數據,而不是爲了用於生產系統。
-XX:-PrintGC, -XX:-PrintGCDetails, and -XX:-PrintGCTimeStamps
這些選項也可用於打印消息在垃圾收集。
-XX:-HeapDumpOnOutOfMemoryError and -XX:HeapDumpPath=./java_pid<pid>.hprof
這些選項是用來啓動一個堆轉儲時顯示java.lang.OutOfMemoryError拋出。
-XX:ErrorFile=./hs_err_pid<pid>.log
此選項保存到一個文件中的錯誤數據。
5.4.4捕獲線程轉儲
coherence 詳細的線程信息,如線程狀態,每個線程在JVM線程轉儲。線程轉儲信息還包括每個死鎖的線程(如適用)。線程轉儲是有用的,因爲coherence 的多線程和分佈式架構。線程轉儲經常被用來解決應用程序運行緩慢或僵持。確保總是收集一些轉儲過了一段時間,因爲一個線程轉儲只在時間的快照。提交支持問題時,總是包括一組線程轉儲。
要執行一個線程轉儲UNIX或Linux操作系統,在應用程序控制臺按Ctrl + \。在Windows中,按CTRL + BREAK(或暫停)要執行的線程轉儲。這兩種方法的線程轉儲中包括堆摘要。
大多數IDE提供的線程轉儲功能,可以用來捕捉線程轉儲,而在IDE中工作。此外,Unix和Linux操作系統可以使用kill -3 PID在IDE中導致遠程線程轉儲。在Windows上,使用第三方工具(如SendSignal)發送CTRL + BREAK信號遠程Java進程,並導致內存轉儲在IDE中。
jvisualvm甲骨文VirtualVM()的JConsole(JConsole的),JRockit任務控制(JRMC)分析工具,如能執行線程轉儲。這些工具是非常有用的,因爲它們提供了一個單一的工具進行故障排除和調試,並顯示許多不同類型的信息,除了剛剛線程細節。
最後,jstack工具可以用來捕捉任何進程的線程轉儲。例如,使用太平紳士找到一個Java進程ID,然後執行以下命令行:
Jstack能夠<PID>
jstack工具不受支持,並可能會或可能無法在未來版本的JDK。
5.4.5捕獲堆轉儲
堆轉儲coherence 在JVM堆中的所有對象的詳細信息。包含多少對象的實例被加載,多少內存分配給對象的信息。堆信息通常用於查找部件的一個應用程序可能浪費資源,造成性能不佳。在一個完全分佈式的coherence 環境,堆轉儲可能會非常棘手,因爲應用程序處理整個羣集發生問題的對象不一定是本地的JVM。確保始終收集幾堆轉儲轉儲過了一段時間,因爲僅僅是一個時間快照。提交支持問題時,總是包括堆轉儲。
捕獲堆轉儲最簡單的方法是使用分析工具。 jvisualvm甲骨文VirtualVM()的JConsole(JConsole的),JRockit任務控制(JRMC)提供堆轉儲特點。此外,大多數IDE提供了一個堆轉儲功能,可以在IDE中工作時,用來捕獲堆轉儲。
作爲替代,JMAP工具可以被用來捕獲堆轉儲,和與jHat工具可以用來查看堆轉儲。例如,使用太平紳士找到一個Java進程ID,然後執行以下命令行:
jmap -dump:format=b,file=/coherence.bin pid
要在瀏覽器中查看堆轉儲,執行以下命令行,然後瀏覽到返回的地址。此文件還可以被加載到了VisualVM觀看。
與jHat / coherence.bin
jmap的和與jHat的工具不受支持,可能會或可能無法在未來版本的JDK。
5.4.6監控作業系統
一個集羣成員的操作系統時,始終監控相干爲基礎的應用程序的故障排除和調試。調整不良的操作系統可以影響整體性能的集羣上的應用可能會產生不利影響。性能調整的詳細信息,請參閱Oracle Coherence的管理員指南。
特別是在以下幾個方面是重要的監測:
CPU - 處理器長時間運行在100%嗎?
Memory/Swapping - 可用的RAM內存被耗盡,造成用於交換空間?
Network - 緩衝區的大小,數據報的大小,和最大傳輸單元(MTU)的大小影響性能 和成功率?
要監控操作系統的整體健康狀況,使用的工具,如vmstat和頂級的Unix / Linux,適用於Windows,使用性能監視器和工具可從Windows Sysinternals的(例如procexp procmon中)。如何測試網絡性能的詳細說明,請參閱Oracle Coherence的管理員指南。