启动 7z 几分钟后系统完全没有响应 - 如何解决或修复此问题?

0xC*_*22L 2 kernel scheduler 20.04

我以前从未遇到过这种情况,但大多数时候我都会小心地nice ionice -c3在要执行的命令前面加上 a 。但这一次的使用niceionice只是延缓了效果。

不管怎样,我使用 Ubuntu 20.04 作为我的主系统,即作为台式机。它已完全修补并且是最新的,运行 5.4 内核(即没有其他可用的内核)。我用 Cinnamon 运行它(是的,它是 Ubuntu 本身,而不是 Mint 等),但是当我上次重新安装它时,系统必须通过服务器 ISO 安装,因为没有一个桌面 ISO 启动成功。我提到这一点是因为我不确定这是否会以某种方式发挥作用。

当我开始7z压缩几十GiB大小的文件时,系统变得完全没有响应。无法切换到文本控制台,无法通过 SSH 连接,无法移动鼠标光标......

从这种情况中恢复的唯一方法是重新启动系统(在我的例子中,我长按电源键)。

现在,在发生这种情况之后,我阅读了一些有关 Linux 调度程序的内容(我没有主动修改它),并了解到 CFS(完全公平调度程序)是自某些版本以来的默认调度程序。然而,很明显,它让所有其他进程都挨饿,转而支持以 Nice 启动的程序ionice -c3……这似乎一点也不公平。

systemd 日志仅显示文件系统驱动程序无法为托管同时运行的虚拟机的进程写入内容。

我怎样才能进一步诊断这个问题并最终解决这个问题,这样我打算用作桌面的系统就不会变得完全没有响应?

注意:我宁愿 OOM 杀手介入并狙击某些进程,也不愿系统变得完全无响应。但据我所知,OOM 杀手并不介意。


系统有 64 GiB 的 RAM,没有活动的交换文件(我可以忍受少数因为内存不足而导致程序失败的情况)

# sysctl -A | grep -v _domain | grep '\.sched'
kernel.sched_autogroup_enabled = 1
kernel.sched_cfs_bandwidth_slice_us = 5000
kernel.sched_child_runs_first = 0
kernel.sched_itmt_enabled = 1
kernel.sched_latency_ns = 24000000
kernel.sched_migration_cost_ns = 500000
kernel.sched_min_granularity_ns = 3000000
kernel.sched_nr_migrate = 32
kernel.sched_rr_timeslice_ms = 100
kernel.sched_rt_period_us = 1000000
kernel.sched_rt_runtime_us = 950000
kernel.sched_schedstats = 0
kernel.sched_tunable_scaling = 1
kernel.sched_util_clamp_max = 1024
kernel.sched_util_clamp_min = 1024
kernel.sched_wakeup_granularity_ns = 4000000
Run Code Online (Sandbox Code Playgroud)

...和(UUID 编辑)...

# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-5.4.0-73-generic root=UUID=xxx ro quiet loglevel=3 vga=current nosplash udev.log_priority=3 rd.systemd.show_status=auto rd.udev.log_priority=3 plymouth.enable=0
Run Code Online (Sandbox Code Playgroud)

(后者表明我没有告诉它使用不同的调度程序)

整体配置是(稍作编辑):

# inxi -b -C -G -m
System:    Host: XXX Kernel: 5.4.0-73-generic x86_64 bits: 64 Desktop: Cinnamon 4.4.8
           Distro: Ubuntu 20.04.2 LTS (Focal Fossa)
Machine:   Type: Desktop System: Dell product: Precision 5820 Tower X-Series v: N/A serial: XXX
           Mobo: Dell model: 02M8NY v: A01 serial: /XXX/XXX/ UEFI: Dell v: 2.8.0 date: 01/15/2021
Memory:    RAM: total: 62.52 GiB used: 3.56 GiB (5.7%)
           Array-1: capacity: 3 TiB note: check slots: 8 EC: None
           Device-1: DIMM3 size: 16 GiB speed: 2666 MT/s
           Device-2: DIMM7 size: No Module Installed
           Device-3: DIMM1 size: 16 GiB speed: 2666 MT/s
           Device-4: DIMM5 size: No Module Installed
           Device-5: DIMM4 size: 16 GiB speed: 2666 MT/s
           Device-6: DIMM8 size: No Module Installed
           Device-7: DIMM2 size: 16 GiB speed: 2666 MT/s
           Device-8: DIMM6 size: No Module Installed
CPU:       Topology: 10-Core model: Intel Core i9-9820X bits: 64 type: MT MCP L2 cache: 16.5 MiB
           Speed: 1200 MHz min/max: 1200/4200 MHz Core speeds (MHz): 1: 1200 2: 1200 3: 1200 4: 1200 5: 1200 6: 1200 7: 1201
           8: 1201 9: 1201 10: 1201 11: 1200 12: 1200 13: 1201 14: 1200 15: 1200 16: 1200 17: 1200 18: 1200 19: 1200 20: 1200
Graphics:  Device-1: Advanced Micro Devices [AMD/ATI] Ellesmere [Radeon Pro WX 7100] driver: amdgpu v: 5.6.20.20.45
           Display: server: X.Org 1.20.9 driver: amdgpu unloaded: modesetting
           resolution: 1920x1080~60Hz, 1920x1080~60Hz, 1920x1080~60Hz
           OpenGL: renderer: AMD Radeon Pro WX 7100 Graphics v: 4.6.14756 Core Profile Context FireGL 20.45
Run Code Online (Sandbox Code Playgroud)

Jer*_*ost 6

Ubuntu 20.04 使用内核 5.4(HWE:5.8),仅mq-deadline编译了调度程序。

您可以通过查看来查看/sys/block/sda/queue/scheduler。活动调度程序有方括号。如果内核中编译了其他调度程序,它们也会显示出来。

例子:

# cat /sys/block/sda/queue/scheduler
[mq-deadline] none

# uname -r
5.4.0-26-generic
Run Code Online (Sandbox Code Playgroud)

调度程序mq-deadline不支持ionice目前使用的机制,请参阅: https: //unix.stackexchange.com/a/160081/27458

解决方案:切换到BFQ调度器

调度程序bfq不需要在内核中编译,可以使用内核模块随后加载。

切换到BFQ调度器:

# modprobe  "bfq"
# echo "bfq" > /sys/block/sda/queue/scheduler
# echo "bfq" > /etc/modules-load.d/bfq.conf
# echo 'ACTION=="add|change", KERNEL=="sd*[!0-9]|sr*", ATTR{queue/scheduler}="bfq"' > /etc/udev/rules.d/60-scheduler.rules
Run Code Online (Sandbox Code Playgroud)

查看:

# cat /sys/block/sda/queue/scheduler
mq-deadline [bfq] none
Run Code Online (Sandbox Code Playgroud)

重新启动并再次检查可能是个好主意。

BFQ 在“虚拟”内核上不可用

如果您使用“虚拟”内核,则可能没有 bfq可用的内核模块,因为它不包含该linux-modules-extra-5.xxx软件包。

您可以通过切换到“generic-HWE”内核来解决此问题:

# sudo apt-get install linux-generic-hwe-20.04  linux-tools-generic-hwe-20.04
# reboot
Run Code Online (Sandbox Code Playgroud)

重新启动后,您应该位于 kernel 上5.8.0-xxx-generic。你可以检查一下:

# uname -r
5.8.0-59-generic
Run Code Online (Sandbox Code Playgroud)

现在您可以应用上述解决方案。

替代解决方案:Systemd 范围

如果您不想切换 IO 调度程序,则可以使用 IO 权重较低的 Systemd 作用域。

创建一个/usr/local/bin/mh_ionice包含以下内容的文件:

#!/bin/bash
if (( EUID == 0 )); then USERMODE=''; else USERMODE='--user'; fi
systemd-run \
  --collect \
  --quiet \
  --scope \
  $USERMODE \
  --nice=19 \
  --property="IOAccounting=yes" \
  --property="IOWeight=1" \
  "$@"
Run Code Online (Sandbox Code Playgroud)

使其可执行:

chmod 755 /usr/local/bin/mh_ionice
Run Code Online (Sandbox Code Playgroud)

现在你可以运行:

mh_ionice  [heavy_command] [arg] [arg] [arg]
Run Code Online (Sandbox Code Playgroud)