我们有一个运行 CentOS 5.8 虚拟机的 VMware vSphere 5 环境。在过去的两周里,我们发生了五起虚拟机文件系统损坏事件,需要 fsck 进行修复。
这是我们在日志中看到的内容:
Nov 14 14:39:28 hostname kernel: EXT3-fs error (device dm-2): htree_dirblock_to_tree: bad entry in directory #2392098: rec_len is smaller than minimal - offset=0, inode=0, rec_len=0, name_len=0
Nov 14 14:39:28 hostname kernel: Aborting journal on device dm-2.
Nov 14 14:39:28 hostname kernel: __journal_remove_journal_head: freeing b_committed_data
Nov 14 14:39:28 hostname last message repeated 4 times
Nov 14 14:39:28 hostname kernel: ext3_abort called.
Nov 14 14:39:28 hostname kernel: EXT3-fs error (device dm-2): ext3_journal_start_sb: Detected aborted journal
Nov 14 14:39:28 hostname kernel: Remounting filesystem read-only
Nov 14 14:39:28 hostname kernel: EXT3-fs error (device dm-2): htree_dirblock_to_tree: bad entry in directory #2392099: rec_len is smaller than minimal - offset=0, inode=0, rec_len=0, name_len=0
Nov 14 14:31:17 hostname ntpd[3041]: synchronized to 194.238.48.2, stratum 2
Nov 14 15:00:40 hostname kernel: EXT3-fs error (device dm-2): htree_dirblock_to_tree: bad entry in directory #2162743: rec_len is smaller than minimal - offset=0, inode=0, rec_len=0, name_len=0
Nov 14 15:13:17 hostname kernel: __journal_remove_journal_head: freeing b_committed_data
当我们从另一台服务器 rsync'ing 应用程序数据时,问题似乎发生了。到目前为止,我们无法重现问题,也无法确定根本原因。
在我们有几台服务器出现这个问题后,我们假设模板有问题,所以我们从模板中删除所有克隆的 VM,销毁模板,并从头开始构建一个新模板,从新下载的 CentOS 安装国际标准化组织。
我们将 HP EVA SAN 用于数据存储,并在出现第一个问题后从 4400 迁移到 6300。自从移动和重建新的虚拟机以来,我们已经两次看到这个问题。在一台虚拟机上,我们关闭了服务器,移除了两个虚拟 CPU,然后再次启动它,问题几乎立即出现了。在另一台虚拟机上,我们重新启动了它,半小时后问题发生了。
任何正确方向的提示或指示将不胜感激。
有一个关于 HP EVA 的知识库文章,特别是如果您使用的是 Round Robin PSP。首先,您应该检查 vmkernel.log 以检查存储错误。 相关知识库条目 (pdf)
为优化 EVA 阵列性能,HP 建议将默认循环负载平衡 IOPS 值更改为 1。必须在 ESX4.x 上使用以下命令对每个 Vdisk 执行此更新:
对于 ESXi5:
如果仅当您将数据从一台服务器同步到另一台服务器时才能复制问题,则意味着它与从内核角度来看数据一致性的方式有关。如果内核认为文件系统将要损坏或有一些损坏,它会将 fs 变为只读。
我不太了解 HP EVA,但它是否有电池支持的写入缓存。如果是这样,您能否禁用磁盘写入缓存并使用 SAN 阵列写入缓存。为此,使用 mount -o barrier=1 挂载并查看是否有任何改进。
而且我有一种直觉,它与存储有某种关系,而不是任何 fs 错误。我不确定如何证明这一点,但我看到的大多数关于 fs 损坏的案例都以某种方式和某处涉及存储作为罪魁祸首,如果不是主要的话。