| SCST Performance | |
| ================ | |
| A question that is asked often is how to tune performance. This means how to | |
| improve the IOPS and/or bandwidth measured at the initiator side. In this | |
| README it is explained how to optimize storage performance. | |
| Local storage | |
| ------------- | |
| Start with measuring the performance of the local block device(s). IOPS can be | |
| measured e.g. as follows: | |
| fio --ioengine=libaio --rw=randread --ioscheduler=none --numjobs=$(nproc) \ | |
| --runtime=60 --group_reporting=1 --gtod_reduce=1 --norandommap \ | |
| --thread --buffered=0 --iodepth=256 --iodepth_batch=128 --bs=4k \ | |
| --name=bdev --filename=/dev/... | |
| The bandwidth supported by a block device can be measured by increasing the | |
| block size to a larger value in the above command, e.g. --bs=1M. | |
| Storage network | |
| --------------- | |
| Start with measuring the network bandwidth using your favorite tool, e.g. | |
| netperf for non-RDMA networks or ib_write_bw for RDMA networks. | |
| Next, add a nullio LUN to SCST, e.g. by adding the following in /etc/scst.conf: | |
| HANDLER vdisk_nullio { | |
| DEVICE disk09 { | |
| blocksize 4096 | |
| size_mb 256 | |
| } | |
| } | |
| TARGET_DRIVER ... { | |
| TARGET ... { | |
| LUN ... disk09 | |
| } | |
| } | |
| After a nullio LUN has been added, verify that this LUN is visible at the | |
| initiator side. If it is not visible at the initiator side, consider | |
| rescanning LUNs or disconnecting and reconnecting the initiator system to the | |
| SCST server. | |
| Once the nullio LUN is visible at the initiator side, measure IOPS and | |
| bandwidth. The bandwidth should be close to the network bandwidth. When using | |
| the Linux iSCSI initiator this may require configuring multiple iSCSI sessions | |
| and activating multipathd on top of the multiple iSCSI sessions. The sequence | |
| for logging in with iSCSI and activating multiple iSCSI sessions is as follows: | |
| iscsiadm -m iface -I iface2 -o new | |
| iscsiadm -m iface -I iface2 -o update -n iface.initiatorname -v ${iqn2} | |
| iscsiadm -m discovery -t st -p ${scst_ip_address} | |
| iscsiadm -m discovery -t st -p ${scst_ip_address} -I iface2 | |
| iscsiadm -m node -p ${scst_ip_address} -l | |
| iscsiadm -m node -p ${scst_ip_address} -I iface2 -l | |
| SCST Configuration | |
| ------------------ | |
| If the number of IOPS measured at the initiator side is significantly lower | |
| than the minimum of the IOPS supported by the local storage and the storage | |
| network, further tuning is required. Look up in /proc/interrupts which CPU | |
| cores process the most network and storage interrupts and configure the SCST | |
| kernel threads such that these run on other CPU cores than those that process | |
| the most interrupts by configuring the cpu_mask attribute. More information | |
| about the SCST cpu_mask sysfs attribute is available in the SCST README. |