PTT推薦

[請益] 資料庫connection太多導致回應變慢

看板Soft_Job標題[請益] 資料庫connection太多導致回應變慢作者
stevekevin10
(steve)
時間推噓16 推:19 噓:3 →:40

工作上遇到了一個找不太到原因的狀況

語言: Java mybait


新增了一個功能後

endpoint A:
下面有一個method大概會打DB query 200次

這時
endpoint B 的repsonse也跟著大幅增加 (endpoint B會打DB約1000次)

這有什麼可能的原因造成的呢?

* endpoint B 沒有去call 新的method 沒有增加query次數

* 有懷疑是connection pool 爆掉
但不知道該如何debug
且當我部署完 沒去call A的時候
單純call B速度也一樣變慢(沒有call A應該沒有建立connection….吧?)



更新*
的確是n+1問題沒錯
但我困惑的不是該如何解決...
而是為什麼n+1的地方在method A但B會影響

我會覺得是connection pool的問題是因為
執行B的時候並沒有跑到A那段的code
他這裡面不會有一些slow query的情況
目前唯一能想到的就只有

1.
可能打A的時候connection pool 被佔滿了
打B要重建導致速度變慢

Q1.1 不確定mybaits打不同表的connection是不是要重建?還是一樣重pool裡面撈就好

Q1.2 剛部署到新機器上後,沒call過A單純call B也變慢


2. DB被太多query連線導致速度變慢

Q2.1理論上DB應該沒有那麼弱...而且他是在測試環境 只有我當下的單條request

Q2.2 同1.1


怪哉 T.T

請各位大大提供點看法

--

※ PTT留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 219.85.180.114 (臺灣)
PTT 網址

drajan07/22 04:23看 DB concurrency query的數量 DB很常成為瓶頸

keel9013507/22 04:32你這個一定要try跟看才知道,沒有資深的同事可以問嗎?

sniper282407/22 06:23業務邏輯一定要查這麼多次?

bill020507/22 06:36八成DB Query太過於頻繁 不然200次太誇張

day83123107/22 07:191 個 Endpoint call那麼多次,我猜可能是 N+1 queries

choYM07/22 07:22Pool設定沒寫出來 db開多少個connection給妳也沒說 大家也

choYM07/22 07:22只能隔空抓藥啊… 另外這兩個entrypoint 要打那麼多次sql也

choYM07/22 07:22蠻怪的…

s06yji307/22 07:36是一個request會query DB 200次嗎?用endpoint 打DB幾次

s06yji307/22 07:36很不精確...

jack020407/22 07:39我猜這是n+1的問題,不然怎麼可能打這麼多次

ricestand07/22 08:40大概就n+1了

godddddd07/22 08:42200個指令長怎樣 看能不能減少

bill020507/22 08:48我也覺得是N+1 如果是mysql 就看slow log

ntpuisbest07/22 09:23https://i.imgur.com/U8cJUgu.jpg

圖 資料庫connection太多導致回應變慢

ntpuisbest07/22 09:24看一下有沒有在loop裡面查sql

iamshiao07/22 10:22可以想想有沒辦法把 200次濃縮成一次

iamshiao07/22 10:24新功能有改 DB 結構嗎? 用預存程序跑嗎? 可以清掉執

iamshiao07/22 10:24行計畫再跑看看

yfr07/22 10:34原來是debug,我還以為是通靈,以下開放第一屆天下通靈大會

WaterLengend07/22 11:07打這麼多次要不要先濃縮看看

ChungLi556607/22 11:19請DBA幫忙看 有工具可以監控SQL指令效率

MoonCode07/22 12:45看內文不懂你如何推論並猜測conn過多

worf07/22 12:54=.=

Uzak07/22 13:07N+1

MonyemLi07/22 13:40雖然不好但也還好,n+1的對象基本上是pk查詢。這該不是

MonyemLi07/22 13:40主要原因

s06yji307/22 13:53資訊太少,補噓一下。上班已經在通靈了。

guanting88607/22 13:58DB沒這麼弱啦.. 若單純是 select 有正常打上索引、

guanting88607/22 13:58有用到主鍵,query 時間都<1ms

guanting88607/22 14:02建議先用EXPLAIN語法去檢查一下

gmoz07/22 15:09懷疑connection數量 不會直接下指令看連線數嗎

mathrew07/22 19:24T-SQL寫太爛吧

mathrew07/22 19:25先確認執行計畫的狀況

KY199807/22 23:01不知道業務規模,如果這個表資料只有1萬筆內,直接查全部

KY199807/22 23:02再用key去查詢

※ 編輯: stevekevin10 (223.140.170.71 臺灣), 07/22/2022 23:39:34

dark1010807/23 00:33會不會query一直建新的connection

dark1010807/23 00:34或connection pool的idle time設定太短

alan310007/23 02:04從DB查不就好了 幹嘛在那蝦矇猜問題

fifi8272607/23 13:04DB就是這麼脆弱 請優化200個query的部分

ChungLi556607/23 14:44有DB的監控工具可以用 不用這樣瞎猜

ChungLi556607/23 14:44可以看到每個階段耗費幾毫秒

lchcoding07/23 21:33讀了你的更新,我只對Q1.2感興趣

lchcoding07/23 21:33在B裡面加些log,準備做時間分析

lchcoding07/23 21:33然後跑(未加新功能)前,所謂正常狀況,跟(加新功能

lchcoding07/23 21:33)後,你所謂的變慢,請先回答慢在哪裏,解bug的方向才

lchcoding07/23 21:33會出來.用射擊法解Bug,情緒常常會像心電圖那樣.還有一

lchcoding07/23 21:33種方法是用圍捕的

感謝 太疑惑忘記基本的方法找問題了T_T

pttano07/24 19:09不是db太慢是你的code太爛,不是多條魚是多餘你

pttuser226607/24 23:08有沒有加欄位,or 改 table schema, 1 個 sql query

pttuser226607/24 23:08 慢 1ms, 1000次就慢一秒了

acgotaku07/25 09:45你有做讀寫分離嗎

acgotaku07/25 09:47而且你這情況 八成是每次任務都創建一個連線

hegemon07/25 11:15會搞到N+1通常的code寫得爛..

樓上有幾位別火氣那麼大~ 我的問題一直不是在該怎麼解決速度 或是為什麼這樣打速度會變慢 主要問題是疑惑為啥改A會影響到B速度

※ 編輯: stevekevin10 (219.85.180.114 臺灣), 07/25/2022 12:28:02

acgotaku07/25 14:43你db用同一台呀 你去打B的時候 監測db server的cpu,mem

drajan07/25 16:56因為你A跟B有共用的 component 也就是DB 你沒有其他工作上

drajan07/25 16:56的資深工程師可以問嗎?任何一個有點程度的應該都可以看得

drajan07/25 16:56出來問題在哪裡

internetms5208/18 06:57connection pool 不夠大是有log可以看的,如果是a

internetms5208/18 06:57的進行過程中b變慢,那應該存在一個很長且耗資源的

internetms5208/18 06:57查詢在前一個未結束前,不斷累積

internetms5208/18 07:14table lock 也有可能是讓短查詢變長的原因