<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          每秒1w+分布式事務(wù)--dtm的Redis存儲(chǔ)性能測(cè)試分析

          共 3143字,需瀏覽 7分鐘

           ·

          2022-01-10 23:42

          作者:葉東富

          來(lái)源:SegmentFault  思否社區(qū)


          概述



          之前dtm給出了Mysql作為存儲(chǔ)引擎的性能測(cè)試報(bào)告,在一個(gè)普通配置的機(jī)器上,2.68w IOPS,4核8G機(jī)器上,能夠支持大約每秒900+分布式事務(wù),能夠滿足大部分公司的業(yè)務(wù)需求。


          此次帶來(lái)的是Redis存儲(chǔ)引擎的測(cè)試報(bào)告,在一個(gè)普通配置的機(jī)器上,能夠達(dá)到大約10800每秒的分布式事務(wù)能力,對(duì)比Mysql存儲(chǔ),有10倍左右的性能提升,滿足絕大部分公司的業(yè)務(wù)需求。


          下面我們來(lái)詳細(xì)說(shuō)明測(cè)試的步驟,并分析其中影影響性能的各個(gè)因素。


          測(cè)試環(huán)境



          下面的服務(wù)器都來(lái)自阿里云,地區(qū)為東京(外網(wǎng)訪問(wèn)比較方便)


          Redis服務(wù)器:ecs.hfc6 4核8G CPU主頻為3.1 GHz/3.5 GHz 內(nèi)網(wǎng)收發(fā)包50萬(wàn)PPS ubuntu 20.04


          兩臺(tái)應(yīng)用服務(wù)器:ecs.hfc6 8核16G CPU主頻為3.1 GHz/3.5 GHz 內(nèi)網(wǎng)收發(fā)包80萬(wàn)PPS ubuntu 20.04 redis5.x


          測(cè)試步驟:



          準(zhǔn)備好Redis


          注意:涉及應(yīng)用服務(wù)器的,那么兩臺(tái)服務(wù)器都需要進(jìn)行相關(guān)操作


          在應(yīng)用服務(wù)器上面準(zhǔn)備好Redis,這次因?yàn)榭紤]到極限性能,因此不采用docker安裝,而是采用apt install 安裝,運(yùn)行如下命令


          apt update
          apt install -y redis
          # 修改/etc/redis/redis.conf,找到其中的bind,改為bind 0.0.0.0
          systemctl restart redis-server


          配置應(yīng)用服務(wù)器


          apt update
          apt install -y git
          git clone https://github.com/dtm-labs/dtm.git && cd dtm && git checkout 5907f99 && cd bench && make


          配置dtm

          修改 dtm目錄下的conf.sample.yml,配置使用Redis,例如:


          Store:
            Driver: 'redis'
              Host: 'redis ip'
              Port: 6379
              
          # 另外再把ExamplesDB里面的配置刪除,因?yàn)槲覀儧](méi)有安裝mysql


          啟動(dòng)bench服務(wù)器


          `
          LOG_LEVEL=warn go run bench/main.go redis
          `


          啟動(dòng)測(cè)試


          `
          ab -n 1000000 -c 10 "http://127.0.0.1:8083/api/busi_bench/benchEmptyUrl"
          `


          獲得結(jié)果


          我這看到ab的結(jié)果顯示,每秒完成的操作數(shù)量?jī)膳_(tái)應(yīng)用服務(wù)器加總為10875


          Redis性能分析



          我們首先來(lái)看Redis本身的性能,影響它的因素是哪些,先看下面的這些測(cè)試數(shù)據(jù):


          `
          redis-benchmark -n 300000 SET 'abcdefg' 'ddddddd'
          `


          每秒完成的請(qǐng)求數(shù)10w


          `
          redis-benchmark -h 內(nèi)網(wǎng)其他主機(jī)IP -p 6379 -n 300000 SET 'abcdefg' 'ddddddd'
          `


          每秒完成的請(qǐng)求數(shù)10w


          從這上面的兩個(gè)結(jié)果看,本地Redis測(cè)試和遠(yuǎn)程Redis測(cè)試,性能差異并不明顯。我也測(cè)試過(guò)其他更多的命令,也未發(fā)現(xiàn)明顯差異,因此下面主要就測(cè)試本地Redis性能,不再比較本地和遠(yuǎn)程的差別。


          `
          redis-benchmark -n 300000 EVAL "redis.call('SET', 'abcdedf', 'ddddddd')" 0
          `


          Lua腳本每秒完成的請(qǐng)求數(shù)10w


          `
          redis-benchmark -n 300000 EVAL "redis.call('SET', KEYS[1], ARGS[1])" 1 'aaaaaaaaa' 'bbbbbbbbbb'
          `


          Lua腳本每秒完成的請(qǐng)求數(shù)10w


          `
          redis-benchmark -n 3000000 -P 50 SET 'abcdefg' 'ddddddd'
          `


          走Pipeline的話,每秒完成的請(qǐng)求數(shù)150w,這個(gè)性能對(duì)比單個(gè)Set操作有大幅提升。從這個(gè)數(shù)據(jù)和單個(gè)操作的對(duì)比看,Redis本身內(nèi)存操作開(kāi)銷不大,很多的開(kāi)銷花在了網(wǎng)絡(luò)IO上,因此批量任務(wù)能夠大幅提升吞吐量


          `
          redis-benchmark -n 300000 EVAL "for k=1, 10 do; redis.call('SET', KEYS[1], ARGS[1]); end" 1 'aaaaaaaaa' 'bbbbbbbbbb'
          `


          我們?cè)贚ua內(nèi)部,連續(xù)執(zhí)行10次Set,每秒完成的請(qǐng)求數(shù)6.1w,和只執(zhí)行1次Set差別沒(méi)有很大。這個(gè)結(jié)果在我們的預(yù)期之內(nèi),因?yàn)榍懊鍼ipeline的結(jié)果顯示Redis的內(nèi)存操作開(kāi)銷大幅小于網(wǎng)絡(luò)。


          dtm性能分析



          dtm需要跟蹤全局分布式事務(wù)的進(jìn)度,我們以Saga舉例,大概涉及以下操作:


          • 保存事務(wù)信息,含全局事務(wù)、事務(wù)分支、還有查找過(guò)期事務(wù)的索引,dtm用一個(gè)Lua腳本來(lái)完成這些操作

          • 每個(gè)事務(wù)分支完成時(shí),修改事務(wù)分支狀態(tài)。由于修改狀態(tài)時(shí),需要確認(rèn)全局事務(wù)未回滾,避免回滾中的事務(wù)還往前執(zhí)行,因此dtm也用一個(gè)Lua腳本來(lái)完成

          • 全局事務(wù)完成,修改全局事務(wù)為成功,此時(shí)也需要避免已超時(shí)回滾中的事務(wù)被覆蓋,也是一個(gè)Lua腳本


          那么一個(gè)具備兩個(gè)事務(wù)分支的全局事務(wù)在Redis上的理論開(kāi)銷大約是4個(gè)Lua腳本的開(kāi)銷,那么從前面每秒能夠完成大約6w個(gè)簡(jiǎn)單Lua腳本來(lái)看,每秒最理想能夠完成1.5w個(gè)分布式事務(wù)。由于實(shí)際的Lua腳本比我們測(cè)試的更復(fù)雜,傳輸?shù)臄?shù)據(jù)量更大,因此最終每秒完成1.08w個(gè)事務(wù),已經(jīng)是差不多的性能極限值。當(dāng)達(dá)到1.08w每秒的事務(wù)性能時(shí),觀測(cè)到Redis的CPU已經(jīng)是100%,到了性能瓶頸。

          展望



          每秒1w事務(wù)已經(jīng)是非常高的性能,足夠應(yīng)對(duì)絕大多數(shù)的場(chǎng)景。包括消息隊(duì)列、秒殺等。

          當(dāng)Redis能夠支撐這么大的事務(wù)量時(shí),如果是長(zhǎng)時(shí)間這么大的事務(wù)量,那么redis的存儲(chǔ)空間很快就不夠了,后續(xù)可能添加選項(xiàng),允許及時(shí)清理掉已完成的事務(wù)

          未來(lái)dtm的性能是否還能提高?我們可以從兩方面看:

          一個(gè)是在目前單進(jìn)程的情況下,dtm能夠達(dá)到1w事務(wù)每秒,在redis6.0上,官方的數(shù)據(jù)顯示,4CPU性能大約提升150%,這樣的話dtm預(yù)計(jì)能夠支撐2.5w事務(wù)每秒。

          另一個(gè)是dtm往集群的方向發(fā)展,提供集群能力,允許動(dòng)態(tài)擴(kuò)容等。這方面需要看未來(lái)的使用情況,再做相關(guān)規(guī)劃。



          點(diǎn)擊左下角閱讀原文,到 SegmentFault 思否社區(qū) 和文章作者展開(kāi)更多互動(dòng)和交流,掃描下方”二維碼“或在“公眾號(hào)后臺(tái)回復(fù)“ 入群 ”即可加入我們的技術(shù)交流群,收獲更多的技術(shù)文章~

          - END -


          瀏覽 20
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  婷五月丁香乱伦电影网站 | 亚洲成人性爱图片 | 蜜桃秘 av无码一区二区三区 | 欧美黄色免费视屏 | 国产免费自拍 |