每次克隆虚拟机映像时,我的系统的响应速度就会变得非常非常慢。我正在使用virt-manager
,我可以看到 IO 是由多个qemu-img convert
线程执行的。
我尝试收集一些信息,看起来可能进行了大量交换(交换分区上的 I/O)。我有 8GB 内存和 2GB 交换空间。克隆期间和克隆之后,free -h
显示 100% 的交换空间已使用。然而,这并没有告诉我当时系统交换了多少。在我克隆虚拟机之前,交换区可能已被某些东西填满。
我用的是机械硬盘。我当前的操作系统是 Fedora Linux 28。
当这种情况发生时,我该如何准备,收集相关信息,看看是否存在大量交换?
我想要某种可以回顾并整理不同信息的记录。即,如果我运行一个简单的top
或iotop
命令,它们将覆盖旧的输出,而我不希望这样。
更新
我仍然认为收集这样的信息很有用,正如我在原始答案中所建议的那样。但:
我发现我的系统几乎完全没有响应的两个最大原因。它们都与颠簸无关(交换或非交换)。
首先,存在一个错误gnome-shell
。它在主线程中等待 fsync()。这是(Wayland)图形服务器的主线程。在等待期间,显示不会更新。该错误是在 gnome-shell 3.30.2 中观察到的,应该是固定的在 3.32 版本中。
(可以通过比较 GNOME 的 Wayland 会话与 Xorg 会话来诊断这一问题。在 Xorg 会话中,鼠标光标应该仍然能够移动)。
第二个问题是 ext4 的一个已知问题。当写入文件时,fsync() 开启其他文件可能“最终会无限期地等待”。所以这会影响 gnome-shell 错误。
即使修复了 gnome-shell,ext4 中的长时间延迟似乎也会影响 Firefox。针对上述 ext4 问题的修复已合并到 Linux 内核版本 5.3 中。[1][2]。
血淋淋的细节记录在这里:简单的文件复制(或写入)会导致 Linux 文件系统上十秒以上的延迟
答案1
vmstat
是传统的 Linux 命令,用于跟踪内存、交换和 IO。例如vmstat 5
每 5 秒打印一行统计信息。
atop
是一个较新的工具,功能非常强大。运行atop
看起来与 类似top
,但它有更多信息。当您想要日志时,atop -w <file>
将改为写入二进制日志,可以使用atop -r <file>
.该atop
软件包还包括一项自动写入日志的服务,间隔时间为 10 分钟(默认情况下)。
更新:atop
2.4.0 增加了对 Linux 的支持压力失速信息。我希望这将有助于检测由于内存压力而导致的停顿。内存压力统计数据(如ms
或mf
中所示atop
)可以检测交换和非交换抖动。从技术上讲,这意味着它无助于区分交换和非交换抖动:-)。但我很想知道这些信息。我没有太多确认抖动是我的问题......并且正如更新中所证明的那样,抖动实际上并不是主要问题。
关于我遇到的主要问题:我认为收集这方面的信息比较困难。有一种通用的跟踪方法可能会有所帮助:offcputime --state 2
。虽然安装这个工具花了一些功夫。
之前的回答
我有atop
安装了一个解决方法,可以在我将笔记本电脑挂起过夜时使其正常工作。
atop
如果您长期遇到内存消耗问题,来自服务的日志可能会提供非常丰富的信息。它可能会错过较短的问题(由于默认的 10 分钟记录间隔)。
- 我的问题似乎持续了 10-20 分钟。
- 交换使用量从之前示例中的 1.4G 上升至 2G (100%)。
- 线程
qemu-img
本身在 RAM 中的大小并不大。该qemu-img
进程只有 25M 驻留。 swout
曾是175735
。这是以 4096 字节的页面来衡量的,这意味着大约 0.7G 被换出。
同时,cache
从0.8G增长到2.3G。 free
内存停留在0.1G。
我怀疑 qemu-img 正在执行缓存 IO,缓存正在推出其他内存,这就是导致交换的原因。如果我没有交换空间,我预计仍然会出现一些问题;即加载的程序代码和其他缓存将被逐出。
如果我drop_caches
然后是cp
一个16G的文件,我可以触发相当多的交换。我认为同样的问题正在被重现cp
;我不认为这仅限于某些具体细节qemu-img convert
。