2009-07-27 2 views
3

Я работаю над приложением на C++, которое требует большого объема памяти для пакетного запуска. (> 20gb)Что происходит, когда у вас заканчивается баран с mlockall set?

Некоторые из моих клиентов работают с ограничениями памяти, где иногда ОС начинает заменять, а общее время работы удваивается или ухудшается.

Я прочитал, что я могу использовать mlockall, чтобы процесс не был заменен. Что произойдет, когда требования к памяти процесса достигнут или превысят доступную физическую память таким образом?

Я думаю, что ответ может быть специфичным для ОС, поэтому, пожалуйста, перечислите ОС в своем ответе.

+0

Erm,> 20GB звучит как много. Что такое ОС ..? Вы используете 64-битную ОС, не так ли? – Sean

+0

Вместо того, чтобы мы перечисляли ОС, почему бы вам не сказать, какие из них вас интересуют? UNIX, VMS, Linux, Windows, некоторые встроенные материалы? – 2009-07-27 21:06:54

+0

Я предполагаю, что вы спрашиваете о блокировании будущих страниц, а не текущих страниц. – jrockway

ответ

0

Я пробовал это на Linux. После того, как я превышу свой «ulimit -l» (максимальные заблокированные страницы), malloc выходит из строя.

Вот тестовый скрипт:

#include <sys/mman.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char **argv){ 
    int r = 0; 
    int count = 0; 
    char *buf; 

    printf("Locking...\n"); 
    r = mlockall(MCL_FUTURE); 
    if(r){ 
    printf("Error: %d\n", r); 
    exit(1); 
    } 

    while(1){ 
    buf = malloc(1000); 
    if(!buf){ 
     printf("Failed to allocate after %d iterations\n", count); 
     exit(0); 
    } 
    count++; 
    } 

    return 0; 
} 

(Я уже говорил, я не программист C?)

документы говорят, что такое поведение «зависит от реализации». Поэтому вам, вероятно, придется протестировать свою собственную реализацию, чтобы узнать, что произойдет. Я запустил свой скрипт, выполнив команду root, установив зашифрованную страницу ulimit на 10000, выполнив обычный пользователь из этой оболочки, а затем запустив скрипт. Я сделал 10057 ассигнований до того, как malloc не удался; и много больше, чем без вызова mlockall.

2

Что произойдет, это то, что вы видите - неспособность выделить больше памяти, поскольку ваше приложение приобрело всю физическую память в системе, и поскольку они не могут быть заменены, для malloc нет ничего, кроме как выполнить сбой , Такое поведение будет одинаковым для большинства современных операционных систем.

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

+0

не должен? не зависит от наших потребностей – nischayn22

0

Что происходит в этой ситуации, так это то, что ресурсы вашей системы превышают ваши требования. Вам необходимо переконфигурировать вашу систему, чтобы она требовала меньше памяти.

Зачем вам 20 ГБ оперативной памяти? Это очень необычно. У меня есть некоторые рабочие места, которые являются большими. Обычно вы можете разбить их на несколько меньших заданий и запускать их последовательно или одновременно на нескольких машинах.

Если вам действительно нужно запустить все 20 ГБ одновременно, вы можете взглянуть на то, чтобы сделать небольшой набор данных меньшим, чтобы его можно было вместить в кэш L2. Это может дать вам существенные улучшения.

Каков процесс, который занимает 20 ГБ оперативной памяти? Это ваша собственная программа или что-то вроде MySQL? На каком языке он написан? Я смог взять программу на python, которая взяла 4 ГБ оперативной памяти и спрятала ее в 500 МБ ОЗУ, используя упрощенную реализацию на C++.

Смежные вопросы