Подтвердить что ты не робот

LINUX: как заблокировать страницы процесса в памяти

У меня есть сервер LINUX, который запускает процесс с большим объемом памяти (какой-то механизм базы данных). Память, выделяемая этим процессом, настолько велика, что часть ее должна быть заменена (выгружена).

Что я хотел бы сделать, так это заблокировать страницы памяти всех других процессов (или подмножества запущенных процессов) в памяти, так что только страницы процесса базы данных будут заменены. Например, я хотел бы убедиться, что я могу продолжать удаленно подключаться и отслеживать работу компьютера, не подвергая процессы, подверженные обмену. То есть Я хочу, чтобы sshd, X, top, vmstat и т.д. Имели всю память страниц.

В linux есть системные вызовы mlock(), mlockall(), которые, похоже, предлагают правильную ручку для фиксации. К сожалению, мне кажется, что мне нужно сделать явный вызов внутри каждого процесса и не может вызывать mlock() из другого процесса или из родителя (mlock() не наследуется после fork() или evecve()).

Любая помощь приветствуется. Виртуальная пицца и пиво предлагаются: -).

4b9b3361

Ответ 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