pol lol
pol lol

Reputation: 281

LINUX: How to lock the pages of a process in memory

I have a LINUX server running a process with a large memory footprint (some sort of a database engine). The memory allocated by this process is so large that part of it needs to be swapped (paged) out.

What I would like to do is to lock the memory pages of all the other processes (or a subset of the running processes) in memory, so that only the pages of the database process get swapped out. For example I would like to make sure that i can continue to connect remotely and monitor the machine without having the processes impacted by swapping. I.e. I want sshd, X, top, vmstat, etc to have all pages memory resident.

On linux there are the mlock(), mlockall() system calls that seem to offer the right knob to do the pinning. Unfortunately, it seems to me that I need to make an explicit call inside every process and cannot invoke mlock() from a different process or from the parent (mlock() is not inherited after fork() or evecve()).

Any help is greatly appreciated. Virtual pizza & beer offered :-).

Upvotes: 22

Views: 14825

Answers (4)

snyh
snyh

Reputation: 1295

Nowadays, the easy and right way to tackle the problem is cgroup.

Just restrict memory usage of database process:

1. create a memory cgroup
    sudo cgcreate -g memory:$test_db -t $User:$User -a $User:$User

2. limit the group's RAM usage to 1G. 
    echo 1000M > /sys/fs/cgroup/memory/$test_db/memory.limit_in_bytes
    or 
    echo 1000M > /sys/fs/cgroup/memory/$test_db/memory.soft_limit_in_bytes

3. run the database program in the $test_db cgroup
   cgexec -g memory:$test_db $db_program_name

Upvotes: 1

timday
timday

Reputation: 24902

Actually locking the pages of most of the stuff on your system seems a bit crude/drastic, not to mention being such an abuse of the mechanism it seems bound to cause some other unanticipated problems.

Ideally, what you probably actually want is to control the "swappiness" of groups of processes so the database is first in line to be swapped while essential system admin tools are the last, and there is a way of doing this.

Upvotes: 7

Zan Lynx
Zan Lynx

Reputation: 54325

While searching for mlockall information I ran across this tool. You may be able to find it for your distribution. I only found the man page.

http://linux.die.net/man/8/memlockd

Upvotes: 3

Zan Lynx
Zan Lynx

Reputation: 54325

It has been a while since I've done this so I may have missed a few steps.

Make a GDB command file that contains something like this:

call mlockall(3)
detach

Then on the command line, find the PID of the process you want to mlock. Type:
gdb --pid [PID] --batch -x [command file]

If you get fancy with pgrep that could be:
gdb --pid $(pgrep sshd) --batch -x [command file]

Upvotes: 15

Related Questions