Memory management 通过SYSFS设置nr_hugepages时出错

Memory management 通过SYSFS设置nr_hugepages时出错,memory-management,linux-kernel,huge-pages,Memory Management,Linux Kernel,Huge Pages,我有8G物理内存Fedora20,并配置了内核参数,通过将以下参数传递给内核,在启动时分配两个1G hugepages: default_hugepagesz=1G hugepagesz=1G hugepages=2 HugeTLBFS是自动安装的: % mount | grep ^huge hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime) % 重新启动后,一切看起来都很好,我看到内核已经分配了所需的页面: % dmesg |

我有8G物理内存Fedora20,并配置了内核参数,通过将以下参数传递给内核,在启动时分配两个1G hugepages:

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
%
正如您所看到的,可用内存量应该允许我增加hugepages的数量,但是我没有这样做:

% echo 3 > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
-bash: echo: write error: Invalid argument


同时减少失败的页面数。我做错了什么?

看起来您可能需要超级用户权限才能执行该命令。或者,如果您想在系统上持续进行更改,可以尝试以下步骤

首先需要安装hugetlbfs,传统的hugepages才能工作

mkdir /hugetlbfs
mount -t hugetlbfs none /hugetlbfs
注:IA-64支持4KB、2MiB和4MB页面 注意:x86_64支持-4KB、2MiB、4MB或1GiB页面

接下来,根据您的需求,编辑
/etc/sysctl.conf
文件,并在nr_hugepages中指定hugepages的数量:

vm.nr_hughpages=2
现在运行命令sysctl-p使配置更改生效。注意:如果您对大页面数量的要求很大,并且没有连续可用的空闲块,则建议在进行上述更改后重新启动系统

要检查是否已分配了hugepages的数量,请使用
cat/proc/meminfo | grep-ground

HugePages_Total:    2
HugePages_Free:     2
HugePages_Rsvd:     0
Hugepagesize:       2048 kB

我想我已经找到了这种行为的原因。“hugepagesz=”parameter in的内核文档中说,“1GB页面只能在启动时使用hugepages=进行分配,之后不能释放”我想这就是我不能减少页面数量的原因

此外,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。

我以root权限运行所有命令,基本上我执行了与您描述的相同的配置集。使用sysctl设置vm.nr_页面失败(设置键“vm.nr_hugepages”:参数无效)。我能够设置的最大hugepages是5,虽然我将hugepages=6配置为内核参数,但我认为内核不允许并将其设置为5。顺便问一下,接口/proc/sys/vm/nr_hugepages和/sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages之间的区别是什么?他们似乎调整了相同的参数?@标记您配置的hugepages的大小?系统日志中的错误是什么?您是否尝试重新启动系统?如果正在设置nr_hugepages,可能您的系统没有足够的可用内存?这两个系统都是伪文件系统,/proc/-用于导出进程信息,而/sys用于导出设备、驱动程序和其他子系统的信息。阅读我已经编辑了我的原始帖子并提供了更多细节。请检查它。是的,对于200万页,我没有看到这个错误。对于1G,我有。所以,同意。
#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;
  ...
}