1. 程式人生 > >天啦嚕!生產機器連線數飆升到上萬,背後發生了什麼?

天啦嚕!生產機器連線數飆升到上萬,背後發生了什麼?

個人部落格地址 studyidea.cn,點選檢視更多原創文章

0x00. 翻車現場

那是個月黑風高的夜晚,小黑哥成功將新版本釋出到了生產,小心翼翼檢查了應用日誌,後續測試小姐姐驗收成功。

恩,小黑哥我還是一如既往的穩~

接著小黑哥就跑到樓下食堂吃個夜宵,誰知正吃到一半,線上運維同學發來幾條告警資訊,伺服器連線數過多警告,連線數已經飆升到上萬。

天啦擼,趕緊放下正在啃的雞腿,火速跑到工位上檢視問題。

0x01. 歷盡艱辛,深入排查

開啟電腦,首先確認生產交易一切還正常。檢視這段時間日誌,發現並沒有什麼異常情況,日誌都是正常輸出。沒辦法只好再次走查此次改動的程式碼,發現全是業務程式碼,並沒有任何與網路連線有關的程式碼改動。

問題真的請奇怪,一時半會想不到解決方案,只好先實施重啟大法。重啟過後,連線數下降了,到達了正常閾值。但是不一會連線數持續升高,不一會還是升到上萬。

這下重啟解決不了辦法,只好從應用出發,找找到底什麼問題。

這個應用是一個路由服務,會根據上游系統指定路由編碼,將交易分發到下游子系統。架構圖如下:

之前在這篇文章路由系統演化史講過,路由系統使用 Dubbo API ,程式碼如下:

由於我們還有另外一套系統,也部署這個應用,但是該系統生產機器連線數卻很少。交叉比對了兩套系統應用的系統配置值,只有 connections 設定不一樣,當前有問題的系統設定為 1000,另外一個系統為 10 。

大致找到原因,也將 connections 設定為 10,重啟應用,生產機器連線數恢復正常。

0x02. 抽絲剝繭,還原經過

首先我們來看下 connections 這個配置的作用,可以直接檢視官方文件http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-reference.html。

下面配置來源於:dubbo:reference

總共可以在三個地方配置 connections 引數,分別為:dubbo:reference,dubbo:consumer,dubbo:provider。

注意:圖中標示地方實際上與原始碼存在出入。截止 Dubbo 2.7.3 版本,圖中 ① 處,dubbo:consumer 文件上顯示為 100,實際原始碼預設配置為 0,這點需要注意。另外 ② 處文字描述存在問題,目前 connections 引數主要對 dubbo 協議有用,http 短連線協議還未使用該配置

其中 reference.connections 為服務級別的配置,若未配置將會使用 consumer.connections 配置值。另外這個引數若在 provider.connections 配置,其對服務提供者無效,引數將通過註冊中心傳遞給消費者成為其預設配置。三者實際作用順序如下:

Debug 原始碼,connections 最終會在 DubboProtocol#getClients 被使用,方法原始碼如下:

Dubbo 協議預設將會使用 Netty 與服務提供者建立長連線

首先將會獲取 connections 配置,規則如上圖,若其大於 0,建立 connections 數量的長連線。

如果一個提供者對外暴露 10 個介面,且其有兩個節點。消費者端引入提供者所有服務,配置 connections=1000。當消費者啟動之後,將會立刻建立 1000x2x10=20000 連線。這就是生產機器連線數飆升的根本原因。

路由服務使用 Dubbo API 程式設計,服務啟動成功之後,只有上游系統呼叫路由服務時, Dubbo 才會與與下游服務提供者建立連線,所以現象看起來服務連線數是慢慢激增。

如果未設定 connections 引數,Dubbo 將會建立共享連線(shareconnections)。消費者呼叫的服務若為同一個服務提供者(IP+PORT 區分),這些服務介面將會共享這些連線。

shareconnections 可以在 dubbo:consumer 配置中配置,也可以在啟動 JVM 引數加入如下配置:

-Dshareconnections=10

如果消費者需要呼叫同個服務提供者應用的 10 個服務介面,服務提供者提供兩個節點,shareconnections=1000,消費者服務啟動之後,僅會建立 1000*2=2000 連線。

這麼對比,shareconnections 與 connections 建立連不是一個量級。

2.1 使用連線

消費者呼叫服務時,將會隨機從連線陣列中取一個連線使用,程式碼位於 DubboInvoker#doInvoke

2.2 如何正確配置連線數

首先我們來看下單一長連線效能,文件地址:http://dubbo.apache.org/zh-cn/docs/user/references/protocol/dubbo.html

對於只有少數消費者場景,我們可以使用預設配置,即不配置 connections 引數 。若呼叫同一個提供者服務過多,可以考慮適當多配增加 shareconnections。最後若某一服務介面呼叫量特別大,可以考慮為這個服務單獨配置 connections。

0x03. 舉一反三,聊聊其他配置

Dubbo 還有很多配置項,下面著重介紹一些配置引數。

3.1 dubbo.provider.executes

該引數用來控制每個方法最大並行數。如果該值設定為 10 ,每個服務方法若已有 10 個請求正在處理,第 11 個服務請求將會丟擲異常,直到之前服務呼叫完成,正在請求數量小於 10 未知。

一旦設定 executes>0,Dubbo 將會通過 SPI 機制啟用 ExecuteLimitFilter,原始碼還是比較簡單。

3.2 dubbo.reference.actives

這個引數將會控制消費者每個服務每個方法最大併發數。可以通過 dubbo:method.actives 單獨為服務方法設定。如果該值為 10,一旦某個服務某個方法併發數超過 10,第 11 個服務將會等待,若在超時時間內其他請求執行結束,計數值減值小於閾值,第 11 個請求將會被執行,否者將會拋錯。

dubbo.provider 上也可以配置這個值,其將會與 connections 一樣,將會傳遞給消費者。

原理等同上面方法,將會啟用 ActiveLimitFilter,原始碼如下 :

這裡需要注意 actives 引起超時與服務端超時區別。

3.3 dubbo.protocol.accepts

服務提供者最大連線數,如果設定 accepts=10,一旦服務提供者連線數大於 10,其餘新增連線將會被拒絕。

方法原始碼如下:

服務提供者斷開連線,消費端將會列印連線斷開日誌。另外消費者會定時檢查長連線可用性,若不可用,將會重新發起連線。所以在消費者端就會看到連線斷開,重連,然後又被服務提供者斷開的現象。

0x04. 總結

本文通過一次生產連線數過多的現象,詳細剖析定位問題的原因。作為一個合格的開發,對於開源框架,我們不僅要會熟練使用,也要了解其底層實現,相關引數設定。一旦引數設定不合理就可能引發生產事故。

另外對於生產系統,監控系統非常重要。比如上面的問題,如果沒有監控發現,小黑哥可能一時半會都不知道有這個問題存在,畢竟平時也不會太關注連線數這個指標。


好快,已經在家呆了兩週了。哎,出不去,又進不來。以後回想,2020 真是一個令人難忘的一年。。。好了,10 號要正視開工了。

歡迎關注我的公眾號:程式通事,獲得日常乾貨推送。如果您對我的專題內容感興趣,也可以關注我的部落格:studyidea.cn

相關推薦

生產機器連線飆升上萬背後發生什麼?

個人部落格地址 studyidea.cn,點選檢視更多原創文章 0x00. 翻車現場 那是個月黑風高的夜晚,小黑哥成功將新版本釋出到了生產,小心翼翼檢查了應用日誌,後續測試小姐姐驗收成功。 恩,小黑哥我還是一如既往的穩~ 接著小黑哥就跑到樓下食堂吃個夜宵,誰知正吃到一半,線上運維同學發來幾條告警資訊,

知道硬碟很慢但沒想到比 CPU L1 Cache 慢 10000000 倍

前言 大家如果想自己組裝電腦的話,肯定需要購買一個 CPU,但是儲存器方面的裝置,分類比較多,那我們肯定不能只買一種儲存器,比如你除了要買記憶體,還要買硬碟,而針對硬碟我們還可以選擇是固態硬碟還是機械硬碟。 相信大家都知道記憶體和硬碟都屬於計算機的儲存裝置,斷電後記憶體的資料是會丟失的,而硬碟則不會,因為硬

震驚線上四臺機器同一時間全部 OOM到底發生什麼?

案發現場 昨天晚上突然簡訊收到 APM (即 Application Performance Management 的簡稱),我們內部自己搭建了這樣一套系統來對應用的效能、可靠性進行線上的監控和預警的一種機制)大量告警 畫外音: 監控是一種非常重要的發現問題的手段,沒有的話一定要及時建立哦 緊接著運維打來電話

列印日誌竟然只曉得 Log4j?

空了的時候,我都會在群裡偷偷摸摸地潛水,對小夥伴們的一舉一動、一言一行篩查診斷。一副班主任的即時感,讓我感到非常的快樂,略微夾帶一絲絲的枯燥。 這不,我在戰國時代讀者群裡發現了這麼一串聊天記錄: 竟然有小夥伴不知道“打日誌”是什麼意思,不知道該怎麼學習,還有小夥伴回答說,只知道 Log4j! 有那麼一刻,

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,這個對於單機環境來說基本已

玩轉processlist高效追溯MySQL活躍連線飆升根因

作者介紹 劉世勇,曾就職於華為、網易,2015年初加入鏈家網,負責鏈家網資料庫的運維、資料庫架構設計、DB自動化運維平臺的構建等工作。 一、引言 在運維MySQL時,經常遇到的一個問題就是活躍連線數飆升。一旦遇到這樣的問題,都根據後臺儲存的processlist資訊,或者連上MySQL環境,分析My

logminer實戰之生產環境寫入據字典dg環境查詢拷貝日誌測試環境進行挖掘輸出結果

主庫 節點 對象 markup spool 拷貝 fir 準備工作 表格 應客戶需要,對某一天的日誌進行挖掘,分析日均歸檔日誌切換數量20增長至40的原因,是什麽表的dml操作導致的日誌量劇增,最終定位某個應用(需要客戶自己進行甄別) 操作說明及介紹: 1.客戶10.2

XP的IIS連線修改方法突破預設最大連線10

MetaEdit只能管理 II4.0、IIS5.0或更高版本的IIS。 下面教你如何利用這個工具突破Windows XP專業版IIS客戶端連線限制 首先,你需要到下面的地址下載MetaEdit,最新版本是2.2,地址 然後執行MtaEdt22.exe 按嚮導提示完成安裝。最後,在MetaEdit中設定客戶

Https:從tcp建立連線到https接收到第一個資料包到底發生什麼?

https 建立連線過程 Abstract https 是基於http 和 ssl(安全套接字層) 的安全傳輸協議,使用ssl 協議作為會話層協議,這裡通過這篇文章結合抓包來看一下具體過程 About SSL / TLS 這個協議最早是由網景公司 開發,但是隨著網景的沒落,現在由ietf負責維護,

struct和class的區別 觀察者模式 https連線 點選button收到點選事件中間發生什麼

提示:英文原文寫於2009年,當時的Firefox和最新版的Firefox,介面也有很大改動。以下是正文。 花了數小時閱讀了如潮的好評,Bob最終迫不及待為他購買的托斯卡納全脂牛奶點選了“進行結算”,然後…… 哇!剛剛發生了什麼? 在點選按鈕過後的220毫秒時間內,發生了一系

zabbix監控tcp連線的指令碼

#!/bin/bash #this script is used to get tcp and udp connetion status #tcp status metric=$1 tmp_file=/tmp/tcp_status.txt /usr/sbin/ss -ant | awk '{++S[

竟然從來沒有人講過 SpringBoot 支援配置如此平滑的遷移

SpringBoot 是原生支援配置遷移的,但是官方文件沒有看到這方面描述,在原始碼中才看到此模組,spring-boot-properties-migrator,幸虧我沒有跳過。看到這篇文章的各位,可算是撿到寶了,相信你繼續往下看下去,定會忍不住點贊、收藏、關注。 效果 先放個效果吸引你 :) 從 Sp

go語言筆記——append是內置的函new是一個函調試可以使用閉包本質上是print調試尼瑪

... -c map blob 名稱 ebo bsp 處理機制 它的 內置函數 Go 語言擁有一些不需要進行導入操作就可以使用的內置函數。它們有時可以針對不同的類型進行操作,例如:len、cap 和 append,或必須用於系統級的操作,例如:panic。因此,它們需要直接

15倒計時:深度學習高端講座免費聽最後200位贈教材名額

技術講座 深度學習 tensor 深度學習是對使用多層神經網絡過程進行機器學習的統稱。目前已經被應用到圖像識別,語音識別,自然語言處理,機器翻譯等場景並取得了很好的行業應用效果。由谷歌研發的新一代深度學習工具Tensor Flow,於2015年底正式向公眾開源。Tensor Flow技術是當前最值

邁拓維矩繼中國神華集團之後進入據管理開啟新篇章

邁拓維矩 邁拓維矩經過14年的不斷發展,從小作坊生產到現在“全自動”生產管理工序;從月產幾萬臺到日產幾萬臺;從當初的幾個人發展到如今涵蓋十幾個部門的幾百號人。正因為如此公司引進“iWorker”將管理數據化、可視化、高效化。實現邁拓維矩數據管理新的突破。將我們公司的管理水平推向一個新的臺階。

Spring Boot入門第三:配置日誌系統和Druid據庫連接池。

禁用 css ret 輸入 ogg servlet log http gif 一、日誌管理 1.在application.properties文件中加入如下內容: logging.level.root=WARN logging.level.org.springfram

java打印等腰三角形的兩種方法(根據行根據底邊長度)

triangle class [] 執行 next() result scanner 1-1 next 首先來看根據用戶輸入的底邊的長度判斷: 1 package cn.edu.nwpu.java; 2 3 import java.util.Scanner; 4

MNIST機器學習據集

下載 代碼 -i 特征 mac 解釋 使用方法 ges code 介紹 在學習機器學習的時候,首當其沖的就是準備一份通用的數據集,方便與其他的算法進行比較。在這裏,我寫了一個用於加載MNIST數據集的方法,並將其進行封裝,主要用於將MNIST數據集轉換成numpy.arra

python大戰機器學習——據預處理

但是 毫無 缺陷 nbsp 正則 連續 可選 目標 使用   數據預處理的常用流程:     1)去除唯一屬性     2)處理缺失值     3)屬性編碼     4)數據標準化、正則化     5)特征選擇     6)主成分分析 (1)去除唯一屬性   在獲取的數據集

第59:緩動動畫封裝函

scrip box body opacity offset anim width 四舍五入 結果 一、三個取整函數 這三個函數都是 數學函數 Math Math.ceil() 向上取整 天花板 比如說 console.log(