Ошибка установки 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
Другие вопросы по тегам