關於redis單線程的分析

来源:https://www.cnblogs.com/fatmanhappycode/archive/2020/04/16/12708861.html
-Advertisement-
Play Games

redis為什麼那麼快?結論有三點,大家都知道,這裡主要是分析。 首先第一點 redis是記憶體訪問的,所以快 當然這個大家都知道,所以不是重點 io密集型和cpu密集型 一般我們把任務分為io密集型和cpu密集型 io密集型 IO密集型指的是系統的CPU性能相對硬碟、記憶體要好很多,此時,系統運作,大 ...


redis為什麼那麼快?結論有三點,大家都知道,這裡主要是分析。

首先第一點

redis是記憶體訪問的,所以快

當然這個大家都知道,所以不是重點


 

io密集型和cpu密集型

一般我們把任務分為io密集型cpu密集型

 

io密集型

  • IO密集型指的是系統的CPU性能相對硬碟、記憶體要好很多,此時,系統運作,大部分的狀況是CPU在等I/O (硬碟/記憶體) 的讀/寫操作,此時CPU Loading並不高。
  • 對於io密集型的任務,它的主要時間都在磁碟io上,而io本身在發出中斷告知cpu後,cpu只需要短暫的處理一下,之後就由DMA(詳見附錄)負責數據傳輸,整個過程對cpu的利用率很低。因此我們需要開更多的線程去充分利用cpu。即一般線程數 = cpu核心數 * 2,如資料庫連接池

 

cpu密集型

  • CPU密集型也叫計算密集型,指的是系統的硬碟、記憶體性能相對CPU要好很多,此時,系統運作大部分的狀況是CPU Loading 100%,CPU要讀/寫I/O(硬碟/記憶體),I/O在很短的時間就可以完成,而CPU還有許多運算要處理,CPU Loading很高。
  • 對於cpu密集型的任務,它對cpu的利用率很高,所以不需要開更多的線程去提高cpu利用率。假如增加線程,只會引起線程的頻繁切換導致本來就不夠用的cpu更加不夠用。所以一般是線程數 = cpu核心數 + 1

 


 

redis的瓶頸在哪裡

redis基本都在進行記憶體io,那它的瓶頸在io上嗎?

redis在網路io上使用epoll實現了一個io多路復用的reactor模型,epoll是非阻塞io,所以避免了cpu阻塞在io上,所以它不是io密集型,瓶頸不在於等待io導致cpu利用率不高,不需要多個線程來屏蔽等待io執行完成的時間。當然redis的io利用率很高,但是io利用率高並不代表它是io密集型,因為它瓶頸不在等待io上。

 

所以第二點

redis在網路io上使用epoll實現了一個io多路復用的reactor模型使得cpu利用率更高,浪費在io上的時間更少

redis並不需要多線程來提高cpu利用率減少io等待時間,並且單線程架構也比較容易實現,所以順理成章就採用了單線程架構。

關於epoll可以看我的這篇文章:https://www.cnblogs.com/fatmanhappycode/p/12362423.html

第三點

由於採用了單線程架構,避免了線程線程切換產生的消耗

因為一次CPU上下文的切換大概在 1500ns 左右。

從記憶體中讀取 1MB 的連續數據,耗時大約為 250us,假設1MB的數據由多個線程讀取了1000次,那麼就有1000次時間上下文的切換,

那麼就有1500ns * 1000 = 1500us ,我單線程的讀完1MB數據才250us ,你光時間上下文的切換就用了1500us了,我還不算你每次讀一點數據 的時間

 

那麼redis是cpu密集型嗎?答案是否定的。

redis也不是cpu密集型。大多數情況下redis機器上的cpu是很夠用的。

 

redis的瓶頸在於記憶體大小和網路帶寬。

 

如果想要更充分的利用多核cpu,可以採用多個redis實例的方法,同時為了減少線程爭用,可以將實例和cpu綁定的方法。

但是如果做了CPU綁定,在rdb和aof時子進程會與父進程共用使用一個CPU。子進程重寫時對單核CPU使用率通常在90%以上,父進程與子進程將產生激烈CPU競爭,極大影響Redis穩定性。(解決方法不清楚,也許多綁定一個CPU會好點?)

 


 

附錄

DMA

DMA 傳輸將數據從一個地址空間複製到另外一個地址空間。當CPU 初始化這個傳輸動作,傳輸動作本身是由 DMA 控制器來實行和完成。

典型的例子就是移動一個外部記憶體的區塊到晶元內部更快的記憶體區。例如記憶體移到磁碟。

 

最後慣例附一圖:

 


參考資料:

https://www.php.cn/redis/422123.html

https://blog.csdn.net/youanyyou/article/details/78990156

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關鍵字 meta(標簽)及 Keywords(關鍵詞),曾經在網頁中很重要的,但現在已經被很多搜索引擎完全忽略。但是,如果加上這個標簽也對網頁的綜合表現沒有壞處,不過,如果使用不恰當的話,對網頁非但沒有好處,還有欺詐的嫌疑。 <meta name="keywords" content="若夢,ech ...
  • 影響用戶訪問的最大部分是前端的頁面。網站的劃分一般為二:前端和後臺。我們可以理解成後臺是用來實現網站的功能的,比如:實現用戶註冊,用戶能夠為文章發表評論等等。而前端呢?其實應該是屬於功能的表現。 而我們建設網站的目的是什麼呢?不就是為了讓目標人群來訪問嗎?所以我們可以理解成前端才是真正和用戶接觸的。 ...
  • 本文基於Supermap平臺實現二維矢量數據的84轉火星。 步驟: 在iDesktop中把數據轉換成wgs84的地理坐標系 在iDesktop中,把數據轉成geojson。 註意格式要選擇utf-8,不然中文欄位會亂碼。 在nodejs下,使用projzh包把wgs84坐標轉成火星坐標。 //ind ...
  • 物聯網海量設備心跳註冊,脫網清除——多線程高併發互斥鎖落地 [toc] 1.應用背景 在物聯網應用場景中,需要維護很多個設備的連接,比如基於TCP socket通信的長連接,目的是為了獲取設備採集的信息,反向控制設備的數字開關或者模擬量。我們把這些TCP長連接都放入了基於線程安全的Concurren ...
  • BUAA OO 第二單元總結 Part 1 設計策略 這三次作業採用了 主線程獲取請求,多級調度器逐級分派,電梯模擬運行的策略 。具體來說,主線程實例化 類,通過阻塞讀取方式獲得請求 ,之後將請求分配給調度器 ,調度器負責處理請求(既可以自己處理,也可以分配給其他子調度器處理),每一個電梯與一個 綁 ...
  • 北航OO(2020)第二單元博客作業 [TOC] 設計策略分析(多線程視角) 本單元的三次作業中,我採用了相似的策略:採用輸入線程與電梯線程通過線程安全的調度器進行交互的方式。這種方式基本屬於生產者 消費者模式。在調度器的設計方面,我主要採用synchronized關鍵字結合wait和notify方 ...
  • 前言 這是一個基於中小型企業或團隊的架構設計。 不考慮大廠。有充分的理由相信,大廠有絕對的實力來搭建一個相當複雜的環境。 中小型企業或團隊是個什麼樣子? 開發團隊人員配置不全,部分人員身兼開發過程上下游的數個職責; 沒有專職的維護人員,或者維護人員實力不足以完全掌控生產和開發環境。 這種情況下,過於 ...
  • 無處不在的線程,多線程,阻塞隊列,併發 編程世界無新鮮事,看你翻牆翻得厲不厲害 場景:現在的軟體開發迭代速度(一周一更新,甚至一天一發佈)真是太快了,今天進行軟體更新的時候,看到了有趣的現象,這不就是線程池,ThreadPoolExecutor,阻塞隊列,任務(下載和安裝)最好的案例嘛!經常看到很多 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...