Optimizing ODF PersistentVolumes for Windows VMs
Note: This optimization is only supported for Windows VM on Red Hat OpenShift Virtualization with Red Hat OpenShift Data Foundation providing the backend storage.
Red Hat OpenShift Virtualization can run virtual machines with Microsoft Windows. Red Hat OpenShift Data Foundation can provide PersistentVolumes which can be used as disks by virtual machines. A combination of the two products and the use of Windows inside the VMs may benefit from tuning storage options for improving performance.
There are certain Microsoft Windows versions that use a peculiar I/O pattern. This particular usage of a system-wide and shared dummy page may cause CRC errors when data is written and read across different processes or threads.
rxbounce - Use a bounce buffer when receiving data (since 5.17). The default behavior is to read directly into the destination buffer. A bounce buffer is needed if the destination buffer isn't guaranteed to be stable (i.e. remain unchanged while it is being read to). In particular, this is the case for Windows where a system-wide "dummy" (throwaway) page may be mapped into the destination buffer in order to generate a single large I/O. Otherwise, "libceph: ... bad crc/signature" or "libceph: ... integrity error, bad crc" errors and associated performance degradation are expected.
Red Hat Ceph Storage and the Red Hat Enterprise Linux kernel have support for the rxbounce option since RHSA-2022:1174.
In a Red Hat OpenShift Data Foundation deployment, it is recommended to create a dedicated StorageClass for the disks of virtual machines with Windows.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: windows-vms
parameters:
clusterID: openshift-storage
csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/controller-expand-secret-namespace: openshift-storage
csi.storage.k8s.io/fstype: ext4
csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
csi.storage.k8s.io/node-stage-secret-namespace: openshift-storage
csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: openshift-storage
imageFeatures: layering
imageFormat: "2"
pool: ocs-storagecluster-cephblockpool
mounter: rbd
mapOptions: "krbd:rxbounce"
provisioner: openshift-storage.rbd.csi.ceph.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true