網(wǎng)絡(luò)操作的性能優(yōu)化

先貼上優(yōu)化前后的對(duì)比圖(優(yōu)化于1月15日上線,19日上了一些細(xì)節(jié)的優(yōu)化):

  • web服務(wù)器的cpu使用


    web服務(wù)器 cpu使用
    web服務(wù)器 cpu使用
  • web服務(wù)器的load


    web服務(wù)器 load
    web服務(wù)器 load
  • rpc的連接數(shù)(主要是與redis的連接)


    rpc的連接數(shù)
    rpc的連接數(shù)
  • redis服務(wù)的cpu使用


    redis服務(wù)的cpu使用
    redis服務(wù)的cpu使用
  • redis所在機(jī)器的連接數(shù)


    redis所在機(jī)器的連接數(shù)
    redis所在機(jī)器的連接數(shù)

現(xiàn)象

  • 某產(chǎn)品由于某些因素(運(yùn)營,版本更新及體驗(yàn)等)使得活躍用戶及停留時(shí)間不斷提高野揪,進(jìn)而使得服務(wù)器資源使用增長乾蓬,原先設(shè)定的報(bào)警閾值頻繁被觸發(fā)拴魄,具體表現(xiàn)為:
    • web機(jī)器的load與cpu使用都變高
    • 依賴的緩存服務(wù)redis連接數(shù)與cpu不斷攀升
    • rpc(用于業(yè)務(wù)分離)的連接數(shù)不斷攀升

如何解決

  • 負(fù)載均衡谤狡,增加服務(wù)器——最簡單粗暴且有效的方式
  • 找到系統(tǒng)性能瓶頸虫溜,優(yōu)化之——這是最經(jīng)濟(jì)也最有挑戰(zhàn)的事
  • ——考慮到線上服務(wù)尚未出現(xiàn)功能性問題游桩,先嘗試第二種方式

定位

  • 參考我之前的blog牲迫,對(duì)線上各服務(wù)(均為java進(jìn)程)取jstack并用stackAnalysis工具分析其瓶頸,發(fā)現(xiàn)許多線程都停留在對(duì)redis的操作上
  • 很顯然借卧,redis的大量請(qǐng)求是瓶頸

分析

  • 仔細(xì)分析stack dump中有相似stackstrace的線程盹憎,發(fā)現(xiàn)對(duì)緩存的操作有不少shit的邏輯:
    • "同樣的數(shù)據(jù)取兩次"——如:interceptor中會(huì)對(duì)同一個(gè)user對(duì)象獲取兩次

      e.g.:
      User user = userRpcServer.getUser(uid);
      // 一些業(yè)務(wù)邏輯
      boolean isForbidderUser = userRpcServer.isForbidderUser(uid);
      
      • 從上面看并沒有直接問題,但仔細(xì)分析會(huì)發(fā)現(xiàn)userRpcServer.isForbidderUser(uid)中還會(huì)調(diào)用一次getUser(id)
    • "取到了數(shù)據(jù)卻不用"——如:獲取User對(duì)象時(shí)同時(shí)獲取其帳啟余額铐刘,但只有與帳戶相關(guān)的請(qǐng)求才需要獲取余額陪每,大多數(shù)接口不需要

      UserAccount userAccount = userRpcServer.getUserAccount(uid);
      UserInfo userInfo = userRpcServer.getUserInfo(uid);
      User user =  makeUser(userAccount, userInfo);
      
    • "已經(jīng)知道緩存中不存在數(shù)據(jù)了,卻還去取"——因?yàn)檎{(diào)用棧較長镰吵,所以隱藏的比較深檩禾,限于篇幅,暫不舉例疤祭。但也正因?yàn)殡[藏的較深盼产,才造成了資源的浪費(fèi)不太輕易被發(fā)現(xiàn)。

    • "有大量用for循環(huán)對(duì)redis做網(wǎng)絡(luò)操作的邏輯"——如:根據(jù)userIds獲取users

      for(uid : uids) {
          users.add(redisServer.getUser(uid))
      }
      
      • 這樣的邏輯應(yīng)該盡量用批量操作的方式去完成
  • 分析redis slow log, 找出其中耗時(shí)和頻繁的操作(尤其是刪除操作)勺馆,發(fā)現(xiàn)有一些優(yōu)化的空間——此前已做過一次slow log對(duì)應(yīng)key的優(yōu)化戏售,所以這次在這方面沒做太多事情侨核。

解決

  • 對(duì)應(yīng)上面分析到的問題,分別的解決方案為:
    • 同樣的數(shù)據(jù)取兩次 —— 相同的數(shù)據(jù)只取一次
    • 取到了數(shù)據(jù)卻不用 —— 不用則不取
    • 已經(jīng)知道緩存中不存在數(shù)據(jù)了灌灾,卻還去取一次 —— 有的放矢
    • 有大量用for循環(huán)對(duì)redis做網(wǎng)絡(luò)操作的邏輯 —— 盡量用批量請(qǐng)求
      • redis是一個(gè)集群搓译,因此需要用ShardedJedisPipeline來做批量請(qǐng)求
  • 優(yōu)化之后報(bào)警短信完全消失。

優(yōu)化結(jié)果評(píng)估

  • 找到優(yōu)化方法并進(jìn)行優(yōu)化之后锋喜,分別對(duì)各個(gè)優(yōu)化做性能測試
  • 需要對(duì)每一步優(yōu)化都做性能測試些己,知悉各改動(dòng)優(yōu)化的力度。

思考

  • 人總是:1. 犯錯(cuò)嘿般;2. 選擇最合適的辦法解決當(dāng)前需求——不論是coding還是產(chǎn)品架構(gòu)或者公司運(yùn)轉(zhuǎn)段标。
  • 錯(cuò)誤總比較明顯容易解決,但隨著產(chǎn)品發(fā)展時(shí)間推移博个,一些曾合理的地方會(huì)變得不太合理怀樟,甚至?xí)鸬搅俗璧K作用。
  • 我們需要不斷從現(xiàn)狀中找到不合理的地方盆佣,并改進(jìn)它往堡,而不是盲從、習(xí)慣或停留于批判共耍。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虑灰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子痹兜,更是在濱河造成了極大的恐慌穆咐,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件字旭,死亡現(xiàn)場離奇詭異对湃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)遗淳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門拍柒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屈暗,你說我怎么就攤上這事拆讯。” “怎么了养叛?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵种呐,是天一觀的道長。 經(jīng)常有香客問我弃甥,道長爽室,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任淆攻,我火速辦了婚禮肮之,結(jié)果婚禮上掉缺,老公的妹妹穿的比我還像新娘。我一直安慰自己戈擒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布艰毒。 她就那樣靜靜地躺著筐高,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丑瞧。 梳的紋絲不亂的頭發(fā)上柑土,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音绊汹,去河邊找鬼稽屏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛西乖,可吹牛的內(nèi)容都是我干的狐榔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼获雕,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼薄腻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起届案,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤庵楷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后楣颠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尽纽,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年童漩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弄贿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡睁冬,死狀恐怖挎春,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情豆拨,我是刑警寧澤直奋,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站施禾,受9級(jí)特大地震影響脚线,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弥搞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一邮绿、第九天 我趴在偏房一處隱蔽的房頂上張望渠旁。 院中可真熱鬧,春花似錦船逮、人聲如沸顾腊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杂靶。三九已至,卻和暖如春酱鸭,著一層夾襖步出監(jiān)牢的瞬間吗垮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工凹髓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烁登,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓蔚舀,卻偏偏與公主長得像饵沧,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蝗敢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容