2016-05-16 6 views
0

Я выделяю память, используя «огромные страницы (размер 1 МБ)» и используя mmap. После выделения 4 ГБ памяти, mmap возвращает fail.Есть ли ограничение на память, выделенное огромными страницами?

mmap(NULL, memsize, PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS |MAP_POPULATE | MAP_HUGETLB, -1, 0); 

здесь Memsize = 1GB

Я зову выше заявление в петле. До 4 итераций это нормально. В 5-й итерации mmap не удался.

mmap(NULL, memsize, PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS |MAP_POPULATE , -1, 0); 

Вышеуказанный оператор (без огромных страниц) отлично работает для любого количества итераций. Не хватает ли какой-либо информации, связанной с огромными страницами? Я попробовал флаг «MAP_NORESERVE» также, как упоминалось в mmap fail after 4GB.

Любая информация будет принята с благодарностью. Спасибо.

+0

'mmap возвращает fail' - это не полезно – KevinDTimm

+0

Сколько доступно в вашей системе? Вы можете перечислить его с помощью 'cat/proc/meminfo | grep HugePages'. Дополнительное чтение: https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt –

+0

@KevinDTimm: я проверил возвращаемое значение (MAP_FAILED), тогда только я закончил mmap. – ANTHONY

ответ

1

Изменение выделено «количество больших страниц» в файле

/proc/sys/vm/nr_hugepages 

в зависимости от объема памяти, который вы хотите выделить. Ранее он говорит:

>cat /proc/meminfo | grep HugePages 
HugePages_Total = 2500 

4GB => он имеет 2048 * 2Mb = 4Gb

2048 огромных страниц уже потребленные.

еще один ГБ памяти (1 ГБ/2 МБ = 512) 512 больших страниц. Но 2500 - 2048 = 452 осталось только. Но вам нужно 512. Это проблема, почему mmap не удалось. Если вы редактируете содержимое вышеупомянутого файла (/ proc/sys/vm/nr_hugepages) до 2560, оно позволяет использовать 5 ГБ. Измените его в соответствии с объемом требуемой памяти. Благодаря @ Klas Lindbäck. Я ссылался на the link, небольшие исследования показали работу