Weblogic接收SIGQUIT資訊號引發服務中止問題

jaymarco發表於2020-09-22

1  背景介紹

  某日某客戶運維工程師接收到系統報障反應業務緩慢,工程師用命令kill -3 < WLS_PID >的方式傳送一個SIGQUIT訊號給Java應用之後,通常會有當前的Thread Dump輸出,最後thread dump資訊沒有收集出來,相反weblogic程式自動退出,導致服務停止,業務無法正常工作。

2  系統環境

   作業系統: Redhat6.4

JDK版本: JDK1.6

中介軟體版本:weblogic10.3.6

叢集:否

3   故障處理過程

3.1故障 分析

    2020-09-13 15:23左右,客戶現場運維工程師接收到報障反應系統訪問相當慢,於是運維工程師立即檢查中介軟體執行情況,並做了一下執行緒轉儲收集。在做執行緒轉儲收集時候,服務被終止。現場工程師說當時執行了kill -3 <WLS_PID>這條命令來收集thread dump資訊,沒想到竟然把weblogic服務程式給殺掉了。他說以前平時常用kill -3來收集執行緒資訊,今天竟奇怪的把服務給幹掉了。他也反覆確認操作的命令沒錯。

<Sep 11, 2020 4:09:36 PM CST>  <Notice> <WebLogicServer> <BEA-000365> <Server state  changed to STANDBY>

<Sep 11, 2020 4:09:36 PM CST>  <Notice> <WebLogicServer> <BEA-000365> <Server state  changed to STARTING>

<Sep 11, 2020 4:09:40 PM CST>  <Notice> <Log Management> <BEA-170027> <The Server has  established connection with the Domain level Diagnostic Service  successfully.>

<Sep 11, 2020 4:09:40 PM CST>  <Notice> <WebLogicServer> <BEA-000365> <Server state  changed to ADMIN>

<Sep 11, 2020 4:09:40 PM CST>  <Notice> <WebLogicServer> <BEA-000365> <Server state  changed to RESUMING>

<Sep 11, 2020 4:09:40 PM CST>  <Notice> <Server> <BEA-002613> <Channel  "Default" is now listening on 192.168.106.100:9001 for protocols  iiop, t3, ldap, snmp, http.>

<Sep 11, 2020 4:09:40 PM CST>  <Notice> <WebLogicServer> <BEA-000329> <Started WebLogic  Admin Server "bps_Server1" for domain "bps_domain"  running in Production Mode>

<Sep 11, 2020 4:09:40 PM CST>  <Notice> <WebLogicServer> <BEA-000365> <Server state  changed to RUNNING>

<Sep 11, 2020 4:09:40 PM CST>  <Notice> <WebLogicServer> <BEA-000360> <Server started  in RUNNING mode>

Quit (core dumped)    << 程式退出訊號

  發現故障時間15:24產生了一個core dump檔案,應該是kill -3訊號產生的檔案。

weblogic@bps_prod:~/weblogic11g/user_projects/domains/bps_domain>  ls -lrt

total 1132

drwxr-x---  2 weblogic weblogic    4096 Aug 31 14:34 lib

drwxr-x---  2 weblogic weblogic    4096 Aug 31 14:34 console-ext

drwxr-x---  2 weblogic weblogic    4096 Aug 31 14:34 autodeploy

drwxr-x---  2 weblogic weblogic    4096 Aug 31 14:34 security

-rwxr-x---  1 weblogic weblogic     277 Aug 31 14:34 startWebLogic.sh

-rw-r-----  1 weblogic weblogic     736 Aug 31 14:34  startManagedWebLogic_readme.txt

drwxr-x---  2 weblogic weblogic    4096 Aug 31 14:34 init-info

-rw-r-----  1 weblogic weblogic     462 Aug 31 14:34 fileRealm.properties

drwxr-----  7 weblogic weblogic    4096 Sep   1 02:01 servers

-rw-r-----  1 weblogic weblogic     235 Sep   9 14:01 shutdown.py

drwxr-----  2 weblogic weblogic    4096 Sep 10 21:43 tmp

drwxr-----  2 weblogic weblogic    4096 Sep 10 21:44 pending

-rw-r-----  1 weblogic weblogic      32 Sep 10 21:44 edit.lok

drwxr-x--- 10 weblogic weblogic    4096 Sep 10 22:01 config

-rw-------  1  weblogic weblogic 1224704 Sep 13 15:24 core   <<kill  訊號 產生的 core 檔案

  分析產生的 core 檔案,沒有找到完整的資訊

weblogic@bps_prod:~/weblogic11g/user_projects/domains/bps_domain>  gdb  /u01/jdk1.7.0_80/bin/java core

GNU gdb (GDB) SUSE (7.3-0.6.1)

Copyright (C) 2011 Free Software  Foundation, Inc.

License GPLv3+: GNU GPL version 3 or  later <

This is free software: you are free to  change and redistribute it.

There is NO WARRANTY, to the extent  permitted by law.  Type "show  copying"

and "show warranty" for  details.

This GDB was configured as "x86_64-suse-linux".

For bug reporting instructions, please  see:

<

Reading symbols from  /u01/jdk1.7.0_80/bin/java...Missing separate debuginfo for  /u01/jdk1.7.0_80/bin/java

Try: zypper install -C  "debuginfo(build-id)=b82a586842f6da3df8a61093daadf04180e85c16"

(no debugging symbols found)...done.

BFD: Warning:  /u01/weblogic/weblogic11g/user_projects/domains/bps_domain/core is truncated:  expected core file size >= 501276672, found: 1224704.

[New LWP 20758]

[New LWP 20759]

[New LWP 20760]

[New LWP 20761]

[New LWP 20762]

[New LWP 20763]

[New LWP 20764]

[New LWP 20769]

[New LWP 20771]

[New LWP 20773]

[New LWP 20775]

[New LWP 20776]

[New LWP 20777]

[New LWP 20778]

[New LWP 20779]

[New LWP 20780]

[New LWP 20782]

[New LWP 20783]

Cannot access memory at address  0x7f4fc97f5188

Failed to read a valid object file image  from memory.

Core was generated by  `/u01/jdk1.7.0_80/bin/java -server -Xms256m -Xmx512m -XX:MaxPermSize=256m  -Dwebl'.

Program terminated with  signal 3, Quit.

#0   0x00007f4fc93bff95 in ?? ()

(gdb) bt

#0   0x00007f4fc93bff95 in ?? ()

Cannot access memory at address  0x7fff021dec40

聯想起以前處理過類似問題,weblogic程式自動退出。不想要作業系統呼叫正在終止JVM程式。 當某個元件將不正確的關閉訊號傳送到JVM時會發生此問題。 然後,JVM捕獲這些訊號,並關閉所有JAVA程式。

<Notice>  <WebLogicServer> < domain_name> < server_name>  <Thread-1> ... <BEA-000388> <JVM called WLS shutdown hook. The  server will force shutdown now>
 <Alert> <WebLogicServer> < domain_name> < domain_name>  <Thread-1> ... <BEA-000396> <Server shutdown has been  requested by <WLS Kernel>>
 <Notice> <WebLogicServer> < domain_name> < domain_name>  <Thread-1> ... <BEA-000365> <Server state changed to  FORCE_SUSPENDING>

  當時解決這個問題方法是,將-Xrs引數新增到標準WebLogic啟動指令碼中的JAVA_OPTIONS啟動引數中。

為什麼要加-Xrs引數的原因?

  引數-Xrs是為了避免JVM對作業系統訊號的使用。 這個引數告訴JVM不要為許多事情使用任何作業系統訊號,而是依靠載入應用程式(啟動器)來處理TERM,INT; HUP和QUIT。如果JVM作為服務執行,它可以接收CTRL_LOGOFF_EVENT,但不應該啟動關閉,因為作業系統不會實際終止程式。

回過頭來檢查domain 下的啟動環境變數指令碼,發現2020-09-07 22:23 這個時間點setDomainEnv.sh 環境變數指令碼有改動過,而且在JAVA_OPTIONS 變數後確實加入了引數-Xrs.

經過自己在幾個不同版本測試環境下測試,加了這個 -Xrs 引數確實 kill -3 會把服務程式殺死。不加這個 -Xrs 引數用 kill -3 不會把程式殺死,也能夠收集 thread dump 資訊。

3.2 故障原因

  將-Xrs引數新增到標準WebLogic啟動指令碼中的JAVA_OPTIONS啟動引數中,如果用kill -3命令去收集thread dump資訊,直接會觸發作業系統訊號殺掉服務程式。

4 解決方案

  由於大家常用習慣用kill-3命令來收集執行緒轉儲資訊,導致出現這樣的問題。記住以後在生產系統kill儘量不用,不管kill後面帶什麼訊號引數,不建議在生產環境上面執行。

以下是抓取threaddump 常用方法

1 JVM  自帶的工具獲取執行緒堆疊 :

$ JAVA_HOME/bin/jstack wls_pid

2 WebLogic  自帶的獲取  thread dump 的工具:

<DOMAIN_HOME>/bin/setDomainEnv.sh

$JAVA_HOME/bin javaweblogic.Admin -url t3://localhost:9001 -username weblogic -password weblogic1THREAD_DUMP

3 )使用utils.ThreadDumper

java -cpC:\bea\wlserver_10.3\server\lib\weblogic.jar utils.ThreadDumper

4 )使用weblogic console 方法生成

a. 登入 Admin Console , 點選對應的伺服器

b. 點選Server à Monitoring àThreads

c. 點選: Dump Thread Stack 按鈕

5 )使用WLST 工具

java weblogic.WLSTthreaddump.py


5、總結

  本次故障是因一個問題引發了另一個問題,導致問題處理較為急手,作為一名合格的運維工程師,當問題發生後要保持清醒的頭腦,不要盲目去做一些自己不確定性的操作,操作的每一條 指令是否會危機到生產業務。一旦出現操作失誤會讓自己面臨不可收拾的困境。故障雖大還是要學會自我保護。不確定的操作要懂得諮詢專家,操作方案需經過專家評審,故障恢復後做反思與總結。


有需要的朋友可以關注我的公眾號,文章每日一更


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28833846/viewspace-2723080/,如需轉載,請註明出處,否則將追究法律責任。

相關文章