3

我有 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
%

也减少页数失败。我究竟做错了什么?

4

2 回答 2

4

我想我已经找到了这种行为的原因。https://www.kernel.org/doc/Documentation/kernel-parameters.txt中“hugepagesz=”参数的内核文档说“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。

于 2014-10-17T20:55:24.290 回答
1

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

首先,它需要安装hugetlbfs 才能使传统的大页面正常工作。

mkdir /hugetlbfs
mount -t hugetlbfs none /hugetlbfs

注意:IA-64 支持 - 4KiB、2MiB 和 4MiB 页面 注意:x86_64 支持 - 4KiB、2MiB、4MiB 或 1GiB 页面

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

vm.nr_hughpages=2

现在运行命令sysctl -p以使配置更改生效。注意:如果你的huge page数量要求很大,并且没有连续的空闲块可用,那么建议在进行上述更改后重新启动系统。

要检查是否已分配大页数,请使用cat /proc/meminfo | grep Huge

HugePages_Total:    2
HugePages_Free:     2
HugePages_Rsvd:     0
Hugepagesize:       2048 kB
于 2014-10-16T03:05:02.950 回答