我正在配置服务,该服务将大量由 nginx 上传的文件存储在主机系统的 /srv/storage 目录中。这些文件由工作 KVM 客户机处理,这些客户机可能会创建新文件或为现有文件分配扩展属性。文件永远不会被覆盖,但最终会被其中一个工作程序删除。
因此主机服务器的文件写入速度约为 177MB/s。KVM 映像是存储在主机文件系统上的 QCOW2 文件,得益于此 virtio 设置,映像在 KVM 实例内实现了 ~155MB/s:
<driver name='qemu' type='raw' cache='none' io='native'/>
但是我无法获得共享文件夹的此类结果。我使用以下方法获得了最高 40MB/s 的速度虚拟文件系统又名virtio 9p. 似乎没有与 mount 等效的 AIO:
mount -t 9p -o trans=virtio,version=9p2000.L uploads /srv/storage
我也在思考:
- 没有 NFS – 缺少扩展属性
- 没有 GlusterFS - 可以使用,但是性能比 virtio 差,因为联网,在单个硬件机器上有点过度,
- 也许共享 LVM 卷进行读/写? - 实际上文件夹存储在单独的分区中,但是我读到某处说 LV 不能进行读/写共享,因为这可能会导致 fs 损坏。
- 将上传的文件保存在 QCOW2 上并与各方共享?
- 将 nginx 和上传的文件保存在 QCOW2 上的 KVM 实例中,以某种方式与所有客户机共享图像?
- iSCSI-可以使用单个分区吗?
那么如何有效地与具有扩展属性的 KVM 客户机共享主机的文件夹)。
答案1
CIFS 可以做扩展属性,可以用 Linux 上的 Samba 来设置。
答案2
如果您的问题是吞吐量,那么增加最大数据包大小可能会有所帮助。其默认值为 8 KiB(msize=8192)。
最佳值可能需要一些实验,并且可能因您的使用情况和底层文件系统而异,但我发现 256 KiB(msize=262144)对我来说效果很好。这将吞吐量从约 150 MB/s 提高到约 1.5 GB/s。
也可以看看:https://lime-technology.com/forum/index.php?topic=36345.15
答案3
如果您决定共享 LV 卷(无论是直接共享还是通过 iSCSI 共享),则在没有集群 FS 的情况下,您将无法将其作为 r/w 共享。如果空间充足,您可以共享两个卷,一个在主机上为 r/w,另一个在客户机上为 r/w,而另一方对非 r/w 卷只有读取权限。并使这两个卷与 drbd 或 rsync 保持同步。
相当丑陋,但这就是当你不能使用 NFS 时你生成的结果
答案4
最后,我从 KVM 切换到支持绑定挂载的 LXC+Docker 容器化。选定的主机目录挂载在容器内。由于不涉及网络或转换,因此性能与主机相同。此外,多个容器可以同时写入单个“卷”,而无需任何独占锁。