成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

萬惡的Scan,30萬單就這樣沒了...

開發(fā) 前端 開發(fā)工具
昨天晚上下班回家,在地鐵上,老大突然打來電話,B 系統(tǒng)生產(chǎn)環(huán)境響應(yīng)緩慢,影響了 A 系統(tǒng)的使用,幾萬小哥收不了單,大概有 30 萬單卡住了,你去幫忙定位一下。

 [[385025]]

圖片來自 Pexels

我 8 點(diǎn)半左右到家,立馬上線入會(huì)......

重啟

我入會(huì)的時(shí)候,已經(jīng)有同事在幫忙定位了,俗話說的好,重啟能解決 80% 的問題,如果重啟解決不了,那肯定是重啟的次數(shù)還不夠,呸,不對,重啟解決不了,就真的要去定位了。

事實(shí)證明,重啟后走一波壓測依然沒什么用,1000 個(gè)并發(fā),平均響應(yīng)時(shí)間在 3~4 秒,連續(xù)壓了幾次都是這樣的結(jié)果。

升級配置

重啟看來是無效了,進(jìn)入第二個(gè)階段——升級配置,2 臺(tái) 4 核 8G 的實(shí)例升級到 6 臺(tái) 8 核 16G,數(shù)據(jù)庫的配置也翻了一倍,能用錢解決的問題,我們一般不會(huì)投入太多的人力!

事實(shí)證明,加配置也沒什么卵用,1000 個(gè)并發(fā),壓測的平均響應(yīng)時(shí)間還是在 3~4 秒。

有點(diǎn)意思,此時(shí),我介入了。

查看監(jiān)控

我上線之后,查看了一下監(jiān)控,實(shí)例的 CPU、內(nèi)存、磁盤、網(wǎng)絡(luò) IO、JVM 堆內(nèi)存使用情況好像都沒啥問題,這真是個(gè)頭疼的問題。

本地壓測

我們分成兩波同學(xué),一波去準(zhǔn)備本地壓測,一波繼續(xù)分析,經(jīng)過本地壓測,我們發(fā)現(xiàn),本地環(huán)境,單機(jī),1000 個(gè)并發(fā),妥妥的,毛問題都沒有,平均響應(yīng)基本維持在幾百毫秒。

看來,確實(shí)跟服務(wù)本身沒有問題。

代碼走查

實(shí)在沒有辦法了,拿出代碼,一群大老爺們一起看代碼,研發(fā)同學(xué)給我們講解業(yè)務(wù)邏輯,當(dāng)然,他已經(jīng)被各位大佬給罵死了,寫的什么破代碼。

其實(shí),在我介入之前,他們已經(jīng)改過一波代碼了,有個(gè)地方把 redis 命令 scan 改成了 keys *,這里埋了個(gè)坑,但是,現(xiàn)在不是主要問題,后面我們會(huì)說。

代碼一路走讀下來,發(fā)現(xiàn)有很多的 redis 操作,還有個(gè) for 循環(huán)里面在調(diào) redis 的 get 命令,其他的都是常規(guī)的數(shù)據(jù)庫操作,而且都加了索引的。

所以,初步排查,數(shù)據(jù)庫這里應(yīng)該是沒有什么問題,主要問題可能還是集中在 redis 這塊,調(diào)用太頻繁了。

加日志

代碼走查下來,除了那個(gè) scan 改成了 keys *(這個(gè)我還不知道),基本上沒有什么問題,加日志吧, 一小段一小段的加上日志,OK,重啟服務(wù),壓測來一波。

當(dāng)然了,結(jié)果沒有什么變化,分析日志。

通過日志,我們發(fā)現(xiàn),調(diào)用 redis 的時(shí)候時(shí)而很快,時(shí)而很慢,看起來像是連接池不夠的樣子,也就是一批請求先行,一批請求在等待空閑的 redis 連接。

修改 redis 連接數(shù)

查看 redis 配置,用的是單機(jī)模式,1G 內(nèi)存, 連接數(shù)默認(rèn)的 8,客戶端還是比較老的 jedis,果斷改成 springboot 默認(rèn)的 lettuce,連接數(shù)先調(diào)整為 50,重啟服務(wù),壓一波。

平均響應(yīng)時(shí)間從 3~4 秒降到了 2~3 秒,并不明顯,繼續(xù)加大連接數(shù),因?yàn)槲覀兪?1000 個(gè)并發(fā),每個(gè)請求都有很多次 redis 操作,所以,肯定會(huì)有等待,這次我們把連接數(shù)直接干到了 1000,重啟服務(wù),壓一波。

事實(shí)證明,并沒有明顯地提升。

再次查看日志

此時(shí),已經(jīng)沒有什么好的解決辦法了,我們再次回到日志中,查看 redis 相關(guān)操作的時(shí)間,發(fā)現(xiàn) 99% 的 get 操作都是很快返回的,基本上是在 0~5 毫秒之間,但是,總有那么幾個(gè)達(dá)到了 800~900 毫秒才返回。

我們以為 redis 這塊沒什么問題了。但是,壓測了好幾次,時(shí)間一直提不上去。

很無奈了,此時(shí),已經(jīng)半夜 3 點(diǎn)多了,領(lǐng)導(dǎo)發(fā)話,把 XX 云的人喊起來。

云排查

最后,我們把 XX 云相關(guān)的人員喊起來一起排查問題,當(dāng)然,他們是不情愿的,但是,誰讓我們給錢了呢!

XX 云的負(fù)責(zé)人,把 redis 的專家搞起來,幫我們看了下 redis 的指標(biāo),最后,發(fā)現(xiàn)是 redis 的帶寬滿了,然后觸發(fā)了限流機(jī)制。

他們臨時(shí)把 redis 的帶寬增大三倍,讓我們再壓測一波。握了顆草,平均響應(yīng)時(shí)間一下子降到了 200~300 毫秒!!!!

真的是握了顆草了,這就有點(diǎn)坑了,你限流就算了,帶寬滿了也不報(bào)警一下的么......

這真是個(gè)蛋疼的問題。到這里,我們以為問題就這樣解決了,領(lǐng)導(dǎo)們也去睡覺了!

上生產(chǎn)

既然問題原因找到了,那就上生產(chǎn)壓一波吧!我們讓 XX 云的專家把生產(chǎn)的帶寬也增大了三倍大小。

從生產(chǎn)提交拉一個(gè) hotfix 分支,關(guān)閉簽名,重啟服務(wù),壓測走一波。完蛋,生產(chǎn)環(huán)境更差,平均響應(yīng)時(shí)間在 5~6 秒。

測試環(huán)境我們是改了連接池配置的,生產(chǎn)環(huán)境還是 jedis,改之,走一波。并沒有什么實(shí)際作用,還是 5~6 秒。

真是個(gè)蛋疼的問題。

查看監(jiān)控

查看 XX 云中 redis 的監(jiān)控,這次帶寬、流控都是正常的。

這次不正常的變成了 CPU,redis 的 CPU 壓測的時(shí)候直接飆到了 100%,導(dǎo)到應(yīng)用響應(yīng)緩慢。

再次喚醒 XX 云 redis 專家

已經(jīng)凌晨四點(diǎn)多了,大家已經(jīng)沒什么思路了,XX 云的 redis 專家,你給我再起來!

再次喚醒 XX 云的 redis 專家,幫我們分析了下后臺(tái),發(fā)現(xiàn) 10 分鐘內(nèi)進(jìn)行了 14 萬次 scan......

萬惡的 scan

詢問研發(fā)人員哪里用到了 scan(前面他們改的,我不知道),發(fā)現(xiàn),每次請求都會(huì)調(diào)用 scan 去拿某個(gè)前綴開頭的 key,每次掃描 1000 條數(shù)據(jù),查看 redis 鍵總數(shù),大概有 11 萬條。

也就是說,一個(gè)請求就要 scan 100 次,1000 并發(fā),大概就是 10 幾萬次 scan。

我們知道,redis 中 scan 和 keys * 是要進(jìn)行全表掃描的,非常消耗 CPU,14 萬次 scan 操作,直接讓 CPU 上天了。

為什么測試環(huán)境 CPU 沒有上天呢?

對比了下,測試環(huán)境和生產(chǎn)環(huán)境 redis 的鍵總數(shù),測試環(huán)境只有 900 個(gè) key,每次請求也就 scan 一次或者 keys * 一次,毛線問題都沒有。

為什么生產(chǎn)環(huán)境有這么多 key?

詢問研發(fā)人員,為什么生產(chǎn)環(huán)境有這么多 key,沒有設(shè)置過期時(shí)間嗎?

研發(fā)人員說設(shè)置了的,是另一個(gè)同事寫的代碼,打開代碼,真是一段魔性的代碼,具體代碼我就不方便貼出來了,里面有根據(jù)條件判斷要不要設(shè)置過期時(shí)間,經(jīng)過分析,大部分情況下,都沒有設(shè)置過期時(shí)間成功。

當(dāng)前解決辦法

此時(shí),已經(jīng)凌晨 4 點(diǎn)半了,雖然大家還很興奮,但是,經(jīng)過領(lǐng)導(dǎo)決策,暫時(shí)先不動(dòng)了。

因?yàn)椋壳?A 系統(tǒng)已經(jīng)暫停調(diào)用 B 系統(tǒng)了,所以,此時(shí) B 系統(tǒng)可以說流量幾乎為 0 了。

我們白天再分兩個(gè)階段來修復(fù)這個(gè)問題:

  • 第一步,先清理掉生產(chǎn)環(huán)境 redis 的數(shù)據(jù),只保留一小部分必要的數(shù)據(jù)。
  • 第二步,修改 scan 某前綴開頭的數(shù)據(jù),改成 hash 存儲(chǔ),這樣可以減少掃描的范圍。

好了,本次生產(chǎn)事故排查就到這里了。

總結(jié)

本次生產(chǎn)事件跟以往遇到的事件都略有不同,大概總結(jié)一下:

  • 以往都是應(yīng)用服務(wù)本身的 CPU、內(nèi)存、磁盤、JVM 這些問題,redis 的帶寬和限流還是第一次遇見。
  • 上了 XX 云以后,很多東西還沒有弄得熟練,包括監(jiān)控指標(biāo)這些,還需要慢慢摸索。
  • redis 一定要禁用掉 keys 和 scan 命令,且大部分 key 應(yīng)該設(shè)置過期時(shí)間!

好了,本次事件大概就寫這么多,后續(xù)有新的情況我也會(huì)繼續(xù)跟進(jìn)的,當(dāng)然,最好不要有新的情況!

作者:彤哥

編輯:陶家龍

出處:轉(zhuǎn)載自公眾號彤哥讀源碼

 

責(zé)任編輯:武曉燕 來源: 彤哥讀源碼
相關(guān)推薦

2020-09-25 07:57:42

生產(chǎn)事故系統(tǒng)

2013-04-12 09:58:16

2022-09-07 09:45:19

TypeScrip開發(fā)者

2014-04-25 09:43:54

2022-06-09 11:51:05

YODA工具惡意插件

2011-01-05 16:19:34

2016-11-21 21:28:51

根目錄日志代碼

2012-02-02 14:35:08

程序員

2013-12-31 09:19:23

Python調(diào)試

2015-03-30 09:26:24

JavaScriptHTML6

2020-09-14 16:27:51

機(jī)器人AI人工智能

2020-12-29 10:56:38

惡意軟件SoReL-20M網(wǎng)絡(luò)安全

2014-09-16 10:05:39

職場年薪

2025-04-09 00:00:55

2013-07-05 09:59:23

2009-12-03 15:06:51

Suse修改主機(jī)名

2015-05-13 10:42:21

程序員代碼

2010-12-07 11:24:45

跳槽

2015-04-16 09:48:12

APP測試

2019-05-14 10:11:27

程序員技能開發(fā)者
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久国产精品99久久久久 | 在线观看国产三级 | 成人一级片在线观看 | 免费一区| 亚洲色图在线观看 | 国产专区在线 | 免费国产视频 | 亚洲高清在线 | 亚洲成人av| 九九热国产精品视频 | 久久久久国产精品 | 婷婷国产一区 | 国产农村妇女毛片精品久久麻豆 | 精品视频在线一区 | 国产视频精品视频 | 一区二区三区视频在线免费观看 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 欧美日韩a| 亚洲日日操 | а天堂中文最新一区二区三区 | 五月激情久久 | 高清人人天天夜夜曰狠狠狠狠 | 免费一区在线观看 | 日日操视频| 亚洲激情一区二区三区 | 欧美一级久久 | 日韩欧美在线免费观看 | 国产蜜臀97一区二区三区 | a爱视频 | 欧美精品一区在线发布 | 九九热免费观看 | 国产在线一区二 | 久草免费在线视频 | 色在线免费 | 青娱乐自拍 | 国产精品123区 | 黄色av网站免费看 | 古典武侠第一页久久777 | 99热播精品 | 91亚洲一区 | 亚洲视频免费在线观看 |