AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 686726
Accepted
Alex Baranowski
Alex Baranowski
Asked: 2022-01-18 07:41:24 +0800 CST2022-01-18 07:41:24 +0800 CST 2022-01-18 07:41:24 +0800 CST

交换文件的最大数量 - 内核文档错误?

  • 772

我正在写一篇关于交换文件的文章。我决定检查我可以创建和使用多少个交换文件。根据man 2 swapon,我知道它应该是 29 - https://man7.org/linux/man-pages/man2/swapon.2.html。grep CONFIG_MIGRATION /boot/config-$(uname -r)我用和检查了我的内核配置选项grep CONFIG_MEMORY_FAILURE /boot/config-$(uname -r)。但是当我写了一个简单的脚本来检查时:

for i in {1..33}; do 
    SWAP_FILE="/swapfile-$i"
    sudo dd if=/dev/zero of=$SWAP_FILE bs=1M count=10
    sudo chmod 600 $SWAP_FILE
    sudo mkswap $SWAP_FILE
    sudo swapon $SWAP_FILE
done

我只能激活其中的 27 个。

[root@localhost ~]# swapon
NAME         TYPE SIZE USED PRIO
/swapfile-1  file  10M   0B   -2
(...)
/swapfile-27 file  10M   0B  -28

这意味着文档中可能缺少某些内容。

我正在使用 EuroLinux 8(只是另一个 RHEL 8 克隆)。但我也在 Fedora 上尝试过,结果相同。我试图通过查看 swap.h 内核文件(https://github.com/torvalds/linux/blob/master/include/linux/swap.h)来了解为什么会发生这种情况,但这让我更加困惑是:

#ifdef CONFIG_DEVICE_PRIVATE
#define SWP_DEVICE_NUM 4
#define SWP_DEVICE_WRITE (MAX_SWAPFILES+SWP_HWPOISON_NUM+SWP_MIGRATION_NUM)
#define SWP_DEVICE_READ (MAX_SWAPFILES+SWP_HWPOISON_NUM+SWP_MIGRATION_NUM+1)
#define SWP_DEVICE_EXCLUSIVE_WRITE (MAX_SWAPFILES+SWP_HWPOISON_NUM+SWP_MIGRATION_NUM+2)
#define SWP_DEVICE_EXCLUSIVE_READ (MAX_SWAPFILES+SWP_HWPOISON_NUM+SWP_MIGRATION_NUM+3)
#else
#define SWP_DEVICE_NUM 0
#endif
#ifdef CONFIG_MIGRATION
#define SWP_MIGRATION_NUM 2
#define SWP_MIGRATION_READ  (MAX_SWAPFILES + SWP_HWPOISON_NUM)
#define SWP_MIGRATION_WRITE (MAX_SWAPFILES + SWP_HWPOISON_NUM + 1)
#else
#define SWP_MIGRATION_NUM 0
#endif
#ifdef CONFIG_MEMORY_FAILURE
#define SWP_HWPOISON_NUM 1
#define SWP_HWPOISON        MAX_SWAPFILES
#else
#define SWP_HWPOISON_NUM 0
#endif

#define MAX_SWAPFILES \
    ((1 << MAX_SWAPFILES_SHIFT) - SWP_DEVICE_NUM - \
    SWP_MIGRATION_NUM - SWP_HWPOISON_NUM)
  • (1<< SWAPFILES_SHIFT) = 32 (SWAPFILES_SHIFT=5)
  • SWP_DEVICE_NUM 为 4 或 0
  • SWP_MIGRATION 为 2 或 0
  • SWP_HWPISON_NUM 为 1 或 0

32 - X = 27 仅在使用 SWP_DEVICE_NUM 和 SWP_HWPISON_NUM 时添加。与此同时,theman 2 swapon说:

Since kernel 2.6.18, the  limit  is  decreased  by  2
       (thus:  30)  if  the  kernel is built with the CONFIG_MIGRATION

并且配置设置为是。

[root@fedora ~]# grep CONFIG_MIGRATION /boot/config-$(uname -r)
CONFIG_MIGRATION=y
[root@fedora ~]# grep CONFIG_MEMORY_FAILURE  /boot/config-$(uname -r)
CONFIG_MEMORY_FAILURE=y

任何有助于理解为什么只有 27 个交换可用的帮助表示赞赏。

rhel kernel
  • 1 1 个回答
  • 73 Views

1 个回答

  • Voted
  1. Best Answer
    MC68020
    2022-01-18T12:52:47+08:002022-01-18T12:52:47+08:00

    文档绝对没有问题。

    您的误解仅仅是因为您的演算基于swap.h从 Linus 的 git 中找到的定义,即swap.h与master 分支相关,换句话说,现在早于5.17-rc-1

    在 RHEL 8 下进行实验时,AFAIK 基于 Linux- 4.18

    如果我们仍然可以阅读相同的公式,那么在4.18.20 的 swap.h 中:

    #define MAX_SWAPFILES \
        ((1 << MAX_SWAPFILES_SHIFT) - SWP_DEVICE_NUM - \
        SWP_MIGRATION_NUM - SWP_HWPOISON_NUM)
    

    SWP_MIGRATION_NUM然而,它采取了不同的价值:

    #define SWP_MIGRATION_NUM 2
    

    2 而不是 4。

    考虑到您的配置设置,将此值应用于公式会给出:

    MAX_SWAPFILES = 32 - 2 - 2 - 1 = 27

    证明你的实验结果和文档。

    • 1

相关问题

  • Linux Mint 内核损坏

  • Linux 内核开发人员如何处理数百万行代码的工作?他们是一种方法吗?[关闭]

  • 通过标签将根文件系统传递给linux内核

  • 以 root 用户身份访问文件系统

  • 在 Gnome3 中禁用窗口的自动最大化

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve