redis 效能分析
Redis效能剖析
高併發效能瓶頸點:
商品秒殺的業務場景為什麼說跟其他的業務場景不一樣呢?不一樣在哪裡呢?
使用者扎堆現象很嚴重。
大資料時代的3V:
海量(Volume)、多樣(Variety) 、實時(Velocity)
海量:現在的股票,期貨的開盤時間固定的,這樣就有海量的使用者同時登陸
多樣:電商,叫車...
實時:操作軟體的時候,1,2秒鐘沒有響應的活,幾乎就失去使用者了
網際網路需求的3高:
高併發,高效能(高可用),高可擴。
如果用傳統的資料庫來做,IO操作很頻繁。因為mysql是以檔案的形式儲存在硬碟上的
現在redis是快取級別的,一般在專案裡面是單獨部署在一個伺服器上面的。 對記憶體要求比較高。
關於資料庫,有好多種:
一般檔案的話,有檔案伺服器:mongdb
redis是快取的,階段性的高頻資訊適合用redis來做。
高併發一般就是兩種做法:
1.加快取:一般就是redis
2.佇列:rabbitmq(使用者的併發量來了,內部的機制,可以做一個基本的佇列)
輸入驗證的同時,就是把時間拉長了。就是非同步的機制。還有其他的一些策略。排隊啊。倒數計時。。。其實就是在分散好多壓力
如果沒有快取、非同步化這些技術,A所有的請求都直接去訪問DB話,不管你的資料庫是mysql還是oracle,都扛不住。
Redis方案簡介
Redis就是將高頻的資料放在redis的記憶體伺服器上,減輕mysql的IO操作。對磁碟的讀寫的操作
優點:
最重要的就是解決併發的時候,對資料庫的操作
一般tomcat和nginx掛了,是在頁面上面能直接看出來的。都不能訪問的
Redis是存資料的,存頻繁常用的資料。如果直接掛了,存在裡面的token值,就是不能用了
分散式:
不同伺服器一般放不同的模組(訂單就是訂單,購買就是購買)
叢集:
不同伺服器一般放相同的模組
相關操作:
為什麼使用 Redis?
在專案中使用 Redis,主要考慮兩個角度:效能和併發。否則用Redis幹嘛??
-
效能角度
傳統:
我們在碰到需要執行耗時特別久,且結果不頻繁變動的 SQL,就特別適合將執行結果放入緩
存。這樣,後面的請求就去快取中讀取,使得請求能夠迅速響應。
特別是在秒殺系統,在同一時間,幾乎所有人都在點,都在下單。。。執行的是同一操作———向資料庫查資料 -
併發角度
在大併發的情況下,所有的請求直接訪問資料庫,資料庫會出現連線異常。這個時候,就需要使用 Redis 做一個緩衝操作,讓請求先訪問到 Redis,而不是直接訪問資料庫。
傳統:
1.Redis安裝:
wget http://download.redis.io/releases/redis-5.0.8.tar.gz #下載redis
tar zxvf redis-5.0.8.tar.gz #解壓redis檔案
mv redis-5.0.8 /usr/local #移到local目錄下
cd /usr/local #進入local目錄
mv redis-5.0.8 redis #重新命名為redis目錄
cd redis #進入redis目錄
make #編譯檔案
2、Redis常用工具
redis最主要的工具都在src裡面
綠色的表示可以執行的,
.c:redis是c語言寫的。.c表示原始檔
.h: 表示標頭檔案
.o:out 檔案,編譯後的檔案
redis-benchmark:
基準測試工具,相當於一個自檢的東西。
redis-cli:
Redis 命令列工具,客戶端
redis-server:
啟動 Redis,服務端
redis有服務端和客戶端
redis-check-aof:
AOF :持久化檔案檢測工具和修復工具,檢測檔案類的
啟redis就是啟啟動 Redis服務端
(頁面能開啟,不代表tomcat和nginx是正常的,如果有redis的話,不代表redis是正常的)
關閉redis
ps -ef|grep redis kill -9 程式ID
啟動redis
cd /usr/local/redis/src
./redis-server ../redis.conf
:./redis-server是直接啟;./redis-server ../redis.conf:從配置引數裡面啟
../:表示上一層目錄
這個頁面,不能關
正常來說是不應該有警告的,
通常會有3個警告:
1.tcp連線數(TCP監聽佇列),預設是128個,一般改成3萬多以上。
2.記憶體分配策略
3.THP
有這些警告,就需要讓開發改
TCP監聽佇列(somaxconn)
該核心引數預設值是128,作用是定義了系統中每一個埠最大的監聽佇列長度。對於負載很大的服務
程式來說大大的不夠。一般會將它修改為32768(最大值65535的一半)。
使用:
cat /proc/sys/net/core/somaxconn 檢視
修改方法:
編輯/etc/sysctl.conf ,改net.core.somaxconn =32768,再sysctl -p 使配置檔案生效(永久有效)
echo 32768 > /proc/sys/net/core/somaxconn(重啟作業系統失效)
記憶體分配策略
overcommit_memory是作業系統核心對記憶體分配的一種策略。取值有0、1、2三種。
cat /proc/sys/vm/overcommit_memory 檢視策略設定
grep -i commit /proc/meminfo最大可申請記憶體和已分配記憶體
0:作業系統預設值。核心檢查是否有足夠的記憶體;有則允許申請;無則申請失敗,返回錯誤給程式。
1:不管需要多少記憶體,都允許申請
2:當系統分配的記憶體超過:swap+物理RAM*N%時,會被拒絕(N%由vm.overcommit_ratio引數指
定)
優化:
redis在備份資料時,會fork出一個子程式,理論上子程式所佔用的記憶體和父程式是一樣的,如父程式佔
用記憶體為5G,這個時候也要同樣分配5G的記憶體給子程式,如果記憶體無法負擔,往往會造成redis伺服器
的當機或者IO負載過高,效率下降。所以記憶體分配策略應該設定為 1。vm.overcommit_ratio引數預設為
50,且當vm.overcommit_memory=2才生效,所以暫時可以不用管。
設定方法有三種:
編輯/etc/sysctl.conf ,改vm.overcommit_memory=1,再sysctl -p 使配置檔案生效(永久有效)
sysctl vm.overcommit_memory=1(臨時有效)
echo 1 > /proc/sys/vm/overcommit_memory(臨時有效)
關閉THP
THP是Transparent Huge Pages的縮寫,透明大頁。linux記憶體採用分段分頁機制,預設請求下一頁大小
為4096kb,1M記憶體被分為256頁。記憶體越大大頁越多,就有大量的記憶體對映表需要去管理,對Oracle、
Redis等資料庫,需要操作大量的記憶體,會影響系統效能。Huge Pages是提高記憶體頁的大小來的,對於
G級別的記憶體,記憶體頁大小設定為2M。由於 Huge pages 很難手動管理。於是引入了THP。但是在某些
情況下,THP會導致異常節點重啟,和效能問題。因此建議禁用。
如何檢視HTP是否啟動呢?可以執行:
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled#小紅帽
cat /sys/kernel/mm/transparent_hugepage/enabled #其他Linux下。
結果是:[always]表示已啟用,[never]表示已禁用。
禁用THP的方法如下(先臨時禁用,再加入到配置檔案):
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# vi /etc/rc.local #新增如下程式碼(重啟伺服器生效)
if test -f /sys/kernel/mm/redhat_transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
fi
Redis的redis-benchmark工具
進入命令列工具
cd /usr/local/redis/src
./redis-cli
輸入密碼命令:auth 密碼
若顯示OK則登入成功:
Redis常見命令
可以有多個客戶端,退出的話:ctrl+c
檢視redis所有的資訊
info
redis_version:redis版本號
gcc_version:linux裡面編輯的版本
process_id:redis的程式號
uptime_in_seconds:redis啟了多長時間(秒)
uptime_in_days:啟了多少天
connected_clients:連線的客戶端數
這個裡面的值通過grafana是可以收集的
redis配置檔案
在redis 的根目錄下,有一個redis.conf檔案,則是redis的配置檔案。
它的引數非常多,主要引數有:
daemonize no #是否後臺執行,一般改為yes
logfile “” #日誌檔案,可設為:logfile “/usr/local/redis/redis.log”
requirepass sq #啟用Redis密碼,sq是設定的密碼
protected-mode yes #保護模式,外部網路不能使用
bind 127.0.0.1 #哪些ip可以連redis,後面可以帶多個地址
maxmemory #redis作為快取一般需要設定,作為資料庫不需要
maxmemory-policy #key的回收策略。一共有6種策略
maxclients 10000 #允許最大的連線數10000
6種key的回收策略:
1. volatile-lru: 在所有帶有過期時間的 key 中使用 LRU 演算法淘汰資料;
2. alkeys-lru: 在所有的 key 中使用最近最少被使用 LRU 演算法淘汰資料,保證新加入的資料正常;
3. volatile-random: 在所有帶有過期時間的 key 中隨機淘汰資料;
4. allkeys-random: 在所有的 key 中隨機淘汰資料;
5. volatile-ttl: 在所有帶有過期時間的 key 中,淘汰最早會過期的資料;
6. noeviction: 不回收,當達到最大記憶體的時候,在增加新資料的時候會返回 error,不會清除舊數
據,這是 Redis 的預設策略;
redis基準測試
Redis的redis-benchmark工具(不需要裝,可以模擬redis效能)
如果有人問,你這個專案裡面redis的效能怎麼樣?可以通過這個工具來測。好的話,效能QPS能到幾十萬。
這個工具就是測試不同的操作的QPS是多少?
cd /usr/local/redis/src
./redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q
以上例項中:主機為 127.0.0.1,埠號為 6379(預設),執行的命令為 set,lpush(redis不同的操作),請求數為 10000,通過-q 引數讓結果只顯示每秒執行的請求數(QPS)
redis是記憶體伺服器,就是把資料放在記憶體裡面的,所以有就是記憶體伺服器
有IO型的伺服器,比如檔案型的伺服器
有cpu型的伺服器等等
redis還有一個叫持久化技術
如果說redis有故障的時候,會主動把資料寫到磁碟裡面去
相關文章
- Redis效能分析和運維工具Redis運維
- Get 所有 Redis 效能問題分析手段Redis
- redis georadius原始碼分析與效能最佳化Redis原始碼
- Redis 效能測試Redis
- Redis 效能優化Redis優化
- Redis效能篇(五)Redis緩衝區Redis
- Redis效能篇(四)Redis記憶體碎片Redis記憶體
- 詳解Redis核心資料結構和高效能原理分析(一)Redis資料結構
- Redis 分析工具 redis-rdb-toolsRedis
- 【Redis】redis阻塞監控項分析Redis
- CPU效能分析
- 效能分析大全
- Java 效能分析Java
- 《大資料: Redis 安全效能》大資料Redis
- redis client原理分析Redisclient
- redis效能監控工具redis-stat安裝初探Redis
- 每秒1w+分散式事務--dtm的Redis儲存效能測試分析分散式Redis
- In和exists使用及效能分析(三):in和exists的效能分析
- 效能分析命令:vmstat
- iOS APP效能分析iOSAPP
- MongoDB索引,效能分析MongoDB索引
- IO效能探索分析
- Perfview 分析程式效能View
- MySQL SQL效能分析MySql
- 效能分析工具 - pprof
- MySQL索引效能分析MySql索引
- Redis效能提高之批量和管道Redis
- Unity效能分析(二)CPU/GPU分析UnityGPU
- 【redis】使用redis benchmark評估哨兵模式主節點效能Redis模式
- Redis系列:深刻理解高效能Redis的本質Redis
- 【Redis】redis各型別資料儲存分析Redis型別
- Redis效能篇(三)Redis關鍵系統配置:如何應對Redis變慢Redis
- Redis 例項分析工具Redis
- 【Azure Redis 快取 Azure Cache For Redis】使用Redis自帶redis-benchmark.exe命令測試Azure Redis的效能Redis快取
- CYQ.Data 操作 Redis 效能測試:對比 StackExchange.RedisRedis
- Unity效能分析(三)記憶體分析Unity記憶體
- Redis安裝+叢集+效能監控Redis
- Redis系列23:效能最佳化指南Redis