scsi-target and the buffer cache

Nate Lawson nate at root.org
Wed Dec 7 16:48:06 PST 2005


Scott Long wrote:
> Eric Anderson wrote:
> 
>> Nate Lawson wrote:
>>
>>> Eric Anderson wrote:
>>>
>>>> I'm curious about whether a target mode device would use the buffer 
>>>> cache or not.  Here's a scenario:
>>>>
>>>> Host A: has fibre channel host adapter, in target mode, large memory 
>>>> pool, and another fiber channel host adapter connecting to fibre 
>>>> channel block device.
>>>> Host B: Fibre channel host adapter, connecting to Host A.  'sees' 
>>>> the target mode block device created by Host A.
>>>>
>>>> Will Host A use the buffer cache to cache blocks between the real 
>>>> block device, and the shared target mode device?
>>>> What about if Host A put a filesystem on the block device, created a 
>>>> single file the size of the filesystem, and shared that filesystem 
>>>> via a target mode device to Host B?
>>>> What I'm wanting is a box (FreeBSD?) that can be placed between a 
>>>> fibre channel block device (like a RAID array), and a fibre channel 
>>>> host using that block device, and act as a block cache for that 
>>>> device, using the FreeBSD's memory.  If it had a significant amount 
>>>> of memory, this could be very useful.
>>>
>>>
>>>
>>>
>>> If you use the example scsi_target usermode 
>>> (usr/share/examples/scsi_target), then the buffer cache will be used 
>>> since its reads/writes are from usermode like normal.  If you don't 
>>> want that behavior, you can set O_DIRECT in the open() call of the 
>>> backing store file.
>>>
>>> If you chose to modify the kernel side, you'd have to make sure your 
>>> accesses were through the VOP layer and then it would be cached.
>>>
>>> You should check to be sure the target mode performance meets your 
>>> expectations also.
>>>
>>
>> I guess I would be using the user mode tool, unless there's another 
>> way?  Your comment on performance also makes me a little worried about 
>> that now - do you think I would see a large performance hit?
>> Thanks!
>> Eric
>>
>>
> 
> The way the target mode stack works in FreeBSD is that the kernel 
> provides some of the basic services, but the actual target emulator
> is meant to live in userland.  The userland program responds to
> events from the kernel via the select interface.  This generally
> works pretty well.  However, it does mean that control has to
> cross the kernel-userland boundary at least once for every event.
> 
> What I'd suggest doing is prototyping your target emulator in userland
> and evaluating the performance there, and then moving it to the kernel
> if you _really_ need more performance.

Agree 100%.  While having it in usermode means there are boundary 
crossings that increase per-transaction latency, the actual bulk data 
transfer is via zero-copy IO and you should be able to exceed the data 
transfer rates of several 10K RPM drives on decent hardware.

-- 
Nate


More information about the freebsd-hackers mailing list