【发布时间】:2012-09-20 20:33:16
【问题描述】:
我有一个 LINUX 服务器运行一个占用大量内存的进程(某种数据库引擎)。此进程分配的内存非常大,需要将其中的一部分换出(分页)。
我想做的是将所有其他进程(或正在运行的进程的子集)的内存页面锁定在内存中,以便只有数据库进程的页面被换出。例如,我想确保我可以继续远程连接并监控机器,而不会受到交换的影响。 IE。我希望 sshd、X、top、vmstat 等所有页面都驻留在内存中。
在 linux 上有 mlock()、mlockall() 系统调用,它们似乎提供了正确的旋钮来进行固定。不幸的是,在我看来,我需要在每个进程中进行显式调用,并且不能从不同的进程或父进程调用 mlock()(mlock() 不是在 fork() 或 evecve() 之后继承的)。
非常感谢任何帮助。提供虚拟披萨和啤酒 :-)。
【问题讨论】:
-
mlockall(2) 是一个非常非常非常糟糕的主意。 1.您需要对所有其他进程执行 munlockall 否则风险是OOM(但如果进程本身调用了mlockall,您不应该这样做)
-
2.其他进程的数量是不同的。 3. 一些特殊的进程不能ptrace,否则会微妙地改变原程序的行为 -------------- 只需简单地使用cgroup来控制你的数据库RAM使用,或者使用systemd来管理它.