## One 、 Slow query Because Redis It's single threaded , A large number of slow queries can lead to redis-server Blocking , It can be done by slowlog get n Get slow logs , Check the details . ## Two 、bigkey Big stuff bigkey Problems that large objects can cause include : - Memory space is uneven ( Balance ), For example, in Redis Cluster in ,bigkey It will cause uneven utilization of memory space of nodes . - Timeout blocking : Because of Redis Single thread features , operation bigkey It's time consuming , It means blocking Redis More likely to . - Network congestion : Every time you get bigkey The generated network traffic is large , Suppose a bigkey For 1MB, The number of visits per visit is 1000, So every second it produces 1000MB Of traffic , For ordinary gigabit network card ( In terms of bytes 128MB/s) The server is a disaster .  bigkey It's not completely fatal , If this bigkey It exists, but it's hardly visited , Then there is only the problem of uneven memory space , Compared with the other two problems, it is not so important and urgent , But if bigkey It's a hot spot key( Frequent visits to ), Then the harm it brings is unimaginable , So in the actual development and operation and maintenance, we must pay close attention to bigkey The existence of . It can be done by redis-cli -h {ip} -p {port} bigkeys Find big things . ## 3、 ... and 、swap Because Redis In memory , So the amount of data stored depends on the amount of memory . If one Redis The memory usage of the instance item exceeds the maximum available memory (used_memory > Maximum memory available ), Then the operating system starts memory and swap Space exchange , Write old or unused contents of memory to hard disk ( This space on the hard disk is called Swap Split slot ), To free up new physical memory for new pages . Reading and writing on hard disk is slower than memory 5 Orders of magnitude —— Memory is 0.1μs Unit 、 The hard disk is 10ms. If Redis Memory swapping occurs on a program , So Redis and Rely on Redis The application of the above data will be seriously affected . Look at used_memory The index can tell Redis Memory in use , Identify Redis Check method of memory exchange : 1. Identify redis Program number > redis-cli info server | grep process_id 2. Query memory exchange information according to program number > cat /proc/{process_id}/smaps | grep Swap If the exchange volume is 0KB Or individually 4KB, It's normal . Prevent memory swapping : 1. Make sure the machine has enough available memory ; 2. Make sure that all redis The example sets the maximum available memory (maxmemory), Prevent extreme situations redis Uncontrolled growth of memory ; 3. Reduce system usage swap Priorities , Such as echo 10>/proc/sys/vm/swappiness. ## Four 、fork Subroutines stay RDB Generate and AOF When rewriting , Meeting fork A subroutine completes the persistence work , When fork Operations that are too time-consuming can also cause congestion , The blocking reason is that this operation will copy the spatial memory surface of the parent program , namely fork Operation time and memory volume ( Data sets ) It's a big deal . fork Operations are heavyweight operations , Can copy the spatial memory surface of the parent program ( In theory, you need to copy the same memory as the parent program , however linux There's a copy on write mechanism , Parent and child programs contribute the same physical memory pages , It's actually much smaller ,10G Maybe it just needs 20MB). fork The time should be in 20ms/GB; The maximum memory available for each instance should be strictly controlled 10GB Within ( Copy the surface of spatial memory ); Reduce fork Operation frequency , Relax AOF Rewrite trigger time . Use info stats Command acquisition lastest_fork_usec Indicators , Express redis The last time fork The operation takes time . ## 5、 ... and 、AOF The brush disk is blocked Turn on AOF, File swipe disk usually once per second , When the hard disk is under too much pressure ,fsync Need to wait for the write to complete . Look at redis Log or info persistence In Statistics aof_delayed_fsync Indicators . ## 6、 ... and 、Redis Possible blocking caused by input buffer Input buffer :redis Each client is assigned an input buffer , It will temporarily store client transfer commands , And then take it out and execute it . qbuf Represents the total capacity (0 Indicates that no query buffer has been allocated ),qbuf-free Represents the remaining capacity (0 There is no space left ); The size cannot exceed 1G, When the size exceeds 1G Will automatically close the client when , The input buffer is not subject to maxmemory Limit . When a lot of key Enter the input buffer and cannot be consumed , Can cause redis Blocking ; Through client list The command can locate the client that is blocking ; Through info clients Ordered blocked_clients Argument to view the currently blocked command .   ## 7、 ... and 、Redis The possible blocking caused by the output buffer Output buffer (client output buffer): yes redis-server End implementation of a read buffer ,redis-server After receiving a request from the client , Write the result to client buffer in , Instead of sending it directly to the client . This allows you to continue processing other requests from the client , This asynchronous processing makes redis-server It will not block the processing of other requests due to network reasons . redis client buffer The configuration argument of is "client-output-buffer-limit", The default value is : ``` 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" ``` - class : Client type ,normal、slave、pubsub - normal: A normal client - slave: Copy client from library - pub/sub: Release and subscribe to the client - hard limit: Hard limit on buffer size . - soft limit: Soft limit of buffer size . - soft seconds: The buffer size has reached ( More than )soft limit The duration of the value . client-output-buffer-limit Arguments limit the size of the allocated buffer , Prevent uncontrolled allocation of memory . The default values of arguments are 0, It means no restrictions . redis server There are two main situations of triggering protection mechanism : 1) client buffer It's the size of soft limit And it lasted soft seconds Time , Will immediately disconnect from the client . 2) client buffer It's the size of hard limit,server Will also immediately disconnect from the client . ## 8、 ... and 、 Internet problems ### 1. Connection rejection - Internet flash off : Generally, in the case of network cutover or bandwidth depletion ; - redis Connection rejection : The number of connections is greater than maxclients Refuse new connections to enter , You can focus on info stats Of rejected_connections Indicators ; - Connection overflow : - Procedural restrictions : Program can open the maximum number of files control —— ulimit -n, Usually 1024, A lot of connected redis You need to increase the value ; - backlog Queue overflow : The system is specific to a particular port tcp Connect to use backlog Queue storage ,redis Presupposition 511, System backlog Presupposition 128, You can use it online cron Do it regularly netstat -s | grep overflowed Statistics ; ### 2. Network latency Measuring network latency between machines > redis-cli -h {ip} -p {port} –latency redis-cli -h {ip} -p {port} –latency-history Presupposition 15 Seconds to complete a line of Statistics ,-i Control the sampling time redis-cli -h {ip} -p {port} –latency-dist The chart shows , Every time 1 Second pick