So, just a couple quick tests I did on FC...
Target: ESOS trunk_r698; (2) QLogic 8 Gb FC HBAs
SAN: (2) QLogic 8 Gb FC switches
Initiator: Old Dell PE 2950 with (8) cores; (2) QLogic 4 Gb FC HBAs; (1) Emulex 8 Gb FC HBA
Testing on the ESOS side with vdisk_nullio so we can just test the SAN, initiator, and target without worrying about any back-end storage... reads/writes are discarded. So this should show us the maximums of what those three different pieces can do (target, SAN, initiator).
I see no difference between reads/writes in this testing, which makes sense, since no real IO is being done on the back-end.
fio --bs=4k --direct=1 --rw=randread --ioengine=libaio --iodepth=64 --name=task_sdd --filename=/dev/sdd
fio 1.50-rc4
task_sdd: (g=0): rw=randread, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
Starting 1 process
^Cbs: 1 (f=1): [r] [0.1% done] [320.8M/0K /s] [80.2K/0 iops] [eta 02h:25m:36s]
80K 4K IOPS on the first QLogic 4 Gb initiator.
fio --bs=4k --direct=1 --rw=randread --ioengine=libaio --iodepth=64 --name=task_sdc --filename=/dev/sdc
fio 1.50-rc4
task_sdc: (g=0): rw=randread, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
Starting 1 process
^Cbs: 1 (f=1): [r] [0.1% done] [303.7M/0K /s] [75.8K/0 iops] [eta 02h:31m:49s]
75K 4K IOPS on the second QLogic 4 Gb initiator.
fio --bs=4k --direct=1 --rw=randread --ioengine=libaio --iodepth=64 --name=task_sdb --filename=/dev/sdb
fio 1.50-rc4
task_sdb: (g=0): rw=randread, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
Starting 1 process
^Cbs: 1 (f=1): [r] [0.1% done] [368.7M/0K /s] [92.2K/0 iops] [eta 02h:05m:40s]
92K 4K IOPS on the Emulex 8 Gb initiator.
fio --bs=4k --direct=1 --rw=randread --ioengine=libaio --iodepth=64 --name=task_sdb --filename=/dev/sdb --name=task_sdc --filename=/dev/sdc --name=task_sdd --filename=/dev/sdd
fio 1.50-rc4
task_sdb: (g=0): rw=randread, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
task_sdc: (g=0): rw=randread, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
task_sdd: (g=0): rw=randread, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
Starting 3 processes
Jobs: 3 (f=3): [rrr] [0.2% done] [739.7M/0K /s] [185K/0 iops] [eta 03h:30m:14s]
185K 4K IOPS across all (3) initiators to the (2) 8 Gb FC target interfaces (to 3 different vdisk_nullio devices).
Now lets take a look at a real volume in the test target (ESOS) system... a RAID0 volume consisting of (6) Intel 36GB SSDs, write-through, no read ahead. On the ESOS target side testing with fio I see this:
fio --bs=4k --direct=1 --rw=randread --ioengine=libaio --iodepth=64 --name=task_sdb --filename=/dev/sdb
task_sdb: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=64
fio-2.0.13
Starting 1 process
^Cbs: 1 (f=1): [r] [1.9% done] [489.9M/0K/0K /s] [125K/0 /0 iops] [eta 07m:57s]
125K 4K IOPS 100% random, 100% read. Tested on the ESOS host itself.
fio --bs=4k --direct=1 --rw=randwrite --ioengine=libaio --iodepth=64 --name=task_sdb --filename=/dev/sdb
task_sdb: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=64
fio-2.0.13
Starting 1 process
^Cbs: 1 (f=1): [w] [0.4% done] [0K/196.9M/0K /s] [0 /50.4K/0 iops] [eta 18m:48s]
50K 4K IOPS 100% random, 100% write. Tested on the ESOS host itself.
Now, I'll use the Emulex 8Gb FC initiator, since it clearly seems to be the better performer after the tests done above. So the device is mapped as a LUN on one ESOS-side target (an 8 Gb FC QLogic HBA)...
raspberry ~ # fio --bs=4k --direct=1 --rw=randread --ioengine=libaio --iodepth=64 --name=task_sde --filename=/dev/sde
fio 1.50-rc4
task_sde: (g=0): rw=randread, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
Starting 1 process
^Cbs: 1 (f=1): [r] [4.2% done] [282.4M/0K /s] [70.6K/0 iops] [eta 13m:33s]
70K 4K IOPS 100% random, 100% read. Test from the Linux initiator.
fio --bs=4k --direct=1 --rw=randwrite --ioengine=libaio --iodepth=64 --name=task_sde --filename=/dev/sde
fio 1.50-rc4
task_sde: (g=0): rw=randwrite, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
Starting 1 process
^Cbs: 1 (f=1): [w] [1.4% done] [0K/196.4M /s] [0 /49.1K iops] [eta 20m:13s]
49K 4K IOPS 100% random, 100% write. Tested from the Linux initiator.
Now, I'll use all (3) initiators (two 4 Gb QLogic, one 8 Gb Emulex) and produce IO to the same SSD volume (as used above) that is mapped as LUNs to the Linux initiator host.
fio --bs=4k --direct=1 --rw=randread --ioengine=libaio --iodepth=64 --name=task_sde --filename=/dev/sde -name=task_sdf --filename=/dev/sdf -name=task_sdg --filename=/dev/sdg
fio 1.50-rc4
task_sde: (g=0): rw=randread, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
task_sdf: (g=0): rw=randread, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
task_sdg: (g=0): rw=randread, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
Starting 3 processes
^Cbs: 3 (f=3): [rrr] [1.9% done] [540.1M/0K /s] [135K/0 iops] [eta 23m:34s]
135K 4K IOPS 100% random, 100% read. Tested from the Linux initiator.
fio --bs=4k --direct=1 --rw=randwrite --ioengine=libaio --iodepth=64 --name=task_sde --filename=/dev/sde -name=task_sdf --filename=/dev/sdf -name=task_sdg --filename=/dev/sdg
fio 1.50-rc4
task_sde: (g=0): rw=randwrite, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
task_sdf: (g=0): rw=randwrite, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
task_sdg: (g=0): rw=randwrite, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=64
Starting 3 processes
^Cbs: 3 (f=3): [www] [0.2% done] [0K/207.6M /s] [0 /51.9K iops] [eta 59m:58s]
51K 4K IOPS 100% random, 100% write. Tested from the Linux initiator.
The SCST configuration highlights, so you can see the vdisk_blockio device and target configuration:
--snip--
HANDLER vdisk_blockio {
DEVICE bio_ssd_test_1 {
filename /dev/disk-by-id/LUN_NAA-600062b2000312401c07a63a417e2c7d
rotational 0
# Non-key attributes
blocksize 512
nv_cache 0
pr_file_name /var/lib/scst/pr/bio_ssd_test_1
prod_id bio_ssd_test_1
prod_rev_lvl " 310"
read_only 0
removable 0
t10_dev_id e0158f98-bio_ssd_test_1
t10_vend_id SCST_BIO
thin_provisioned 0
threads_num 1
threads_pool_type per_initiator
tst 1
usn e0158f98
vend_specific_id e0158f98-bio_ssd_test_1
write_through 0
}
}
TARGET 21:00:00:24:ff:01:1c:88 {
HW_TARGET
enabled 1
rel_tgt_id 1
# Non-key attributes
addr_method PERIPHERAL
black_hole 0
cpu_mask ffffffff,ffffffff
explicit_confirmation 0
io_grouping_type auto
node_name 20:00:00:24:ff:01:1c:88
GROUP raspberry {
LUN 0 nullio_test_1 {
# Non-key attributes
read_only 0
}
LUN 1 bio_ssd_test_1 {
# Non-key attributes
read_only 0
}
INITIATOR 21:00:00:1b:32:87:cf:00
# Non-key attributes
addr_method PERIPHERAL
black_hole 0
cpu_mask ffffffff,ffffffff
io_grouping_type auto
}
GROUP raspberry_emulex {
LUN 0 nullio_test_2 {
# Non-key attributes
read_only 0
}
LUN 1 bio_ssd_test_1 {
# Non-key attributes
read_only 0
}
INITIATOR 10:00:00:00:c9:99:03:c3
# Non-key attributes
addr_method PERIPHERAL
black_hole 0
cpu_mask ffffffff,ffffffff
io_grouping_type auto
}
}
--snip--
The ESOS host is a Supermicro (24) core Intel something. To sum up the results, we definitely see the performance is FC interface bound. In the local write vs. remote (FC initiator via SCST) write, we see almost no performance loss. The local read vs. remote test was definitely limited by the FC interface. Not sure why we didn't see the same 92K IOPS number we got with the vdisk_nullio test (instead we got 70K), perhaps the 92K was a fluke. All of those values are not averages over time, they are the number that was sustained on the screen... not an in-depth test.
When we kick it up and add all (3) initiators against both FC target interfaces, we clearly see there is no performance loss (or next to nothing). Actually we got better numbers on the read test remotely vs. locally... the VD may have still be initializing or something on the MegaRAID controller when I did the first local test.
My advice: Leave all of the defaults (thread_num, write_through, etc.) as they are (default) and test. Get your baseline performance numbers, then tweak and test again. Record the numbers and see what happens.
Hope this helps.
--Marc