我有一个LINUX服务器运行一个占用大量内存的进程(某种数据库引擎)。此进程分配的内存非常大,需要交换(分页)部分内存。
我想要做的是将所有其他进程(或正在运行的进程的子集)的内存页锁定在内存中,以便只交换数据库进程的页面。例如,我想确保我可以继续远程连接并监控机器,而不会受到交换影响的过程。即我想要sshd,X,top,vmstat等让所有页面内存驻留。
在linux上有mlock(),mlockall()系统调用,似乎提供了正确的旋钮来进行固定。不幸的是,在我看来,我需要在每个进程中进行显式调用,并且不能从不同的进程或父进程调用mlock()(mlock()不会在fork()或evecve()之后继承。) p>
非常感谢任何帮助。虚拟披萨&啤酒提供: - )。
答案 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
信息时,我遇到了这个工具。您可以找到它以供您分发。我只找到了手册页。
答案 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