LINUX:如何在内存中锁定进程的页面

时间:2012-09-20 20:33:17

标签: linux swap

我有一个LINUX服务器运行一个占用大量内存的进程(某种数据库引擎)。此进程分配的内存非常大,需要交换(分页)部分内存。

我想要做的是将所有其他进程(或正在运行的进程的子集)的内存页锁定在内存中,以便只交换数据库进程的页面。例如,我想确保我可以继续远程连接并监控机器,而不会受到交换影响的过程。即我想要sshd,X,top,vmstat等让所有页面内存驻留。

在linux上有mlock(),mlockall()系统调用,似乎提供了正确的旋钮来进行固定。不幸的是,在我看来,我需要在每个进程中进行显式调用,并且不能从不同的进程或父进程调用mlock()(mlock()不会在fork()或evecve()之后继承。) p>

非常感谢任何帮助。虚拟披萨&啤酒提供: - )。

3 个答案:

答案 0 :(得分:12)

我已经做了一段时间,所以我可能错过了几步。

创建一个包含以下内容的GDB命令文件:

call mlockall(3)
detach

然后在命令行中,找到要进行mlock的进程的PID。类型:
 gdb --pid [PID] --batch -x [command file]

如果你对pgrep感兴趣,那可能是:
 gdb --pid $(pgrep sshd) --batch -x [command file]

答案 1 :(得分:2)

在搜索mlockall信息时,我遇到了这个工具。您可以找到它以供您分发。我只找到了手册页。

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

答案 2 :(得分:1)

如今,解决问题的简单方法是cgroup。

仅限制数据库进程的内存使用情况:

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