Summary
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.
Details
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.
Other Settings
While you are making changes, the following kernels settings will also help
vm.dirty_background_ratio=1
vm.dirty_ratio=40
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.
Swappiness explained
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.
Additional Reading
Knowledgebase: Swap Space Requirements
Knowledgebase: Memory Consumption Logging and Status
Knowledgebase: RAMblings - Opinions on Scaling Memory in MarkLogic Server