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

看板Soft_Job作者 (steve)時間1年前 (2022/07/22 03:21), 1年前編輯推噓14(17338)
留言58則, 31人參與, 1年前最新討論串1/1
工作上遇到了一個找不太到原因的狀況 語言: 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.cc), 來自: 219.85.180.114 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1658431317.A.D01.html

07/22 04:23, 1年前 , 1F
看 DB concurrency query的數量 DB很常成為瓶頸
07/22 04:23, 1F

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

07/22 06:23, 1年前 , 3F
業務邏輯一定要查這麼多次?
07/22 06:23, 3F

07/22 06:36, 1年前 , 4F
八成DB Query太過於頻繁 不然200次太誇張
07/22 06:36, 4F

07/22 07:19, 1年前 , 5F
1 個 Endpoint call那麼多次,我猜可能是 N+1 queries
07/22 07:19, 5F

07/22 07:22, 1年前 , 6F
Pool設定沒寫出來 db開多少個connection給妳也沒說 大家也
07/22 07:22, 6F

07/22 07:22, 1年前 , 7F
只能隔空抓藥啊… 另外這兩個entrypoint 要打那麼多次sql也
07/22 07:22, 7F

07/22 07:22, 1年前 , 8F
蠻怪的…
07/22 07:22, 8F

07/22 07:36, 1年前 , 9F
是一個request會query DB 200次嗎?用endpoint 打DB幾次
07/22 07:36, 9F

07/22 07:36, 1年前 , 10F
很不精確...
07/22 07:36, 10F

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

07/22 08:40, 1年前 , 12F
大概就n+1了
07/22 08:40, 12F

07/22 08:42, 1年前 , 13F
200個指令長怎樣 看能不能減少
07/22 08:42, 13F

07/22 08:48, 1年前 , 14F
我也覺得是N+1 如果是mysql 就看slow log
07/22 08:48, 14F

07/22 09:23, 1年前 , 15F

07/22 09:24, 1年前 , 16F
看一下有沒有在loop裡面查sql
07/22 09:24, 16F

07/22 10:22, 1年前 , 17F
可以想想有沒辦法把 200次濃縮成一次
07/22 10:22, 17F

07/22 10:24, 1年前 , 18F
新功能有改 DB 結構嗎? 用預存程序跑嗎? 可以清掉執
07/22 10:24, 18F

07/22 10:24, 1年前 , 19F
行計畫再跑看看
07/22 10:24, 19F

07/22 10:34, 1年前 , 20F
原來是debug,我還以為是通靈,以下開放第一屆天下通靈大會
07/22 10:34, 20F

07/22 11:07, 1年前 , 21F
打這麼多次要不要先濃縮看看
07/22 11:07, 21F

07/22 11:19, 1年前 , 22F
請DBA幫忙看 有工具可以監控SQL指令效率
07/22 11:19, 22F

07/22 12:45, 1年前 , 23F
看內文不懂你如何推論並猜測conn過多
07/22 12:45, 23F

07/22 12:54, 1年前 , 24F
=.=
07/22 12:54, 24F

07/22 13:07, 1年前 , 25F
N+1
07/22 13:07, 25F

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

07/22 13:40, 1年前 , 27F
主要原因
07/22 13:40, 27F

07/22 13:53, 1年前 , 28F
資訊太少,補噓一下。上班已經在通靈了。
07/22 13:53, 28F

07/22 13:58, 1年前 , 29F
DB沒這麼弱啦.. 若單純是 select 有正常打上索引、
07/22 13:58, 29F

07/22 13:58, 1年前 , 30F
有用到主鍵,query 時間都<1ms
07/22 13:58, 30F

07/22 14:02, 1年前 , 31F
建議先用EXPLAIN語法去檢查一下
07/22 14:02, 31F

07/22 15:09, 1年前 , 32F
懷疑connection數量 不會直接下指令看連線數嗎
07/22 15:09, 32F

07/22 19:24, 1年前 , 33F
T-SQL寫太爛吧
07/22 19:24, 33F

07/22 19:25, 1年前 , 34F
先確認執行計畫的狀況
07/22 19:25, 34F

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

07/22 23:02, 1年前 , 36F
再用key去查詢
07/22 23:02, 36F
※ 編輯: stevekevin10 (223.140.170.71 臺灣), 07/22/2022 23:39:34

07/23 00:33, 1年前 , 37F
會不會query一直建新的connection
07/23 00:33, 37F

07/23 00:34, 1年前 , 38F
或connection pool的idle time設定太短
07/23 00:34, 38F

07/23 02:04, 1年前 , 39F
從DB查不就好了 幹嘛在那蝦矇猜問題
07/23 02:04, 39F

07/23 13:04, 1年前 , 40F
DB就是這麼脆弱 請優化200個query的部分
07/23 13:04, 40F

07/23 14:44, 1年前 , 41F
有DB的監控工具可以用 不用這樣瞎猜
07/23 14:44, 41F

07/23 14:44, 1年前 , 42F
可以看到每個階段耗費幾毫秒
07/23 14:44, 42F

07/23 21:33, 1年前 , 43F
讀了你的更新,我只對Q1.2感興趣
07/23 21:33, 43F

07/23 21:33, 1年前 , 44F
在B裡面加些log,準備做時間分析
07/23 21:33, 44F

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

07/23 21:33, 1年前 , 46F
)後,你所謂的變慢,請先回答慢在哪裏,解bug的方向才
07/23 21:33, 46F

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

07/23 21:33, 1年前 , 48F
種方法是用圍捕的
07/23 21:33, 48F
感謝 太疑惑忘記基本的方法找問題了T_T

07/24 19:09, 1年前 , 49F
不是db太慢是你的code太爛,不是多條魚是多餘你
07/24 19:09, 49F

07/24 23:08, 1年前 , 50F
有沒有加欄位,or 改 table schema, 1 個 sql query
07/24 23:08, 50F

07/24 23:08, 1年前 , 51F
慢 1ms, 1000次就慢一秒了
07/24 23:08, 51F

07/25 09:45, 1年前 , 52F
你有做讀寫分離嗎
07/25 09:45, 52F

07/25 09:47, 1年前 , 53F
而且你這情況 八成是每次任務都創建一個連線
07/25 09:47, 53F

07/25 11:15, 1年前 , 54F
會搞到N+1通常的code寫得爛..
07/25 11:15, 54F
樓上有幾位別火氣那麼大~ 我的問題一直不是在該怎麼解決速度 或是為什麼這樣打速度會變慢 主要問題是疑惑為啥改A會影響到B速度 ※ 編輯: stevekevin10 (219.85.180.114 臺灣), 07/25/2022 12:28:02

07/25 14:43, 1年前 , 55F
你db用同一台呀 你去打B的時候 監測db server的cpu,mem
07/25 14:43, 55F

07/25 16:56, 1年前 , 56F
因為你A跟B有共用的 component 也就是DB 你沒有其他工作上
07/25 16:56, 56F

07/25 16:56, 1年前 , 57F
的資深工程師可以問嗎?任何一個有點程度的應該都可以看得
07/25 16:56, 57F

07/25 16:56, 1年前 , 58F
出來問題在哪裡
07/25 16:56, 58F
文章代碼(AID): #1YsQTLq1 (Soft_Job)