对于基于容器的虚拟化实现 OpenVZ,主机和所有客户机似乎都在共享文件系统缓存。在谈论虚拟化时,这听起来很矛盾,但这实际上是 OpenVZ 的一个特性。
这也说得通。因为只有一个内核在运行,所以可以从共享内存中相同的文件系统缓存页面中获益。虽然这听起来很有益,但我认为这里的设置实际上会降低性能。原因如下:我的机器实际上没有共享磁盘上的任何文件,所以我无法从中获益。
几台 OpenVZ 机器正在运行带有 MyISAM 表的 MySQL。与 InnoDB 的缓冲池不同,MyISAM 依靠系统的文件系统缓存来缓存数据文件。此外,众所周知,一些虚拟机会在主机中的同一文件系统上执行繁重且大量的 I/O 操作。为了测试目的,我cat *.MYD > /dev/null
在一台机器上运行了一些大型数据库,我看到另一台机器上的文件系统缓存正在降低,由 监控htop
。这实际上会刷新客户机中所有有用的文件系统缓存(FIFO),因此它会刷新客户机中的 MySQL 缓存。到目前为止,我的分析正确吗?
现在用户抱怨 MySQL 非常慢。事实也确实如此。SELECT
当其他机器大量使用磁盘 I/O 时,一些简单的查询需要几秒钟。
因此,简单地说:
有没有办法避免基于容器的虚拟化中的文件系统缓存被其他虚拟机消灭?
而不是迁移到 KVM 或 InnoDB(见下文),我可能会错过一个配置选项。
一些想法:
- 选择内核中刷新文件系统缓存的算法。(可能吗?怎么样?)
- 为单个虚拟机保留一定数量的页面。(似乎没有针对读取的文件系统缓存类型的页面的选项
man vzctl
) - 在另一个文件系统上运行 MySQL 有什么用吗?
- 升级机器中的 RAM(如 @michael-hampton 所建议)。虽然这是一个便宜的选择,但它可能无法解决问题。升级 +8GB 与一夜之间的磁盘 I/O 操作量不成比例,比如说几十 GB。
如果没有的话,我认为我的替代方案是:
- 使用 KVM 来运行 MySQL-MyISAM 虚拟机。KVM 实际上会为虚拟机分配内存,并且不允许交换缓存,除非使用
balloon
驱动程序。 - 转向 InnoDB 并调整缓冲池、脏页等。现在这被认为是长期的“好事”,因为并非所有负责系统管理的人都了解 InnoDB。
- 欢迎提出更多建议。
系统软件:Proxmox(目前为 1.9,可升级至 2.x)。为虚拟机分配了一个大 LV。
答案1
除了您已有的想法之外,您还可以添加更多 RAM,尽管这似乎是一种昂贵的短期创可贴。
从长远来看,最好的选择可能是放弃 OpenVZ。