我在这台机器上运行 Arch:
3.40GHz i7 六核 (4930K)
16GB DDR3 1600MHz 内存
Raid0 中的 2xSamsung 840 EVO SSD(使用 BTRFS raid)
当我在带有几个虚拟机(2 或 3 个)的 Arch 上运行 VMware 时,每个虚拟机大约有 2-4 个内核,每个虚拟机有 2GB RAM,我的系统开始出现随机冻结。每隔几分钟,系统就会冻结 10 到 30 秒,然后再次开始移动,30 秒后又冻结,直到我关闭虚拟机。当系统死机时,鼠标仍然可以正常移动,但主机上的应用程序停止响应 - vmware 不响应,firefox(也在主机上打开)不响应等。
当冻结发生时,如果我运行进程监视器,它确实会显示 vmware 已耗尽多个核心,但同时还有其他未使用的核心。我的 RAM 也绰绰有余 - 虚拟机总共使用了 6GB,主机还剩 10GB。我的交换空间为 0,因此交换不会减慢任何速度。
有报告称,由于 btrfs 会导致文件系统级别的文件碎片,因此虚拟机可能运行缓慢。然而,据我所知,碎片只是传统硬盘上的一个问题 - SSD 没有寻道的读磁头,因此它们不关心文件是否存在高度碎片。
当我运行 Debian 7 时,这种情况从未发生过,所以我很确定这不是硬件问题。
我可以运行哪些工具来找出系统不断冻结的原因?我尝试过 top/htop 和 iotop (当系统冻结时,没有任何内容过度写入或读取)。似乎没有任何类型的活动监视器可以让 btrfs 判断它在写入/读取任何内容时是否遇到问题。还有什么我可以尝试的吗?
答案1
来自 btrfs陷阱页面:
具有大量随机写入的文件可能会变得严重碎片化(超过 10000 个范围),导致 HDD 损坏,并在具有 SSD 或大量 RAM 的系统上导致 CPU 负载出现过多的多秒峰值。
在服务器和工作站上,这会影响数据库和虚拟机映像。
- nodatacow 安装选项可能在这里有用,并有相关的陷阱。
...
- 症状包括 btrfs-transacti 和 btrfs-endio-wri 占用大量 CPU 时间(出现峰值,可能由同步触发)。您可以使用 filefrag 来定位碎片较多的文件(压缩时可能无法正常工作)。
我在 Virtualbox 中遇到了与您描述的类似的问题。 btrfs选项nodatacow
对我的系统没有明显帮助。我也尝试了自动碎片整理选项(作为桌面环境中应用程序数据库的可能解决方案提到),也没有得到使该行为可接受的结果。
最后,我缩小了 btrfs 分区及其所在的逻辑卷,创建了一个新的 LV 并将其格式化为 ext4,然后将我拥有的 VM 磁盘映像 (VirtualBox) 放在该“分区”上。
答案2
通过不在分区上使用 LUKS,问题得到了彻底解决。所以我直接使用 BTRFS 格式化分区,而不是先使用 LUKS。
还安装了以下参数:
/dev/sda2 / btrfs rw,noatime,space_cache,compress=lzo,ssd,discard,autodefrag,commit=0,thread_pool=8 0 0
答案3
这可能是一个透明的大页问题,其中内核线程胡格佩吉德,实际上是挖掘 RAM 以对其进行碎片整理或从 4k 个页面中创建大页面。
鉴于您的系统 RAM 量相当大,内核可能决定启用大页面。
检查这两个内核可调参数的内容:
/sys/kernel/mm/transparent_hugepage/enabled
/sys/kernel/mm/transparent_hugepage/defrag
如果它们的内容是always
,您可以更改never
,并查看 cpu 峰值/冻结是否消失。