含双LUN的iSCSI Target能否采用多线程并发执行磁盘读写?
iSCSI Target多LUN读写的线程分配问题
创建包含两个LUN(bdev)的iSCSI Target后,两个LUN会映射为本地两块磁盘。使用fio对这两块磁盘同时进行读写操作时,发现iSCSI Target仅通过单个线程(或核心)处理请求。我自行添加了日志标注,观察到同时读写两块磁盘时,处理线程并未切换。请问这两块磁盘的读写操作能否分配到两个不同的线程上执行?
操作命令
./scripts/rpc.py bdev_malloc_create -b Malloc0 64 512 ./scripts/rpc.py bdev_malloc_create -b Malloc1 64 512 ./scripts/rpc.py --verbose DEBUG iscsi_create_portal_group 1 172.20.20.156:3261 ./scripts/rpc.py --verbose DEBUG iscsi_create_initiator_group 2 ANY 172.20.20.156/24 ./scripts/rpc.py --verbose DEBUG iscsi_create_target_node disk1 "Data Disk1" "Malloc0:0 Malloc1:1" 1:2 64 -d iscsiadm -m discovery -t sendtargets -p 172.20.20.156:3261 iscsiadm -m node --targetname iqn.2016-06.io.spdk:disk1 --portal 172.20.20.156:3261 --login fio -ioengine=libaio -bs=512B -direct=1 -thread -numjobs=2 -size=64M -rw=write -filename=/dev/sdd -name="BS 512B read test" -iodepth=2 fio -ioengine=libaio -bs=512B -direct=1 -thread -numjobs=2 -size=64M -rw=write -filename=/dev/sde -name="BS 512B read test" -iodepth=2
解答
可以让两块LUN的读写操作在不同线程执行,SPDK的iSCSI Target支持通过调整线程模型和LUN与线程的绑定策略实现并行处理,具体方案如下:
启动SPDK时指定多核心线程:默认SPDK可能仅启动单个IO线程,启动iSCSI Target应用时通过
-c参数指定要使用的CPU核心列表,例如:./app/iscsi_tgt/iscsi_tgt -c 0x3(
0x3表示启用核心0和核心1,对应两个IO线程)创建Target Node时指定多IO线程:修改创建Target Node的RPC命令,添加
--num-io-threads参数指定线程数量,例如:./scripts/rpc.py --verbose DEBUG iscsi_create_target_node disk1 "Data Disk1" "Malloc0:0 Malloc1:1" 1:2 64 -d --num-io-threads=2绑定LUN到不同线程:通过RPC命令将每个LUN绑定到指定的IO线程,实现请求的线程隔离:
# 将LUN0(对应Malloc0)绑定到线程0 ./scripts/rpc.py iscsi_target_node_set_lun_thread iqn.2016-06.io.spdk:disk1 0 0 # 将LUN1(对应Malloc1)绑定到线程1 ./scripts/rpc.py iscsi_target_node_set_lun_thread iqn.2016-06.io.spdk:disk1 1 1
原理:SPDK iSCSI Target默认采用单线程共享处理所有LUN请求,配置多IO线程并绑定LUN后,不同LUN的读写请求会被分发到对应的线程执行,利用多核心资源提升并行处理能力。
内容的提问来源于stack exchange,提问作者happyzyz
相关产品推荐
相关产品推荐

