X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/46b614edf7522e2bf8d3512fab347a9c9d4a1d70..59aee5513d27fdf2d24499f35611093fa0fab3fb:/doc/VirtualMemoryUserGuide.html
diff --git a/doc/VirtualMemoryUserGuide.html b/doc/VirtualMemoryUserGuide.html
index 7bc67b15..d4d6f759 100644
--- a/doc/VirtualMemoryUserGuide.html
+++ b/doc/VirtualMemoryUserGuide.html
@@ -39,7 +39,7 @@ vm-max-threads 4
This is the maximum number of threads used in order to perform I/O from/to the swap file. A good value is just to match the number of cores in your system.
However the special value of "0" will enable blocking VM. When VM is configured to be blocking it performs the I/O in a synchronous blocking way. This is what you can expect from blocking VM:
+Not all the kind of file systems are able to deal with large files in a good way, especially Mac OS X file system tends to be really lame about it.
The suggestion is to use Linux ext3 file system, or any other file system with good support for sparse files. What are sparse files?
Sparse files are files where a lot of the content happen to be empty. Advanced file systems like ext2, ext3, ext4, RaiserFS, Raiser4, and many others, are able to encode this files in a more efficient way and will allocate more space for the file when needed, that is, when more actual blocks of the file will be used.
The swap file is obviously pretty sparse, especially if the server is running since little time or it is much bigger compared to the amount of data swapped out. A file system not supporting sparse files can at some point block the Redis process while creating a very big file at once.
For a list of file systems supporting spare files check this Wikipedia page comparing different files systems.Monitoring the VM
Once you have a Redis system with VM enabled up and running, you may be very interested in knowing how it's working: how many objects are swapped in total, the number of objects swapped and loaded every second, and so forth.
There is an utility that is very handy in checking how the VM is working, that is part of Redis Tools. This tool is called redis-stat, and using it is pretty straightforward:$ ./redis-stat vmstat --------------- objects --------------- ------ pages ------ ----- memory ----- load-in swap-out swapped delta used delta used delta @@ -57,7 +57,6 @@ $ ./redis-stat vmstat 10087 18784 886771 -1574 894577 -1828 200.36M +91.60K 9330 19350 887411 +640 894817 +240 200.17M -189.72KThe above output is about a redis-server with VM enable, around 1 million of keys inside, and a lot of simulated load using the redis-load utility.
As you can see from the output a number of load-in and swap-out operations are happening every second. Note that the first line reports the actual values since the server was started, while the next lines are differences compared to the previous reading.
If you assigned enough memory to hold your working set of data, probably you should see a lot less dramatic swapping happening, so redis-stat can be a really valuable tool in order to understand if you need to shop for RAM ;)Redis with VM enabled: better .rdb files or Append Only File?
When VM is enabled, saving and loading the database are much slower operations. A DB that usually loads in 2 seconds takes 13 seconds with VM enabled if the server is configured to use the smallest memory possible (that is, vm-max-memory set to 0).
So you probably want to switch to a configuration using the Append Only File for persistence, so that you can perform the BGREWRITEAOF from time to time.
It is important to note that while a BGSAVE or BGREWRITEAOF is in progress Redis does not swap new values on disk. The VM will be read-only while there is another child accessing it. So if you have a lot of writes while there is a child working, the memory usage may grow.Using as little memory as possible
An interesting setup to turn Redis into an on-disk DB with just keys in memory is setting vm-max-memory to 0. If you don't mind some latency more and poorer performances but want to use very little memory for very big values, this is a good setup.
In this setup you should first try setting the VM as blocking (vm-max-threads 0) as with this configuration and high traffic the number of swap in and swap out operations will be huge, and threading will consume a lot of resources compared to a simple blocking implementation.VM Stability
VM is still experimental code, but in the latest weeks it was tested in many ways in development environments, and even in some production environment. No bugs were noticed during this testing period. Still the more obscure bugs may happen in non controlled environments where there are setups that we are not able to reproduce for some reason.
In this stage you are encouraged to try VM in your development environment, and even in production if your DB is not mission critical, but for instance just a big persistent cache of data that may go away without too much problems.
Please report any problem you will notice to the Redis Google Group or by IRC joining the #redis IRC channel on freenode. -