關於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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...