天天看點

redis與CPU、記憶體

redis與CPU、記憶體任何一個後端應用,包括代碼都要考慮對于CPU和記憶體的影響.redis本質上類似于nodejs,單程序、單線程,事件驅動,但不同的是redis是CPU密集型的。這裡列出了redis與記憶體CPU的相關考慮點。

單程序、單線程的redis如何實作高并發

同nodejs類似

  • 優點:
  1. 采用多路 I/O 複用技術可以讓單個線程高效的處理多個連接配接請求;
  2. 避免線程切換而消耗CPU
  • 缺點:
  1. 無法發揮多核CPU性能,不過可以通過在單機開多個Redis執行個體來完善

如果redis記憶體滿了怎麼辦

增加記憶體

使用記憶體淘汰政策

搭建redis叢集

如果redis導緻CPU過高怎麼辦

連接配接數過多,通過redis-cli info | grep connected_clients檢視目前連接配接

解決:

關閉僵屍連接配接; redis-cli登入後,client list檢視所有用戶端連接配接,client kill ${ip}:${port} 關閉連接配接;

修改最大連接配接數maxclients: 10000,預設10000;

修改redis timeout參數: 修改配置檔案中的timeout 設定redis的keepalive時間。用戶端斷連的包發出去後,redis server沒有接受到,則會出現redis server以為連接配接正常的情況。是以需要在redis server 啟動逾時設定,如果在一定的時間内,用戶端沒有消息過來,則redis server主動斷開連接配接。

修改redis程序的檔案數限制: echo -n "Max open files 3000:3000" > /proc/PID/limits

修改系統參數的最大檔案數限制: /etc/security/limits.conf; redis伺服器預設設定的最大連接配接數maxclients是10000,但是受伺服器最大檔案數影響,伺服器預設最大檔案數是1024,是以redis最大連接配接也為1024-32=992; 解決辦法

慢查詢,因為redis是單線程,如果有慢查詢的話,會阻塞住之後的操作,通過redis日志查

value值過大:如果是純文字,可以考慮換種存儲方式,如果是對象,可以考慮用hash;

aof重寫/rdb fork發生?瞬間會堵一下Redis伺服器

redis性能優化

Master最好不要做任何持久化工作,包括記憶體快照和AOF日志檔案,特别是不要啟用記憶體快照做持久化。

如果資料比較關鍵,某個Slave開啟AOF備份資料,政策為每秒同步一次。

為了主從複制的速度和連接配接的穩定性,Slave和Master最好在同一個區域網路内。

盡量避免在壓力較大的主庫上增加從庫。

為了Master的穩定性,主從複制不要用圖狀結構,用單向連結清單結構更穩定,即主從關系為:Master<--Slave1<--Slave2<--Slave3.......,這樣的結構也友善解決單點故障問題,實作Slave對Master的替換,也即,如果Master挂了,可以立馬啟用Slave1做Master,其他不變

使用Redis負載監控工具:redis-monitor,它是一個Web可視化的 redis 監控程式

redis分庫,這樣友善于管理與維護。

redis占用資源監控工具——redis-monitor

部署

OK: init configuration file into /root/.redis-monitor/redis_monitor_config.py.

OK: database is initialed into /root/.redis-monitor/redis_monitor.db.

參考

redis cpu占用過高排查

單程序單線程的Redis如何能夠高并發

原文位址

https://www.cnblogs.com/zhaowinter/p/10786862.html

繼續閱讀