LINUX: как заблокировать страницы процесса в памяти
У меня есть сервер LINUX, который запускает процесс с большим объемом памяти (какой-то механизм базы данных). Память, выделяемая этим процессом, настолько велика, что часть ее должна быть заменена (выгружена).
Что я хотел бы сделать, так это заблокировать страницы памяти всех других процессов (или подмножества запущенных процессов) в памяти, так что только страницы процесса базы данных будут заменены. Например, я хотел бы убедиться, что я могу продолжать удаленно подключаться и отслеживать работу компьютера, не подвергая процессы, подверженные обмену. То есть Я хочу, чтобы sshd, X, top, vmstat и т.д. Имели всю память страниц.
В linux есть системные вызовы mlock(), mlockall(), которые, похоже, предлагают правильную ручку для фиксации. К сожалению, мне кажется, что мне нужно сделать явный вызов внутри каждого процесса и не может вызывать mlock() из другого процесса или из родителя (mlock() не наследуется после fork() или evecve()).
Любая помощь приветствуется. Виртуальная пицца и пиво предлагаются: -).
Ответы
Ответ 1
Прошло некоторое время с тех пор, как я сделал это, поэтому я, возможно, пропустил несколько шагов.
Создайте командный файл GDB, содержащий следующее:
call mlockall(3)
detach
Затем в командной строке найдите PID процесса, который вы хотите использовать. Тип:
gdb --pid [PID] --batch -x [command file]
Если вам нравится pgrep
, это может быть:
gdb --pid $(pgrep sshd) --batch -x [command file]
Ответ 2
Фактически блокировка страниц большинства материалов в вашей системе кажется немного грубой/резкой, не говоря уже о том, что это злоупотребление механизмом, похоже, связано с некоторыми другими непредвиденными проблемами.
В идеале, вы, вероятно, действительно хотите контролировать "swappiness" групп процессов, чтобы база данных сначала была заменена, а основные системные административные инструменты - последними, а есть способ сделать это.
Ответ 3
При поиске mlockall
информации я наткнулся на это средство. Вы можете найти его для своего распространения. Я нашел справочную страницу.
http://linux.die.net/man/8/memlockd
Ответ 4
В настоящее время простым и правильным способом решения проблемы является cgroup.
Просто ограничьте использование памяти процессом базы данных:
1. create a memory cgroup
sudo cgcreate -g memory:$test_db -t $User:$User -a $User:$User
2. limit the group 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