How to clean up Redis memory fragments
What is Redis memory fragmentation?
The total amount of remaining space in the operating system is sufficient, but when applying for a space with a continuous address of N bytes, there is no continuous space of N bytes in the remaining memory space. Then, among the remaining memory spaces, less than N The contiguous memory space of bytes is memory fragmentation.
How is Redis memory fragmentation formed?
There are internal and external reasons for the formation of memory fragmentation:
Internal reason: The allocation strategy of the memory allocator determines that the operating system cannot achieve "allocation on demand".
Redis uses libc, jemalloc, and tcmalloc to allocate memory. By default, jemalloc is used.
The memory allocator allocates memory space according to a fixed size, not entirely according to the memory size requested by the application.
Taking jemalloc as an example, it divides the memory space according to a series of fixed sizes, such as 8 bytes, 16 bytes, 32 bytes,..., 2KB, 4KB, etc. Jemalloc will allocate a fixed size space closest to the memory requested by the program.
External reason: The key-value pairs are of different sizes, and the key-value pairs can be modified and deleted.
When Redis applies for memory space allocation, for memory space requirements of different sizes, the memory allocator allocates memory space according to a fixed size. The allocated memory space is generally larger than the requested memory space. The memory space is larger, which will produce certain memory fragmentation.
Key-value pairs will be modified and deleted, which will lead to space expansion and release.
How to determine whether Redis has memory fragmentation?
DAS queries the detailed information of memory usage through the INFO command provided by Redis. The command is as follows:
INFO memory # Memory used_memory:350458970752 used_memory_human:326.39G used_memory_rss:349066919936 used_memory_rss_human:325.09G … mem_fragmentation_ratio:1.00
used_memory: Indicates that Redis is used to save data. The actual memory space requested.
used_memory_rss: Indicates the physical memory space actually allocated to Redis by the operating system, which includes memory space fragments.
mem_fragmentation_ratio refers to the current memory fragmentation rate of Redis. Calculation formula: mem_fragmentation_ratio=used_memory_rss/used_memory
mem_fragmentation_ratio is greater than or equal to 1 but less than or equal to 1.5. This situation is reasonable.
mem_fragmentation_ratio is greater than 1.5, indicating that the memory fragmentation rate has exceeded 50%.
How to clean up memory fragments?
A "simple and crude" method is to restart the Redis instance. However, this method will bring two consequences:
If the data in Redis is not persisted, the data will be lost;
Regardless of the Redis data Whether it is persisted or not, the AOF or RDB method needs to be used to restore the data, and the recovery time depends on the size of the AOF or RDB file. And if there is only one Redis instance, services cannot be provided during the recovery phase.
Is there a better way? Yes, from version 4.0-RC3 onwards, Redis itself provides a method to automatically clean up memory fragments.
Automatic cleaning of memory fragments
Cleaning of memory fragments, simply put, means "moving to make way and merging space".
When there is data that divides a continuous memory space into several discontinuous spaces, the operating system will copy the data to another place, and the original discontinuous memory space becomes a continuous memory space. .
But fragmentation cleanup comes at a cost. Moving multiple copies of data to a new location and freeing up the original space is something the operating system must do, but this process takes time. In addition, when data is copied, Redis will be blocked and performance will be reduced.
How to alleviate this problem?
Redis specifically provides parameter settings for the automatic memory fragmentation cleaning mechanism. You can set parameters to control the start and end timing of fragmentation cleaning, as well as the proportion of CPU occupied, thereby reducing the performance impact of fragmentation cleaning on Redis request processing.
First, turn on automatic memory fragmentation cleanup:
config set activedefrag yes
Then, set the conditions that trigger memory cleanup:
active- defrag-ignore-bytes 100mb: Indicates that when the number of bytes of memory fragmentation reaches 100MB, cleanup will begin;
active-defrag-threshold-lower 10: Indicates that the memory fragmentation space occupies the operating system allocation When the total space allocated to Redis reaches 10%, cleanup begins.
Finally, control the upper and lower limits of the proportion of CPU time occupied by cleaning operations:
active-defrag-cycle-min 25: Indicates automatic cleaning The proportion of CPU time used in the process is not less than 25% to ensure that the cleaning can proceed normally;
active-defrag-cycle-max 75: Indicates that the proportion of CPU time used in the automatic cleaning process is not high Above 75%, once it exceeds, the cleaning will be stopped to avoid a large number of memory copies blocking Redis during cleaning, resulting in increased response latency.
The above is the detailed content of How to clean up Redis memory fragments. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics











Redis cluster mode deploys Redis instances to multiple servers through sharding, improving scalability and availability. The construction steps are as follows: Create odd Redis instances with different ports; Create 3 sentinel instances, monitor Redis instances and failover; configure sentinel configuration files, add monitoring Redis instance information and failover settings; configure Redis instance configuration files, enable cluster mode and specify the cluster information file path; create nodes.conf file, containing information of each Redis instance; start the cluster, execute the create command to create a cluster and specify the number of replicas; log in to the cluster to execute the CLUSTER INFO command to verify the cluster status; make

How to clear Redis data: Use the FLUSHALL command to clear all key values. Use the FLUSHDB command to clear the key value of the currently selected database. Use SELECT to switch databases, and then use FLUSHDB to clear multiple databases. Use the DEL command to delete a specific key. Use the redis-cli tool to clear the data.

To read a queue from Redis, you need to get the queue name, read the elements using the LPOP command, and process the empty queue. The specific steps are as follows: Get the queue name: name it with the prefix of "queue:" such as "queue:my-queue". Use the LPOP command: Eject the element from the head of the queue and return its value, such as LPOP queue:my-queue. Processing empty queues: If the queue is empty, LPOP returns nil, and you can check whether the queue exists before reading the element.

On CentOS systems, you can limit the execution time of Lua scripts by modifying Redis configuration files or using Redis commands to prevent malicious scripts from consuming too much resources. Method 1: Modify the Redis configuration file and locate the Redis configuration file: The Redis configuration file is usually located in /etc/redis/redis.conf. Edit configuration file: Open the configuration file using a text editor (such as vi or nano): sudovi/etc/redis/redis.conf Set the Lua script execution time limit: Add or modify the following lines in the configuration file to set the maximum execution time of the Lua script (unit: milliseconds)

Use the Redis command line tool (redis-cli) to manage and operate Redis through the following steps: Connect to the server, specify the address and port. Send commands to the server using the command name and parameters. Use the HELP command to view help information for a specific command. Use the QUIT command to exit the command line tool.

Redis counter is a mechanism that uses Redis key-value pair storage to implement counting operations, including the following steps: creating counter keys, increasing counts, decreasing counts, resetting counts, and obtaining counts. The advantages of Redis counters include fast speed, high concurrency, durability and simplicity and ease of use. It can be used in scenarios such as user access counting, real-time metric tracking, game scores and rankings, and order processing counting.

There are two types of Redis data expiration strategies: periodic deletion: periodic scan to delete the expired key, which can be set through expired-time-cap-remove-count and expired-time-cap-remove-delay parameters. Lazy Deletion: Check for deletion expired keys only when keys are read or written. They can be set through lazyfree-lazy-eviction, lazyfree-lazy-expire, lazyfree-lazy-user-del parameters.

In Debian systems, readdir system calls are used to read directory contents. If its performance is not good, try the following optimization strategy: Simplify the number of directory files: Split large directories into multiple small directories as much as possible, reducing the number of items processed per readdir call. Enable directory content caching: build a cache mechanism, update the cache regularly or when directory content changes, and reduce frequent calls to readdir. Memory caches (such as Memcached or Redis) or local caches (such as files or databases) can be considered. Adopt efficient data structure: If you implement directory traversal by yourself, select more efficient data structures (such as hash tables instead of linear search) to store and access directory information
