6.1. How to avoid "mmap Cannot allocate memory" error?

6.1.1. Short answer

Increase vm.max_map_count Linux kernel parameter value.

6.1.2. Long answer

There is a case following mmap error in log file:

2013-06-04 08:19:34.835218|A|4e86e700|mmap(4194304,551,432017408)=Cannot allocate memory <13036498944>

Note that <13036498944> means total size of mmap (almost 12GB) in this case.

So you need to confirm following point of views.

  • Are there enough free memory?
  • Are maximum number of mappings exceeded?

To check there are enough free memory, you can use vmstat command.

To check whether maximum number of mappings are exceeded, you can investigate the value of vm.max_map_count.

If this issue is fixed by modifying the value of vm.max_map_count, it's exactly the reason.

As Groonga allocates memory chunks each 256KB, you can estimate the size of database you can handle by following formula:

(database size) = vm.max_map_count * (memory chunks)

If you want to handle over 16GB Groonga database, you must specify at least 65536 as the value of vm.max_map_count:

database size (16GB) = vm.max_map_count (65536) * memory chunks (256KB)

You can modify vm.max_map_count temporary by sudo sysctl -w vm.max_map_count=65536.

Then save the configuration value to /etc/sysctl.conf or /etc/sysctl.d/*.conf.