<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>All,</p>
    <p>I am back to trying to emulate Hybrid I/O  from user space, doing
      direct and buffered I/O to the same file concurrently.  I open a
      file twice, once with O_DIRECT, and once without.  Note that you
      will see 2 different file names involved, buffered.dat and
      direct.dat.  direct.dat is a symlink to buffered.dat and this is
      done so my tool can more easily display the direct and non-direct
      I/O differently.  The file has striping of
      512M@4{100,101,102,103}x32M<ssd-pool +
      EOF@4{104,105,106,107}x32M<ssd-pool.  The application first
      writes 512M ( 32M per write ) to only the first PFL component
      using non-direct fd.  Then the application writes 512M ( 32M per
      write ) alternating between the direct fd and non-direct fd.  The
      very first write ( using direct ) into the 2nd component triggers
      the dump of the entire first component from buffer cache.  From
      that point on the 2 OSC that handle the non-direct writes
      accumulate cache.  The 2 OSC that handle the direct writes
      accumulate no cache.  My question: Why does Lustre dump the 1st
      component from buffer cache?  The 1st and 2nd component do not
      even share OSCs.  Lustre is has no problem dealing with direct and
      non-direct I/O in the same component (2nd component in this
      case).  To me it would seem that if Lustre can correctly buffer
      direct and non-direct in the same component, it should be able to
      correctly buffer direct and non-direct in multiple components.  My
      ultimate goal is to have the first, and smaller component, remain
      cached, and the remainder of the file use direct I/O, but as soon
      as I do a direct I/O, I lose all my buffer cache.</p>
    <p>The top frame of the plot is the amount of cache used by each OSC
      versus time. The bottom frame of the plot is the File Position
      Activity versus time.  Next to each pwrite64() depicted, I
      indicate which OSC is being written to.  I have also colored the
      pwrite64()s by whether they used the direct fd (green) or
      non-direct fd(red).  As soon as the 2nd PFL component is touched
      by a direct write, that write waits until the OSCs of the first
      PFL component dump all their cache.</p>
    <p>John</p>
    <p><font size="6">Image 1 :</font></p>
    <p><img moz-do-not-send="false"
        src="cid:part1.Hcv00XOh.0605yO7N@iodoctors.com"
alt="https://www.dropbox.com/scl/fi/d7seezfj0gtxo1y7lzpvy/split_direct.png?rlkey=0sfo1erxo5ua1aef5ijfc81jx&st=pxb0qnts&dl=0"
        width="1374" height="873"></p>
  </body>
</html>