你知道CPU結構也會影響Redis效能嗎?

2022-07-08 05:18:12 字數 3451 閱讀 1711

啦啦啦,我是賣身不賣藝的二哈,ε=(´ο`*)))唉錯啦(我是開車的二哈),我又來了,鐵子們一起開車呀!

今天來分析下cpu結構對redis效能會有影響嗎?

在進行redis效能分析的時候,通常我們會考慮下面這些方面,如:

1. 縮短 key 的長度

2. 禁止使用 keys *

我們都知道 keys *, 在使用的時候 redis 會處於阻塞狀態,導致其它任何命令在你的 redis 例項中都無法執行。這個情況在 redis 資料量大的時候就很明顯,嚴重影響系統的執行。(一般我們用 scan 來代替)

3. 進行資料壓縮

在把資料存入 redis 中,我們一般不會使用完整全名的資料,一般會進行適當的資料壓縮,這樣可以提高 redis 效能,方便我們資料的儲存。

4. 設定過期時間

我們對一些不是永久性需要的資料,可以進行鍵的過期時間設定,這樣到時間後,資料就會自動清除,節省我們 redis 儲存空間(記憶體)。

5. 使用**策略

為資料設定相關的過期**策略,節省記憶體的開銷,提高 redis 執行的效能。( redis 目前有8種**策略,有興趣可以檢視 redis.conf ,多了lfu)。

6. 適當使用 bit (位圖)

適當使用 bit,可節省我們 redis 儲存的成本,即記憶體的大小。

7. 對所儲存的資料字段進行優化

如:我們只需要在 redis 儲存關鍵資訊即可,詳細資訊儲存到磁碟上即可。

8. 使用管道進行資料操作

對於命令執行操作,我們要使用管道 pipeline,這樣可以節省 redis 傳輸過程的成本,提高 redis 的效能。我們知道如果不適用管道,命令是乙個乙個進行操作,如果我們加上管道,這樣由原來的單條命令變成多條命令進行傳輸操作,節省多次傳輸過程的網路開銷。

n .... (還有很多很多~~)

但是,我們可能有時候會真正忽略 redis 執行的前提條件,單核 cpu 和多核 cpu 對 redis 效能影響也是相差甚遠。在計算機組成原理中,我們都知道 cpu 是計算機的核心構成之一,**處理器(central processing unit),是計算機系統的運算和控制中心。乙個cpu處理器中一般包含有多個執行核心(物理核),執行核心我們也叫作物理核,一般包含一級快取(l1 cache)和二級快取(l2 cache)。其架構圖如下所示:

對於 l1 快取和 l2 快取,在每個物理核上都是獨自擁有的,訪問速度非常快,基本都在 ns 級別。我們設想如果把資料執行的指令放在這兩個快取上,那麼可以大大提高計算機的訪問效能。這樣我們可以設想這樣乙個情形:

如果,我們把 redis 例項的資料和指令繫結到乙個 cpu 核上,那麼當 redis 頻繁執行資料訪問和操作時,都是基於cpu 上的快取進行操作,那麼效能是不是大大的提高了,沒錯,事實就是如此。但是,我們電腦一般都是多核 cpu 的,在進行資料訪問和操作時,系統不會只有乙個執行緒在進行操作,是有很多很多的執行緒在同時進行操作,會同時操作我們的cpu,也就是我們所說的多執行緒操作cpu。如果乙個執行緒此時在cpu1上執行,後來又跑到了cpu2上執行,這時在cpu1上保留的資料和指令不在cpu2,這時要重新進行資料載入,會降低執行緒執行的效率,上述所發生的過程,我們也叫作上下文切換,這在作業系統核心環境下,是很常見的現象。

所以,我們要避免執行緒來回在cpu上進行切換,導致指令和資料進行多次載入,增加鎖處理的時間。我們從cpu結構出發,如果在多核cpu上,如果我們的每個redis例項都只在乙個cpu上執行的話,那麼我們離解決問題的步伐是不是又更近了一步。(問題都是一步一步的剖析,慢慢解開其真容(*╹▽╹*))。

taskset 是依據執行緒pid(tid)查詢或設定執行緒的cpu親和性(affiliation)(與哪個cpu核心繫結)。

如果有夥伴們不知道 taskset 如何使用,沒關係,可以使用 man 或者 help 手冊進行檢視相關引數使用(   man taskset    或  taskset -h  )。在進行繫結的時候,我們要知道自己機器的cpu的核數(  cat /proc/cpuinfo  ),以方便我們準確的進行cpu繫結,不會說不知道自己cpu核數隨便繫結乙個超過自己cpu核數的數。

例子:假如我們要繫結cpu0這個cpu核,那麼命令如下:

taskset -c  0  ./redis-server
這時,我們可以通過 redis 的壓測工具進行相關測試  redis-benchmark  

例如:對 get 、put 和 set 進行測試:

redis-benchmark -h  127.0  .  0.1  -p  6379  -c  50  -n  10000  -t get

redis-benchmark -h 127.0 . 0.1 -p 6379 -c 50 -n 10000 -t put

redis-benchmark -h  127.0  .  0.1  -p  6379  -c  50  -n  10000  -t set
可以發現redis例項的效能大大提公升。

redis例項還可以和網路中斷程式綁在 cpu socket 上,這樣能減小redis 跨 socket 訪問記憶體的網路開銷。(在網路傳輸過程中,這也是乙個非常值得考慮優化的問題)。

這裡或許會有夥伴會問了(乙個cpu物理核內部不是還有邏輯核嗎,我們不應該繫結在邏輯核上嗎?)

這個小夥伴思考的好!別急,我先給你們維基百科(面向搜尋引擎)下這些知識點:

注意啦!!這裡裡面的三角關係:

乙個cpu可以有多個物理核。但是如果作業系統開啟了超執行緒,乙個物理核可以分成 n 個邏輯核,n為超執行緒的數量。(分身)

來讓我們看看單核cpu的草圖:

我們可以從上圖看出,乙個cpu核內在沒有開啟超執行緒的時候 ,內部是有兩個邏輯核的,但是為什麼我們不把 redis 例項繫結在其中乙個邏輯核上,而是繫結在它們的物理核上呢?把 redis例項繫結在乙個物理核上,可以讓該例項的主程序、子程序、後台執行緒都共享這個物理核內的兩個邏輯核,這樣可以使這些執行緒和程序不必只爭搶乙個邏輯核,一定程度上避免的cpu競爭。(因為內部有兩個供他們選擇使用,不會只因為使用乙個而來回切換)。

以上這些操作,都是小小的起步,如果我們還需要進一步提公升redis效能,我們需要從原始碼程度去解讀redis,深入研究,在必要時刻我們可以修改redis的原始碼,從根源上尋找適合當前問題最佳扳手。

二哈,今天的分享就到這裡啦~~,下次再見,鐵子們~

空間(記憶體)。

你不知道的 CPU 原理

cpu 是一台計算機核心且異常複雜的部件,當我們操作電腦,它以極快的速度執行著我們預設的每一條指令,但往往一些即使是作為程式設計師的專業人員也對其知之甚少,了解它的一些基本術語和基本執行步驟將會接近與 cpu 之間的距離。1.時鐘週期 我們通常看到的 cpu 主頻。時鐘脈衝由晶振發出,一般用來作同步...

我知道你會氣泡排序,那你會優化氣泡排序嗎?

在生活中,我們離不開排序,比如我們上學的時候按個頭高低排位置,現在我們買東西的時候會按照發貨地遠近進行排序,或者 高低排序。排序看著簡單,可是背後藏著很多的演算法和思想。在這給大家介紹一下常用的排序演算法。每次提到排序,繞不開的就是氣泡排序。氣泡排序 bubble sort 是一種基礎的交換排序。它...

掌握這些流程!你也會資料視覺化!

圖表中的柱狀圖 條形圖 折線圖 餅圖 散點圖等圖形,都是大多數人對資料視覺化的第一感覺,而往往卻疏忽了資料視覺化的更深層次展示。乙個完整的資料視覺化流程 01資料採集以及分析 大資料時代,金融 經濟 教育 銷售等等所有的行業都將和的資料息息相關。簡單的來說,只要您有一套完整的資料庫體系,就能為您的視...