MarkLogic performs best if swap space is not used. There are other knowledge base articles that discuss sizing recommendations when configuring your MarkLogic Server. This article discusses the Linux
swappiness setting that can limit the amount of swap activity in the event that swap space is required.
Beginning with kernel version 3.5 (RHEL7) and 2.6.32-303 (RHEL 6.4), MarkLogic suggests setting
vm.swappiness to '1', and our recommendation is for it to be set to a value no greater than 10. With older Linux kernel versions,
vm.swappiness can be set to zero, but we do not recommend setting swappiness to 0 on newer kernels.
You can check the
swappiness setting on your Linux servers with the following command:
sysctl -a | grep swapp
If it doesn't exist already, add
vm.swappiness=1 to the
/etc/sysctl.conf file and execute the following command to apply this change:
sudo sysctl -f
Depending on kernel version, the default Linux value for
swappiness is 40-60. This is good for a desktop system that run a variety of applications but has a very small amount of memory. The default setting is not good for a server system that wants to run a single dedicated process – such as MarkLogic Server.
A warning on swappiness
The behaviour of
swappiness on newer Linux kernels has changed. On kernels for Linux greater than 3.5 and 2.6.32-303, setting
swappiness to 0 will more aggressively avoid swapping, which increases the risk of out-of-memory (OOM) killing under strong memory and I/O pressure. To achieve the same behavior of
swappiness as previous versions in which the recommendation was to set
swappiness to 0, set
swappiness to the value of 1. We do not recommend setting swappiness to 0 on newer kernels.
While you are making changes, the following kernels settings will also help
vm.dirty_background_ratio is the percentage of system memory that can be filled with “dirty” pages — memory pages that still need to be written to disk — before the pdflush/flush/kdmflush background processes kick in to write it to disk. We suggest setting it to 1%, so if your virtual server has 64 GB of memory that’s ~2/3 GB of data that can be sitting in RAM before something is done.
vm.dirty_ratio is the absolute maximum amount of system memory that can be filled with dirty pages before everything must get committed to disk. When the system gets to this point all new I/O blocks until dirty pages have been written to disk. This is often the source of long I/O pauses, but is a safeguard against too much data being cached unsafely in memory.
When the computer runs out of memory, it has to kick out some memory. At that moment, it has 2 choices:
1) Kick out mmap’ed files. This is cheaper if the file is mmaped, as in read-only (for example, MarkLogic range indexes are read only)
2) Kick out anon memory.
If swappiness is large, Linux would prefer #2 over #1. If
swappiness is small, Linux would prefer #1 over #2.