【问题标题】:error setting nr_hugepages via SYSFS通过 SYSFS 设置 nr_hugepages 时出错
【发布时间】:2014-10-15 14:51:04
【问题描述】:

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

同样减少页数失败。我做错了什么?

【问题讨论】:

    标签: memory-management linux-kernel huge-pages


    【解决方案1】:

    我想我已经找到了这种行为的原因。 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。

    【讨论】:

    • 是的,对于 2M 页面,我没有看到此错误。对于1G,我愿意。所以,同意。
    【解决方案2】:

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

    首先它需要挂载hugetlbfs 以使传统的hugepages 工作。

    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
    

    【讨论】:

    • 我以 root 权限运行所有命令,基本上我做了与您描述的相同的配置集。使用 sysctl 设置 vm.nr_hughpages 失败(设置键“vm.nr_hugepages”:参数无效)。我能够设置的最大hugepages 是5,虽然我将hugepages=6 配置为内核参数,但我认为内核不允许并将其设置为5。
    • 对了,接口/proc/sys/vm/nr_hugepages和/sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages有什么区别?他们似乎调整了相同的参数?
    • @Mark 您配置的大页面的大小是多少?系统日志中的错误是什么?您是否尝试重新启动系统正在设置 nr_hugepages,也许您的系统没有足够的可用内存?
    • 两者都是伪文件系统,/proc/ - 用于导出进程信息,而 /sys 用于导出有关设备、驱动程序和其他子系统的信息。阅读link
    • 我已经编辑了我的原始帖子并提供了更多详细信息。请检查它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 2020-11-07
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多