Systemd-swap: 抱歉,小于 -1 的交换优先级只能由内核自己分配

创建于 2020-06-14  ·  31评论  ·  资料来源: Nefelim4ag/systemd-swap

它似乎是由 52a468aeea9e00f3f1763e96a05adbe48b0a644d 引起的,但我没有平分。 可能是由最近的安全更改引起的吗?

/run/systemd/system/var-lib-systemd\x2dswap-swapfc-1.swap:11: Sorry, swap priorities smaller than -1 may only be assigned by the kernel itself, ignoring: -2

最有用的评论

啊哈,别介意。 我可以重现这个,它不是由 systemd-swap 而是由 systemd 记录的

所有31条评论

你能说出你的 linux 版本(如果 arch 是 zen 还是普通的)、发行版和文件系统?

(这不会发生在运行 arch zen 5.7 和 f2fs 的我身上)

ArchLinux 5.7.2 带有 zen 修改和 ext4。

是否创建了交换文件? (也就是说,这只是一个警告吗?)

我重新启动了:/ 有没有办法将 ram 快速填充到特定百分比以触发交换?

您可以使用stress-ng stress-ng --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.90;}' < /proc/meminfo)k --vm-keep -m 1 (最多分配90% 的内存)。

解决此问题的另一种方法是设置swapfc_priority=100/etc/systemd/swap.conf.d/overrides.conf某些内容

好吧,还是可以重现的。
仍会创建交换文件。
即使我想我可以通过分配 > -1 来修复它,这个警告是否正常? 如果是这种情况,那么使用这个默认值是没有意义的,而是使用 0 我猜。

在使用stress-ng进行测试时,我注意到的一些奇怪之处在于,当我使用* 0.50 ,确实创建了我配置的 1GB 交换块,但是当我将其更改为* 0.90不再添加交换块尽管有 700MB 可用内存。

我的配置:

swapfc_enabled=1
swapfc_force_use_loop=0          # Force usage of swapfile + loop
swapfc_frequency=1               # How often to check free swap space in seconds
swapfc_chunk_size=1G           # Size of swap chunk
swapfc_max_count=32              # Note: 32 is a kernel maximum
swapfc_min_count=0               # Minimum amount of chunks to preallocate
swapfc_free_swap_perc=25         # Add new chunk if free < 15%
swapfc_remove_free_swap_perc=55  # Remove chunk if free > 55% && chunk count > 2

zswap_enabled=1
zswap_compressor=zstd     # lzo lz4 zstd lzo-rle lz4hc
zswap_max_pool_percent=25 # 1-99
zswap_zpool=z3fold        # zbud z3fold (note z3fold requires kernel 4.8+)

第二个交换文件仅在第一个交换文件内存不足时创建

喔好吧。 为什么它不交换呢? 我只看到使用了 32MB。

您将不得不向 Linus Torvalds 询问那个 ^^,简而言之,仅当需要更多内存时才使用交换,因此如果没有应用程序要求更多内存,您将不会看到正在使用交换。
您可以自己调整交换参数(swappiness 等),但请注意 systemd-swap 的默认值已针对默认设置进行了调整。

啊,我明白了,谢谢你的好解释:+1:
我们如何处理最初的“问题”?

我会看看自己在虚拟机中重现它,如果我们可以消除警告(在我们的 swapon 命令中使用2>/dev/null )。 由于这只会产生警告,因此我不会立即将其排队等待新版本,但我会将其与其他修复/更新捆绑在一起。

所以警告是错误的,我们可以用 -2 创建交换?

我做了cat /proc/swaps并且它似乎说它确实有 -2 优先级:

Filename                Type        Size    Used    Priority
/var/lib/systemd-swap/swapfc/1          file        1048572 33024   -2

所以也许这是一个上游错误并且需要报告?

呃,内核说只有它可以创建低于 -1 的优先级,这似乎是真的(根据我读过的文档),它更像是 f2fs 的一个错误或其他东西,所以我不能看到那个警告....
systemd-swap 默认为-2的原因是它一直是这样配置的,我不想破坏人们的设置。

好的,我明白了,谢谢。 我会让它打开,直到你可以复制和静音我猜。

无法在 Fedora 和 Arch 上复制。 你能提供更多信息吗?

仍然可以使用您的最新提交进行重现。
您还需要哪些其他信息?

我不知道,但如果不能复制,我就无法真正诊断。 由于这只是您报告的,我觉得您那边可能有什么原因导致了这种情况。

  • 我的 swapfc 路径是/var/lib/systemd-swap/swapfc/
  • 驱动器的挂载选项: rw,noatime,lazytime
  • 系统 245.6

我当前的 systemd-swap 配置:

################################################################################
# Defaults are optimized for general usage
################################################################################

################################################################################
# You can override any settings with files in:
# /etc/systemd/swap.conf.d/*.conf
################################################################################

################################################################################
# Zswap
#
# Kernel >= 3.11
# Zswap create compress cache between swap and memory to reduce IO
# https://www.kernel.org/doc/Documentation/vm/zswap.txt

zswap_enabled=1
zswap_compressor=zstd     # lzo lz4 zstd lzo-rle lz4hc
zswap_max_pool_percent=25 # 1-99
zswap_zpool=z3fold        # zbud z3fold (note z3fold requires kernel 4.8+)

################################################################################
# ZRam
#
# Kernel >= 3.15
# Zram compression streams count for additional information see:
# https://www.kernel.org/doc/Documentation/blockdev/zram.txt

zram_enabled=0
zram_size=$(( RAM_SIZE / 4 ))    # This is 1/4 of ram size by default.
zram_count=${NCPU}               # Device count
zram_streams=${NCPU}             # Compress streams
zram_alg=zstd                    # See $zswap_compressor
zram_prio=32767                  # 1 - 32767

################################################################################
# Swap File Chunked
# Allocate swap files dynamically
# For btrfs fallback to swapfile + loop will be used
# ex. Min swap size 256M, Max 32*256M
swapfc_enabled=1
swapfc_force_use_loop=0          # Force usage of swapfile + loop
swapfc_frequency=1               # How often to check free swap space in seconds
swapfc_chunk_size=1G           # Size of swap chunk
swapfc_max_count=32              # Note: 32 is a kernel maximum
swapfc_min_count=0               # Minimum amount of chunks to preallocate
swapfc_free_swap_perc=25         # Add new chunk if free < 15%
swapfc_remove_free_swap_perc=55  # Remove chunk if free > 55% && chunk count > 2
swapfc_priority=0               # Priority of swapfiles (decreasing by one for each swapfile). Jumps from 0 to -2.
swapfc_path=/var/lib/systemd-swap/swapfc/
# Only for swapfile + loop
swapfc_nocow=1              # Disable CoW on swapfile
swapfc_directio=1           # Use directio for loop dev
swapfc_force_preallocated=0 # Will preallocate created files

################################################################################
# Swap devices
# Find and auto swapon all available swap devices
swapd_auto_swapon=1
swapd_prio=1024

啊哈,别介意。 我可以重现这个,它不是由 systemd-swap 而是由 systemd 记录的

有解决方案吗? - 在 Manjaro 测试分支上得到这个
6 月 25 日 10:20:55 工作站 systemd[1]:/run/systemd/system/var-lib-systemd\x2dswap-swapfc-1。 swap:11 :抱歉,小于 -1 的交换优先级只能由内核自己分配,忽略:-2
6 月 25 日 10:20:56 工作站 systemd[1]:无法激活交换交换文件。

在 systemd 245.6-3 上没问题

有解决方案吗? - 在 Manjaro 测试分支上得到这个
6 月 25 日 10:20:55 工作站 systemd[1]:/run/systemd/system/var-lib-systemd\x2dswap-swapfc-1。 swap:11 :抱歉,小于 -1 的交换优先级只能由内核自己分配,忽略:-2
6 月 25 日 10:20:56 工作站 systemd[1]:无法激活交换交换文件。

在 systemd 245.6-3 上没问题

是的,您可以将优先级设置为 100 之类的

有解决方案吗? - 在 Manjaro 测试分支上得到这个
6 月 25 日 10:20:55 工作站 systemd[1]:/run/systemd/system/var-lib-systemd\x2dswap-swapfc-1。 swap:11 :抱歉,小于 -1 的交换优先级只能由内核自己分配,忽略:-2
6 月 25 日 10:20:56 工作站 systemd[1]:无法激活交换交换文件。
在 systemd 245.6-3 上没问题

是的,您可以将优先级设置为 100 之类的

不能解决我的问题:
grafik

哦,我误读了你的评论。 优先级永远不会导致交换文件失败,它只是发出警告,因此您的问题无关紧要。
请为此开一个新问题

我不知道它什么时候再次发生,但我在 5.9.7 使用最新的 master、arch 内核和 zen modifs(linux-tkg) 并且我仍然重现这个问题,除非它更糟,因为它不断增加优先级:

/var-lib-systemd\x2dswap-swapfc-3.swap:11: Sorry, swap priorities smaller than -1 may only be assigned by the kernel itself, ignoring: -474

这是我目前的free -hm

              total        used        free      shared  buff/cache   available
Mem:           15Gi       4,2Gi       907Mi       668Mi        10Gi       9,2Gi
Swap:         4,0Gi       2,3Gi       1,7Gi

这是我使用的配置(没有更改/etc/systemd/swap.conf ,使用插入文件:

################################################################################
# Defaults are optimized for general usage
################################################################################

################################################################################
# You can override any settings with files in:
# /etc/systemd/swap.conf.d/*.conf
################################################################################

################################################################################
# Zswap
#
# Kernel >= 3.11
# Zswap create compress cache between swap and memory to reduce IO
# https://www.kernel.org/doc/Documentation/vm/zswap.txt

zswap_enabled=1
zswap_compressor=zstd     # lzo lz4 zstd lzo-rle lz4hc
zswap_max_pool_percent=25 # 1-99
zswap_zpool=z3fold        # zbud z3fold (note z3fold requires kernel 4.8+)

################################################################################
# ZRam
#
# Kernel >= 3.15
# Zram compression streams count for additional information see:
# https://www.kernel.org/doc/Documentation/blockdev/zram.txt

zram_enabled=0
zram_size=$(( RAM_SIZE / 4 ))    # This is 1/4 of ram size by default.
zram_count=${NCPU}               # Device count
zram_streams=${NCPU}             # Compress streams
zram_alg=zstd                    # See $zswap_compressor
zram_prio=32767                  # 1 - 32767

################################################################################
# Swap File Chunked
# Allocate swap files dynamically
# For btrfs fallback to swapfile + loop will be used
# ex. Min swap size 256M, Max 32*256M
swapfc_enabled=1
swapfc_force_use_loop=0          # Force usage of swapfile + loop
swapfc_frequency=1               # How often to check free swap space in seconds
swapfc_chunk_size=2G           # Size of swap chunk
swapfc_max_count=16              # Note: 32 is a kernel maximum
swapfc_min_count=0               # Minimum amount of chunks to preallocate
swapfc_free_swap_perc=50         # Add new chunk if free < 50%
swapfc_remove_free_swap_perc=55  # Remove chunk if free > 55% && chunk count > 2
#swapfc_priority=0               # Priority of swapfiles (decreasing by one for each swapfile). Jumps from 0 to -2.
swapfc_path=/var/lib/systemd-swap/swapfc/
# Only for swapfile + loop
swapfc_nocow=1              # Disable CoW on swapfile
swapfc_directio=1           # Use directio for loop dev
swapfc_force_preallocated=0 # Will preallocate created files

################################################################################
# Swap devices
# Find and auto swapon all available swap devices
swapd_auto_swapon=1
swapd_prio=1024

这是 systemd-swap 日志日志(减去 systemd 交换优先级错误)
systemd-swap-log.txt

@vilgotf

这是您的配置错误(尽管应为此进行检查)。

您的配置问题是创建了一个新的交换文件,因为您使用了超过 50% 的交换。 这在少数交换文件上可以正常工作,但是当分配下一个交换文件时,空闲交换的数量现在大于 55%,因此它立即尝试删除交换文件,然后(因为我们已经删除了交换文件),可用交换量少于 50%,因此它会尝试创建新的交换文件(无限期)

降低swapfc_free_swap_perc值(推荐,出于某种原因,默认值为 15)或增加swapfc_remove_free_swap_perc值。

就是这样,谢谢! 是的,我正在尝试使用这些值,因为新的交换文件来得不够快,而且内存杀手被触发了。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Brottweiler picture Brottweiler  ·  6评论

Nefelim4ag picture Nefelim4ag  ·  3评论

pheiduck picture pheiduck  ·  16评论

Navneet-Suresh picture Navneet-Suresh  ·  11评论

adrelanos picture adrelanos  ·  3评论