1. 程式人生 > >一個指令碼引發的血案

一個指令碼引發的血案

我們本身是一家網際網路金融公司,公司的主流業務就是p2p,因為各種原因吧,15年底啟動建設眾籌平臺。考慮到前期開發過程中的一些弊端和架構經驗,本次架構引用了dubbo做soa服務的治理,web容器nginx+tomcat,後端語言採用java,框架選擇spring+mybaits,前端模板引擎使用的是btl,app採用原生+h5的模式。這個架構可以參考我之前寫的文章《從零到百億網際網路金融架構發展史》中的第三代系統架構,之前的文章主要介紹了架構的變遷,本篇文章主要介紹在第三代平臺中遇到的問題以及解決方法。

首先介紹一下眾籌系統的部署架構(如下圖),網站和app請求都是首先到最前端的nginx,如果只是靜態內容的訪問nginx直接處理後返回;動態請求分別轉發到後端的tomcat前端服務層,前端服務層只關注頁面端業務邏輯不涉及資料庫的操作,如果只是頁面框架渲染以及不涉及資料庫的請求,在前端服務層直接處理返回;如果涉及到資料庫操作或者核心業務邏輯,前端服務層通過dubbo呼叫後端的接入層服務或者核心層服務。

上線在生產測試期間,發現tomcat過一段時間就會莫名奇妙的down掉,特別是後端的tomcat down掉的頻率比較高。後端的tomcat down掉之後對前端的頁面展示沒有影響,會影響後端的交易。

jvm引數配置

檢視tomcat業務日誌,報錯如下:

1234567891011121314151617181920212223242526272829 2016-04-1412:01:55,025-org.jboss.netty.channel.DefaultChannelPipeline-59679839[NewI/Oworker#29] WARN  null -  [DUBBO] An exception was thrown by a user handler while handling an exception event ([id: 0x5f980c11, /xxx:55386 => /xxx:6666] EXCEPTION: com.alibaba.dubbo.remoting.ExecutionException: class com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler error when process received event .), dubbo version: 2.8.4, current host: xxx
com.alibaba.dubbo.remoting.ExecutionException:classcom.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler error when process caught event.at com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler.caught(AllChannelHandler.java:67)at com.alibaba.dubbo.remoting.transport.AbstractChannelHandlerDelegate.caught(AbstractChannelHandlerDelegate.java:44)at com.alibaba.dubbo.remoting.transport.AbstractChannelHandlerDelegate.caught(AbstractChannelHandlerDelegate.java:44)at com.alibaba.dubbo.remoting.transport.AbstractPeer.caught(AbstractPeer.java:127)at com.alibaba.dubbo.remoting.transport.netty.NettyHandler.exceptionCaught(NettyHandler.java:112)at com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter$InternalDecoder.exceptionCaught(NettyCodecAdapter.java:165)at org.jboss.netty.channel.Channels.fireExceptionCaught(Channels.java:525)at org.jboss.netty.channel.AbstractChannelSink.exceptionCaught(AbstractChannelSink.java:48)at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)at com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter$InternalDecoder.messageReceived(NettyCodecAdapter.java:148)at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:109)at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312)at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:90)at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)at java.lang.Thread.run(Thread.java:745)Caused by:java.lang.OutOfMemoryError:unable tocreate newnativethreadat java.lang.Thread.start0(NativeMethod)at java.lang.Thread.start(Thread.java:714)at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949)at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1360)at com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler.caught(AllChannelHandler.java:65)...19more

檢視output日誌,發現其中有這麼一句。

1 SEVERE:The web application[/xxx]appears tohave startedathread named[DubboResponseTimeoutScanTimer]but has failed tostop it.Thisisvery likely tocreateamemory leak.

根據日誌提示貌似有記憶體洩露,以前確實還沒有碰到過這個錯誤,一片迷茫。重新啟動後,先用命令jstat -gc xxx 1000 30檢視java 程序的gc情況,發現在30秒的世界內minor gc了n次,隨懷疑年輕代記憶體配置少了,檢視個區域記憶體的配置引數如下:

1 -Xms10g-Xmx10g-XX:PermSize=1g-XX:MaxPermSize=2g-Xshare:off-Xmn1024m

按照年輕代為堆記憶體為百分之三的原則修改為-Xmn4g,重新啟動觀察之後mimor gc的頻率確實有所下降,測試大約過了3小時候之後又反饋tomcat down掉了,繼續分析啟動引數配置的時候發現了這麼一句-XX:-+DisableExplicitGC,顯示的禁止了System.gc(),但是使用了java.nio的大量框架中使用System.gc()來執行gc期通過full gc來強迫已經無用的DirectByteBuffer物件釋放掉它們關聯的native memory,如果禁用會導致OOM,隨即懷疑是否是這個引數引發的問題,在啟動引數中去掉它。

為了防止再次出現異常的時候能更加詳細的分析堆記憶體的使用情況,在啟動引數中添加了-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/logs/java/,當tomcat down的時候讓輸出堆記憶體檔案,一邊也啟動jvisualvm工具來實時的監控記憶體各個執行緒的使用情況。

資料庫連線池

繼續使用壓測工具來壓測,在壓測的過程中發現名為com.mchange.v2.resourcepool.ssync.ThreadPoolAsynchronousRunner$PoolThred-#xxx的執行緒不斷的增長,並且後臺tomcat報錯如下:

123456789101112131415161718192021222324252627282930 2016-04-1316:55:15,175-com.alibaba.dubbo.common.threadpool.support.AbortPolicyWithReport-83649035[NewI/Oworker#27] WARN  -  [DUBBO] Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-xxx:6666, Pool Size: 200 (active: 200, core: 200, max: 200, largest: 200), Task: 692 (completed: 492), Executor status:(isShutdown:false, isTerminated:false, isTerminating:false), in dubbo://xxx:6666!, dubbo version: 2.8.4, current host: xxx2016-04-1316:55:15,176-com.alibaba.dubbo.common.threadpool.support.AbortPolicyWithReport-83649036[NewI/Oworker#27] WARN  -  [DUBBO] Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-xxx:6666, Pool Size: 200 (active: 200, core: 200, max: 200, largest: 200), Task: 692 (completed: 492), Executor status:(isShutdown:false, isTerminated:false, isTerminating:false), in dubbo://xxx:6666!, dubbo version: 2.8.4, current host: xxx2016-04-1316:55:15,177-org.jboss.netty.channel.DefaultChannelPipeline-83649037[NewI/Oworker#27] WARN  -  [DUBBO] An exception was thrown by a user handler while handling an exception event ([id: 0x2f345d45, /192.168.57.20:36475 => /xxx:6666] EXCEPTION: com.alibaba.dubbo.remoting.ExecutionException: class com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler error when process received event .), dubbo version: 2.8.4, current host: xxxcom.alibaba.dubbo.remoting.ExecutionException:classcom.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler error when process caught event.at com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler.caught(AllChannelHandler.java:67)at com.alibaba.dubbo.remoting.transport.AbstractChannelHandlerDelegate.caught(AbstractChannelHandlerDelegate.java:44)at com.alibaba.dubbo.remoting.transport.AbstractChannelHandlerDelegate.caught(AbstractChannelHandlerDelegate.java:44)at com.alibaba.dubbo.remoting.transport.AbstractPeer.caught(AbstractPeer.java:127)at com.alibaba.dubbo.remoting.transport.netty.NettyHandler.exceptionCaught(NettyHandler.java:112)at com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter$InternalDecoder.exceptionCaught(NettyCodecAdapter.java:165)at org.jboss.netty.channel.Channels.fireExceptionCaught(Channels.java:525)at org.jboss.netty.channel.AbstractChannelSink.exceptionCaught(AbstractChannelSink.java:48)at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)at com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter$InternalDecoder.messageReceived(NettyCodecAdapter.java:148)at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:109)at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312)at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:90)at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:

相關推薦

一個指令碼引發血案

我們本身是一家網際網路金融公司,公司的主流業務就是p2p,因為各種原因吧,15年底啟動建設眾籌平臺。考慮到前期開發過程中的一些弊端和架構經驗,本次架構引用了dubbo做soa服務的治理,web容器nginx+tomcat,後端語言採用java,框架選擇spring+

可能是最簡單的面向對象入門教程(一 ) 一個鴨子引發血案

CP object 語言 語言特性 ogr 只知道 stat 了解 turn 本文假設,諸位看官完全不了解,何謂面向對象,如果已經入門請跳過。另:歡迎交流,不喜勿噴。 假設你只知道class的概念,但是還沒有深入理解,不理解屬性,不理解方法,那麽看下去。 有這麽一個場景

Gson-記錄一個空格引發的json血案

使用的Gson將json自動裝載到Bean,一般情況下,用起來又快又穩。 直到有一天,測試告訴我說,填寫地址時,地址裡有空格,就會500異常。 我把異常截取出來: Type Excepti

springboot--一個空格引發血案

先來看一下錯誤,乍一看很容易被嚇到 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.alibaba.dubbo.spring.

程式設計師跟產品經理打起來了,這是一個需求引發血案...

程式猿(ID:imkuqin) 猿妹 整編綜合自網路昨天朋友圈被刷屏了。據說,事情是這樣的:一個

摘要: Druid連線池一個設定引發血案 -- 連結池出現問題

    今天在一臺配置很低的機器上執行批量更新的程式~~~     大概跑了三十分鐘~~~這配置~~~這程式~~~     然後華麗麗的報異常了~~~     具體異常是這樣的, 1 2 3 4 5 6 7 8 9

【postgresql案例一】一個LIMIT引發的“血案

之前給業務排查的時候發現,業務上存在大量的全量查詢,其中很多資訊都是無用的,採用全量查詢存在以下幾個方面問題:查詢資料量大,導致傳送時間長,在資料庫中經常看到慢查詢日誌,經常需要分析當前業務採用sqlachemly方式操作資料庫,資料量大的時候,經常出現python接收慢,並

Druid連線池一個設定引發血案

參考:http://my.oschina.net/haogrgr/blog/224010 今天在一臺配置很低的機器上執行批量更新的程式~~~     大概跑了三十分鐘~~~這配置~~~這程式~~~     然後華麗麗的報異常了~~~     具

解決MATLAB出現"??? Undefined function or variable 'x'."的問題,一個等號引發的大戰

fin r語 true r語言 檢查 fine 沒有 tlab 改進 最近寫了一段代碼,一直彈出“??? Undefined function or variable ‘x‘.”這個錯誤。仔細檢查了一下,發現是賦值的問題。比如下面兩段代碼 h=

一個電風扇引發的思考

個人 這就是我 一段時間 而不是 感受生活 學習 div 關心 意思 夏天到了,天氣異常的炎熱。在沒有空調、沒有電扇的屋子裏面呆著,僅僅有一把扇子陪伴,中午吃完飯感覺有點困了想睡一覺,就搖著扇子躺在床上,搖著扇子當然要涼快些。所以就慢慢的感覺眼皮都在打架了,這個時候全身

一個命令引發的深思-原來我這樣的菜

異常 strong 個人 water term roo rom oss 檢查 打著卡,上著班,一晃三年過去了...這三年我一直從事的崗位是運維工程師,但我覺得我做的像運維工作的不過才半年,為什麽會這樣覺得呢,那是跟我的工作內容有關(大部分都是掛羊頭賣狗肉吧...)。2014

一個logstash引發的連環案,關於logstash提示:Reached open files limit: 4095, set by the 'max_open_files' option or default, files yet to open: 375248

不多說,直接上問題。版本logstash-2.4.0,啟動後提示錯誤: !!! Please upgrade your java version, the current version '1.7.0_45-mockbuild_2013_10_22_03_37-b00' may cause probl

Vue一個案例引發的動態元件與全域性事件繫結總結

最近在自學 Vue 也瞭解了一些基本用法,也記錄了一些筆記有興趣的朋友可以去檢視我的其他文章,技術這東西真的不能光靠看,看是沒有的,你必須要動手實踐,只有在實戰專案中才能發現問題,才能發現我們沒有掌握的知識點,然後發現問題解決問題,我們的能力才能得以提升,要不然就有點眼高手低了。 基於這個想法於是就開始自己

MyBatis 學習記錄7 一個Bug引發的思考

主題   這次學習MyBatis的主題我想記錄一個使用起來可能會遇到,但是沒有經驗的話很不好解決的BUG,在特定情況下很容易發生.   異常 java.lang.IllegalArgumentException: Mapped Statements collection already co

shell指令碼學習-練習寫一個指令碼1

    # 1.依次展示/etc/passwd中的使用者名稱和UID。格式如:Hello,$USER,your UID is $UID.# 2.統計一個有多少個使用者 #!/bin/bash #Program Description: #Author: Created b

SHELL指令碼學習-練習寫一個指令碼3

  #通過ping命令測試192.168.1段的所有主機是否線上,如果線上就顯示is up並顯示藍色,如果不線上就顯示is down。 #!/bin/bash #Program Description: #Author: Created by ctu_lzq #Date: 2018

Python實現指令碼鎖功能,同時只能執行一個指令碼

1. 檔案鎖 指令碼啟動前檢查特定檔案是否存在,不存在就啟動並新建檔案,指令碼結束後刪掉特定檔案。 通過檔案的判斷來確定指令碼是否正在執行。 方法實現也比較簡單,這裡以python指令碼為例 #coding=utf-8 # #   檔案鎖指令碼測試 # import os

Vue一個案例引發「動畫」的使用總結

專案開發中動畫有著很重要的作用,而且也是用到的地方非常多,例如:滑鼠的進入離開,彈窗效果,元件的顯示隱藏,列表的切換等等,可以說我們網頁上的動畫無處不在,也有人說了,這些東西也可以不使用動畫。 對,你說的沒錯可以不使用,但是,首先你要說服你的產品經理咱能不能簡單點,不搞這麼多虛的來點實際的,說完之後我估計你

Vue一個案例引發「內容分發slot」的最全總結

今天我們繼續來說說 Vue,目前一直在自學 Vue 然後也開始做一個專案實戰,我一直認為在實戰中去發現問題然後解決問題的學習方式是最好的,所以我在學習一些 Vue 的理論之後,就開始自己利用業餘時間做了一個專案,然後通過專案中的一些案例進行總結。 今天我們來說說 Vue 中的內容分發 <slot>

appium+python一個指令碼同時執行在多臺android裝置

# -*- coding:utf-8 -*- from appium import webdriver; import subprocess import time import os import login_Activity import threading; from selenium.web