1. 程式人生 > >線上服務經常性宕機問題分析總結

線上服務經常性宕機問題分析總結

問題描述

超影網站系統經常莫名奇妙的就不響應,特別是當釋出一些活動後訪問數量比平時多的時候這種情況尤為突出,表現為使用者不能訪問網站,需要重新啟動服務才能夠解決。

[編輯]問題解決步驟

[編輯]初步把脈

  1. 登入線上伺服器後發現tomcat例項並沒有死掉,依然還存在,cpu、記憶體耗費的也不大,80埠依然被佔用,通過瀏覽器輸入http://localhost 不響應,但telnet localhost 80會返回資訊。
  2. 試圖去尋找相關日誌,tomcat_home/logs下沒有任何日誌,試圖使用jvisualvm檢視tomcat記憶體和執行緒狀況,但在jdk目錄下卻找不到這個工具。試圖使用jps和jstat工具,但不能發現java程序id。
  3. 猜測是記憶體配置太小或者執行緒死鎖問題,但沒有證據支援。試圖修改catalina.bat配置新的虛擬機器記憶體,配置重啟後,依然會出現宕機問題,通過工作管理員發現tomcat程序記憶體不超過150m,也沒有記錄下jvm gc日誌。配置為
    -Xms1024m -Xmx1024m -Xmn512m -XX:PermSize=64M -Xmn=400m -XX:MaxPermSize=128m  -XX:+PrintGCDetails  -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps  -Xloggc:D:\gclog\gc.log 
  4. 百思不得其解,仔細觀察系統的部署方式,發現和官方推薦的方法不同,是通過自己寫的bat指令碼實現,指令碼中自行呼叫java -jar的模式啟動,其配置的最大記憶體值是100m,這就解釋了為什麼工作管理員裡tomcat只佔不到150m了和在catalina.bat裡配置的java引數完全不起作用了。接下來通過在install-bos.bat指令碼中指定jvm引數配置大記憶體:
    -Xms900m -Xmx900m -Xmn500m -XX:PermSize=64M -XX:MaxPermSize=128m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps  -Xloggc:D:\gclog\gc.log
    這樣終於可以看到gc日誌了。通過日誌分析,發現目前線上jdk的版本比較低,沒有server版本,gc採用序列化方式。
  5. 通過初步配置大記憶體,系統穩定了許多,但是司機現象依然存在,只是出現的頻率小了,懷疑有資料庫慢查詢,通過開啟資料庫的慢查詢日誌,發現大量慢查詢語句,這些語1句基本都處理影片遮蔽功能的,需要解決這些慢查詢。
  6. 分析這些慢查詢語句,發現有兩個問題:
    1. select處理過多的欄位,特別是影片簡介欄位,很長但在頁面顯示時卻並不這些資料,佔很多記憶體空間,這樣可能造成年輕代gc頻繁,當用戶量大時,年輕代頻繁gc造成老領代暴增,最終造成full gc,但大量頁面請求還沒有完成,記憶體資料依然在不能被gc,所以頻繁full gc。
    2. 頻繁select,多個方法其實使用大致相同的資料,完全可以一次讀取所有資料,在多個方法中傳遞使用,降低select和資料物件構造的頻率,從而降低gc頻率。

[編輯]深度研究

  1. 為了徹底解決這個問題,特地部署測試機,採用jdk64位最新版+tomcat6 64位版本,採用官方推薦模式部署,然後通過loadrunner做壓力測試
    1. 首次測試,併發50人,壓10分鐘即崩潰,分析發現,這次測試時使用windows service模式部署tomcat,造成catalina.bat的jvm配置引數無效,研究發現,以windows service模式部署時,jvm引數配置需要在service.bat中配置:
      set Jvm_Options="-XX:NewSize=512m;-XX:MaxPermSize=128m;-XX:+PrintGCDateStamps;-XX:+PrintGCTimeStamps;-XX:+PrintGCDetails;-XX:+PrintTenuringDistribution;-Xloggc:e:/gclog/gc.log"
      "%EXECUTABLE%" //US//%SERVICE_NAME% ++JvmOptions %Jvm_Options% %Debug_Options%  "-DRootPath=%CATALINA_HOME%\webapps";-Duser.dir=%CATALINA_HOME%;-Djava.io.tmpdir=%CATALINA_BASE%\temp;-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager;-Djava.util.logging.config.file=%CATALINA_BASE%\conf\logging.properties" --JvmMs 1024 --JvmMx 1024
      "-DRootPath=%CATALINA_HOME%\webapps";-Duser.dir=%CATALINA_HOME%是目前系統初始化需要的目錄配置
      --JvmMs 1024 --JvmMx 1024是jvm記憶體配置
    2. 再次壓測,50人10分鐘即崩潰,分析gc日誌,年輕代的gc頻繁,老齡代上漲迅速,有一段時間持續full gc,每次都不能釋放記憶體,持續full gc造成程式不響應,猜測記憶體洩漏,查詢程式碼檢視發現有洩漏的靜態變數,但未發現洩漏點,通過jstat分析tomcat程序記憶體,發現1小時內不再訪問系統,記憶體會逐漸降下來,所以分析,沒有記憶體洩漏點,是gc頻率造成。
    3. 慢查詢解決後壓測,本次測試使用50併發,壓測1小時,系統響應響應,但會出現資料庫連線失敗異常。分析應該系統訪問資料庫沒有使用連線池,而是直接使用jdbc連線造成的。
    4. 到此為止,需要解決的問題就只剩下資料庫連線池問題了。試圖使用jndi來實現連線池:
      1. 亂碼問題,曾經試圖使用過jndi連線池,但發現數據亂碼,不能解決,一般google的結果是在資料庫url中增加characterEncoding=utf-8即可解決,如果有問題,把'&'修改為'&',即可,但我們的卻不行,分析發現系統使用的jdbc驅動是3.x.x版本,但資料庫是5.0版本,猜測是jdbc驅動不匹配,換成5.0.8解決亂碼問題。
      2. 日期型資料問題,亂碼問題解決後,發了日期型資料處理有問題,當資料庫datetime欄位為0時,系統報不能把'0000-00-00 00:00:00'轉化為datetime異常,但在jdbc3.x.x下沒有問題,應該是換jdbc驅動造成的,經過google發現,在url上增加zeroDateTimeBehavior=convertToNull即可解決。
    5. 再次壓力測試還沒有開始,5月14號後需要再次測試。

[編輯]反思

  1. 日誌問題。日誌是系統出現故障時,程式設計師分析、解決問題的利器。監控、轉儲程序記憶體堆疊並記錄成檔案應該是每個程式設計師必備的技能,開發新系統時定義結構良好的日誌子系統更是架構師必須的責任。日誌是如此的重要,但我們的系統無論是tomcat的日誌還是系統的日誌都沒有記錄,或者記錄的是沒有價值的。程式中到處可見捕獲異常後沒有輸入堆疊而直接定義一個新的異常丟擲的程式碼,這種程式碼拋棄了系統異常的第一手資料。
  2. 部署問題,系統的部署完全無視tomcat官方推薦的部署方案,純粹的自定義,增加了解決問題的難度
  3. 程式碼精煉問題,程式碼基於的資料庫訪問框架有很多程式碼與我們的業務沒有關係,應該剔除

[編輯]其他

配置某一應用為tomcat的預設應用:

  • 刪除webapps下原來的所有應用
  • 刪除conf/catalina下所有
  • server.xml中Host元素下新增
    <Context>path="" docBase="/WebApp" reloadable="true" crossContext="true" </Context>

相關推薦

線上服務經常性問題分析總結

問題描述 超影網站系統經常莫名奇妙的就不響應,特別是當釋出一些活動後訪問數量比平時多的時候這種情況尤為突出,表現為使用者不能訪問網站,需要重新啟動服務才能夠解決。 [編輯]問題解決步驟 [編輯]初步把脈 登入線上伺服器後發現tomcat例項並沒有死掉,依然還存在,c

線上服務mcelog負載異常分析處理流程

線上服務mcelog負載異常分析處理流程一、問題概述:Nginx服務器,HP,有冗余,其中一臺服務器mcelog負載比較高,日誌秒級別,已經影響了此服務器業務。tail -f /var/log/mcelog#註意看此信息是不斷循環,註意看Transaction:Memory scrubbing error M

Linux服務、數據丟失如何進行數據恢復

超級 完整 專業 數據分析 重要 .tar.gz 操作 公司 打開 [數據恢復故障描述]一臺linux網站服務器,DELL R200,管理約50個左右網站,使用一塊SATA 160GB硬盤。正常使用中突然宕機,嘗試再次啟動失敗,將硬盤拆下檢測時發現存在約100個壞扇區。某數

Git服務如何使用本地克隆倉庫快速恢復Git服務

git 代碼庫 分布式在工作中難免會出現代碼倉庫不能使用如:服務器磁盤跪了,高可用失效,地區級別的網絡癱瘓,等等。之前也聽過Git的一大亮點為去中心話的可靠代碼倉庫,那麽問題來了:代碼庫真的宕機了,連不上了,在短時間內需要團隊開發合並代碼,協作開發,發布版本,筆者在網上搜索一圈沒有人寫過類似文章(也有可能大家

遠離服務,騰訊WeTest正式推出服務器深度性能測試服務

容量 工具 系統性能 微博 閾值 進行 業務場景 tro 選擇 WeTest 導讀 隨著城市發展趨向智慧化,不僅移動互聯網應用正迅速融入出行、金融、醫療、娛樂等傳統行業,跟隨移動互聯網成長起來的,還有用戶對應用使用與消費的理性意識。 而在用戶不斷增加的同時,如何避免移動

服務是什麽意思?為什麽會

為什麽 限制 意思 系統 什麽 出了 應該 機房 震動 宕機是臺灣計算機術語,在大陸就叫當機,就是通常說的死機,之所以叫宕機,應該是從英文音譯過來的,即英文:"down",就直接叫宕機了。通常這個時候網站是不能訪問的,也就是說服務器出了問題。1、由操作員

TIME_WAIT、NON_ESTABLISHED 連線數過高,導致tomcat服務直接

TCP常見配置參考地址: http://shift-alt-ctrl.iteye.com/blog/1966744;https://www.cnblogs.com/fczjuever/archive/2013/04/05/3000697.html 以上圖最大連線數接近了2000,這個對於單機環境來說基本已

記憶體分析

1.GDB linux下core dump【總結】 - daleshi - 部落格園 https://www.cnblogs.com/Anker/p/6079580.html 2.同步 3. valgrind的介紹、安裝和使用 - stepup - CSDN部落格 https:/

服務器壽命周期內只會關機一次,為什麽能夠長時間持續工作而不

電源 以及 商業 硬件 著名 使用方式 導致 性能問題 故障 首先,服務器能夠長時間持續的工作是和其硬件架構及使用環境相關的。 排名第一中提到的火星探測器其實使用的也是IBM P series服務器,並且在探測器裏搭載了兩臺,以實現HA冗余。 生活中的商用服務器為了能夠

重啟服務監測

got 計算機 apache off nbsp spa 發現 否則 srv @echo off rem 定義循環間隔時間和監測的服務 set secs=60 set srvname="Apache2.2" echo. echo ================

Oracle_RAC和hang分析處理流程

reply 事件分析 宕機 等待 nal 故障 zab ali 手動 目的:分享一下公司的db故障處理流程,主要是思想。事件描述及影響:2018年9月30日04:43點,zabbix告警odsdb2數據庫疑似宕機,機房值班人員通過堡壘機無法登錄數據庫服務器,從其他機器也無法

dubbo高可用之zookeeper、Dubbo直連、負載均衡、服務降級、叢集容錯

之前我們說了dubbo超時重試啟動檢查等配置,接下來我們說一下dubbo高可用的一些配置 1. zookeeper宕機 我們接下來討論一下如果zookeeper宕機對我們的服務提供者消費者有什麼影響 現象:zookeeper註冊中心宕機,還可以消費dubbo暴露的服務。 原因

IBM WebSphere Portal或效能低常見問題分析 及解決措施

使用IBM WebSphere Portal構建企業門戶系統是使用者比較睿智的一個選擇,但是由於Portal產品比較複雜,宕機或效能低也通常是使用者較為頭疼的問題。經常有客戶門戶上線後出現頁面空白或無法訪問,甚至宕機的問題,令人頭疼不已。本文以IBM Portal常見效能低下或宕機的常見原因分析,並以筆者

【RDA】關於解決問題、分析coredump檔案的整理

在宕機的時候,coredump開啟的情況下,U盤會有一個coredump檔案生成。 把coredump檔案和umf.gdb檔案放在一起。 路徑:RDA512C_Release_0228\aps\application\s2tek\formal 在此路徑下執行:m

Oracle RAC一節點導致另一節點HANG的問題分析

        正所謂“福無雙至,禍不單行”,生產上有套2節點Oracle 11.2.0.4資料庫,其中2節點因硬體故障宕機,1節點去HANG住了。我們一起來分析這起故障。     &

遠離伺服器,騰訊WeTest正式推出伺服器深度效能測試服務

WeTest 導讀 隨著城市發展趨向智慧化,不僅移動網際網路應用正迅速融入出行、金融、醫療、娛樂等傳統行業,跟隨移動網際網路成長起來的,還有使用者對應用使用與消費的理性意識。 而在使用者不斷增加的同時,如何避免移動應用延遲、閃斷、宕機等隱患給開發者們來了首當其衝的挑戰。放眼國內外,每一年都會出現伺服器宕機熱

notification使用不當導致的重啟問題分析(Could not copy bitmap to parcel blob. )

前言 前段時間遇到了一個宕機重啟問題,比較複雜,涉及到多方面的知識,我也分析了很長的時間,期間學到了很多東西,現在把分析的過程整理一下,希望可以給大家一點幫助和啟發,同時也幫助自己再鞏固一下。 一、問題的復現 首先說一下問題最開始的分析思路以及復現的過程,log 中最核心的部

由Redis的hGetAll函式所引發的一次服務事件

昨晚通宵生產壓測,終於算是將生產服務宕機的原因定位到了,心累。這篇部落格,算作一個覆盤和記錄吧。。。   先來看看Redis的快取淘汰演算法思維導圖: 說明:當實際佔用的記憶體超過Redis配置的maxmemory時,Redis就會根據使用者選擇淘汰策略清除被選中的key。  

SHELL指令碼實現服務監控自動重啟

需要先安裝 yum install stat  crontabs (本例項在centos系統下) #!/bin/bash #Shell ##根據修改檔案時間進行監控## content=`ls -l /tmp/log.txt | awk '{ print $5 }'`