数据卷 IO 限速
在 HwameiStor 中,它允许用户指定 Kuberentes 集群上卷的最大 IOPS 和吞吐量。
请按照以下步骤创建具有最大 IOPS 和吞吐量的卷并创建工作负载来使用它。
要求 (如果您想限制非直接 IO)
cgroup v2 具有以下要求:
- 操作系统发行版启用 cgroup v2
- Linux 内核为 5.8 或更高版本
更多信息, 请参见 Kubernetes 官网。
使用最大 IOPS 和吞吐量参数创建新的 StorageClass
默认情况下,HwameiStor 在安装过程中不会自动创建这样的 StorageClass,因此您需要手动创建 StorageClass。
示例 StorageClass 如下:
allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: hwameistor-storage-lvm-hdd-sample
parameters:
convertible: "false"
csi.storage.k8s.io/fstype: xfs
poolClass: HDD
poolType: REGULAR
provision-iops-on-creation: "100"
provision-throughput-on-creation: 1Mi
replicaNumber: "1"
striped: "true"
volumeKind: LVM
provisioner: lvm.hwameistor.io
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
与 HwameiStor 安装程序创建的常规 StorageClass 相比,添加了以下参数:
- Provision-iops-on-creation:指定创建时卷的最大 IOPS。
- Provision-throughput-on-creation:它指定创建时卷的最大吞吐量。
创建 StorageClass 后,您可以使用它来创建 PVC。
使用 StorageClass 创建 PVC
示例 PVC 如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-sample
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: hwameistor-storage-lvm-hdd-sample
创建 PVC 后,您可以创建 Deployment 来使用 PVC。
创建带有 PVC 的 Deployment
示例 Deployment 如下::
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: pod-sample
name: pod-sample
spec:
replicas: 1
selector:
matchLabels:
app: pod-sample
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: pod-sample
spec:
volumes:
- name: data
persistentVolumeClaim:
claimName: pvc-sample
containers:
- command:
- sleep
- "100000"
image: busybox
name: busybox
resources: {}
volumeMounts:
- name: data
mountPath: /data
status: {}
创建 Deployment 后,您可以使用以下命令测试卷的 IOPS 和吞吐量:
终端1:
kubectl exec -it pod-sample-5f5f8f6f6f-5q4q5 -- /bin/sh
dd if=/dev/zero of=/data/test bs=4k count=1000000 oflag=direct
终端2:
/dev/LocalStorage_PoolHDD/pvc-c623054b-e7e9-41d7-a987-77acd8727e66
是节点上卷的路径。
您可以使用 kubectl get lvr
命令找到它。
iostat -d /dev/LocalStorage_PoolHDD/pvc-c623054b-e7e9-41d7-a987-77acd8727e66 -x -k 2
由于 cgroupv1 限制,最大 IOPS 和吞吐量的设置可能对非直接 IO 不生效。 然而, 如果您使用 cgroupv2,那么最大 IOPS 和吞吐量的设置将对非直接 IO 生效。
如何更改数据卷的最大 IOPS 和吞吐量
最大 IOPS 和吞吐量在 StorageClass 的参数上指定,您不能直接更改它,因为它现在是不可变的。
与其他存储厂商不同的是,HwameiStor 是一个基于 Kubernetes 的存储解决方案,它定义了一组操作原语基于 Kubernetes CRD。这意味着您可以修改相关的 CRD 来更改卷的实际最大 IOPS 和吞吐量。
以下步骤显示如何更改数据卷的最大 IOPS 和吞吐量。
查找给定 PVC 对应的 LocalVolume CR
$ kubectl get pvc pvc-sample
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
demo Bound pvc-c354a56a-5cf4-4ff6-9472-4e24c7371e10 10Gi RWO hwameistor-storage-lvm-hdd 5d23h
pvc-sample Bound pvc-cac82087-6f6c-493a-afcd-09480de712ed 10Gi RWO hwameistor-storage-lvm-hdd-sample 5d23h
$ kubectl get localvolume
NAME POOL REPLICAS CAPACITY USED STATE RESOURCE PUBLISHED FSTYPE AGE
pvc-c354a56a-5cf4-4ff6-9472-4e24c7371e10 LocalStorage_PoolHDD 1 10737418240 33783808 Ready -1 master xfs 5d23h
pvc-cac82087-6f6c-493a-afcd-09480de712ed LocalStorage_PoolHDD 1 10737418240 33783808 Ready -1 master xfs 5d23h
根据打印输出,PVC 的 LocalVolume CR 为 pvc-cac82087-6f6c-493a-afcd-09480de712ed
。
修改 LocalVolume CR
kubectl edit localvolume pvc-cac82087-6f6c-493a-afcd-09480de712ed
在编辑器中,找到 spec.volumeQoS
部分并修改 iops
和 throughput
字段。顺便说一下,空值意味着没有限制。
最后,保存更改并退出编辑器。设置将在几秒钟后生效。
将来,一旦 Kubernetes 支持它, 我们将允许用户直接修改卷的最大 IOPS 和吞吐量。
如何检查数据卷的实际 IOPS 和吞吐量
HwameiStor 使用 cgroupv1 或 cgroupv2 来限制数据卷的 IOPS 和吞吐量,因此您可以使用以下命令来检查数据卷的实际 IOPS 和吞吐量。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 160G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 159G 0 part
├─centos-root 253:0 0 300G 0 lvm /
├─centos-swap 253:1 0 7.9G 0 lvm
└─centos-home 253:2 0 101.1G 0 lvm /home
sdb 8:16 0 100G 0 disk
├─LocalStorage_PoolHDD-pvc--cac82087--6f6c--493a--afcd--09480de712ed
253:3 0 10G 0 lvm /var/lib/kubelet/pods/3d6bc980-68ae-4a65-a1c8-8b410b7d240f/v
└─LocalStorage_PoolHDD-pvc--c354a56a--5cf4--4ff6--9472--4e24c7371e10
253:4 0 10G 0 lvm /var/lib/kubelet/pods/521fd7b4-3bef-415b-8720-09225f93f231/v
sdc 8:32 0 300G 0 disk
└─sdc1 8:33 0 300G 0 part
└─centos-root 253:0 0 300G 0 lvm /
sr0 11:0 1 973M 0 rom
# 如果 cgroup 版本是 v1。
$ cat /sys/fs/cgroup/blkio/blkio.throttle.read_iops_device
253:3 100
$ cat /sys/fs/cgroup/blkio/blkio.throttle.write_iops_device
253:3 100
$ cat /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device
253:3 1048576
$ cat /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
253:3 1048576
# 如果 cgroup 版本是 v2。
# cat /sys/fs/cgroup/kubepods.slice/io.max
253:0 rbps=1048576 wbps=1048576 riops=100 wiops=100