1、 client buffer的設計
redis server以單進程的方式處理接收到的請求,而redis完成請求有些工作比較慢,比如網絡IO和磁盤IO等比較慢的操作。redis為了提高處理客戶端請求的響應時間,做了很多優化。比如網絡io和磁盤io是異步完成、使用后臺進程完成bgsave和bgrewriteaof工作,在server端為客戶提供讀buffer等等。
client buffer是在server端實現的一個讀取緩沖區。redis server在接收到客戶端的請求后,把影響結果寫入到client buffer中,而不是直接發送給客戶端。server把結果寫入到client buffer中后,繼續處理客戶端的其他請求。這樣異步處理方式使redis server不會因為網絡原因阻塞其他請求的處理。之前的文章中replication buffer也是client buffer中的一種。
2、client buffer參數設置
redis client buffer的配置參數為”client-output-buffer-limit”,默認值為:
127.0.0.1:6379> CONFIG GET "*output*" 1) "client-output-buffer-limit" 2) "normal 0 0 0 slave 0 0 0 pubsub 0 0 0"
參數設置方法如下:
client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
具體參數含義如下:
class : 客戶端種類,normal、slave、pubsub。
– mormal:普通的客戶端
– slave: 從庫的復制客戶端
– pub/sub: 發布與訂閱的客戶端的
hard limit: 緩沖區大小的硬性限制。
soft limit: 緩沖去大小的軟性限制。
soft seconds: 緩沖區大小達到了(超過)soft limit值的持續時間。
client-output-buffer-limit參數限制分配的緩沖區的大小,防止內存無節制的分配。參數的默認值都為0,意思是不做任何限制。
3、client buffer保護機制
redis server觸發保護機制主要有兩種情況:
1) client buffer的大小達到了soft limit并持續了soft seconds時間,將立即斷開和客戶端的連接。
2) client buffer的大小達到了hard limit,server也會立即斷開和客戶端的連接。
slave replication buffer這里不再討論,而是討論普通客戶端的client buffer。
思考問題:是否要設置client-output-buffer-limit normal參數(默認參數不做任何限制),如何設置?
1)client-output-buffer-limit參數一定要設置,不能使用默認的參數,防患于未然。client buffer實際上是占用redis的數據內存空間(unlike replication buffers, memory allocation for client buffers is taken from Redis’ data memory space.)。redis的最大數據內存空間由maxmemory參數限定。當數據內存空間達到maxmemory參數限定值時,redis會開始evict數據,或者直接提示客戶端OOM(out of memory)。
這種情況下主要發生在客戶端執行大批量數據讀取, 比如keys *、smembers、lrange、hgetall等操作。
如果單次查詢的數據太多,導致redis的used memory增長一倍。
2)client-output-buffer-limit也不能設置太小,這個會導致客戶端讀取不到數據。
這篇文章包含了top redis headaches for devops – client buffers里面的一些內容,而不是簡答的翻譯。
原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/2486