LINUX:如何将进程锁定在内存中的页面(LINUX: How to lock the pages

2019-07-31 18:32发布

我有运行的进程具有大容量内存(某种数据库引擎)的Linux服务器。 通过这种方法分配的内存是如此之大,它的一部分需要被交换(寻呼)进行。

我想这样做是为了锁定所有其他进程的内存中的内存页(或正在运行的进程的一个子集),因此只有数据库进程的页面换出。 例如,我想确保我能继续远程连接和监控设备,而无需通过交换影响的过程。 即我想要的sshd,X,顶部,vmstat的,等把所有页面驻留在内存中。

在Linux上有m锁()mlockall用于()系统调用,似乎提供正确的旋钮做牵制。 不幸的是,在我看来,我需要让每一个进程内的显式调用,并且不能从一个不同的进程或从父调用m锁()(m锁()叉后不会被继承()或evecve())。

任何帮助是极大的赞赏。 虚拟比萨饼和啤酒:-)提供。

Answer 1:

它已经有一段时间,因为我已经做到了这一点,所以我可能已经错过了几步。

使包含这样的一个GDB命令文件:

call mlockall(3)
detach

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

如果你看中与pgrep可能是:
gdb --pid $(pgrep sshd) --batch -x [command file]



Answer 2:

其实锁定的大多数系统上的东西的网页似乎有点粗/激烈,更何况是似乎势必会造成其他一些无法预料的问题机制的这种滥用。

理想情况下,你可能真正想要的是控制过程组“swappiness”所以数据库是第一次在网上进行交换,而重要的系统管理工具是最后一个, 有这样的一种方式 。



Answer 3:

当搜索mlockall信息我碰到这个工具跑了。 您可能能够找到它的分布。 我才发现,该男子页。

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



Answer 4:

如今,简单的和正确的方式来解决这个问题是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


文章来源: LINUX: How to lock the pages of a process in memory
标签: linux swap