Ошибка установки nr_hugepages через SYSFS
У меня 8G физической памяти, Fedora20 и настроенные параметры ядра для выделения двух огромных страниц 1G во время загрузки путем передачи следующих параметров ядру:
default_hugepagesz=1G hugepagesz=1G hugepages=2
HugeTLBFS автоматически монтируется:
% mount | grep ^huge
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime)
%
После перезагрузки все выглядит хорошо, и я вижу, что ядро выделило необходимые страницы:
% dmesg | grep HugeTLB
HugeTLB registered 1 GB page size, pre-allocated 2 pages
% grep -E ^"(Mem|Huge)" /proc/meminfo
MemTotal: 8137732 kB
MemFree: 5359672 kB
MemAvailable: 5707656 kB
HugePages_Total: 2
HugePages_Free: 2
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 1048576 kB
%
Как видите, объем свободной памяти должен позволить мне увеличить количество огромных страниц, однако я не могу этого сделать:
% echo 3 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
-bash: echo: write error: Invalid argument
или же
% echo 3 > /proc/sys/vm/nr_hugepages
-bash: echo: write error: Invalid argument
%
Также не удается уменьшить количество страниц. Что я делаю неправильно?
2 ответа
Я думаю, что нашел причину этого поведения. В документации к ядру для параметра "принцпура" в https://www.kernel.org/doc/Documentation/kernel-parameters.txt говорится, что "страницы объемом 1 Гбайт могут быть выделены только во время загрузки с использованием огромный экран = и впоследствии не освобождены". думаю, поэтому я не могу уменьшить количество страниц.
Кроме того, код в mm / hugetlb.c не разрешает эту операцию:
#if defined(CONFIG_CMA) && defined(CONFIG_X86_64)
...
static inline bool gigantic_page_supported(void) { return true; }
#else
static inline bool gigantic_page_supported(void) { return false; }
...
#endif
...
static int hugetlb_sysctl_handler_common(...)
{
...
if (write && hstate_is_gigantic(h) && !gigantic_page_supported())
return -EINVAL;
...
}
Таким образом, пока CONFIG_CMA не определен (и в конфигурации ядра по умолчанию, поставляемой с Fedora 20, эта опция отключена), ядро всегда будет возвращать EINVAL.
Похоже, вам могут потребоваться права суперпользователя для команды. В качестве альтернативы, вы можете попробовать следующий шаг, если вы хотите сделать изменения в вашей системе постоянными.
Во-первых, необходимо установить hugetlbfs для работы с традиционными огромными страницами.
mkdir /hugetlbfs
mount -t hugetlbfs none /hugetlbfs
Примечание: IA-64 поддерживает - страницы 4 КБ, 2 МБ и 4 МБ Примечание: x86_64 поддерживает - страницы 4 КБ, 2 МБ, 4 МБ или 1 ГБ
Далее, в зависимости от ваших требований, отредактируйте /etc/sysctl.conf
файл и укажите количество огромных страниц в nr_hugepages:
vm.nr_hughpages=2
Теперь запустите команду sysctl -p
чтобы изменения конфигурации вступили в силу. Примечание: если вы требуете большого количества огромных страниц, и нет свободных смежных блоков, рекомендуется перезагрузить систему после указанных выше изменений.
Чтобы проверить, было ли выделено количество огромных страниц, используйте cat /proc/meminfo | grep Huge
HugePages_Total: 2
HugePages_Free: 2
HugePages_Rsvd: 0
Hugepagesize: 2048 kB