[linux-lvm] read is blocking if reading snapshots with 16k blocks on mp systems

Martin Petermann martin.petermann at de.ibm.com
Thu Jan 10 12:58:02 UTC 2002


Hi all,

I had some performance problems, than I wrote a small program to see where
it was hanging:

-my configuration:

I'm using a SuSE 7.1 and SuSE 7.2 mp system (two processors).
I've created a snapshot in the following way:

   peanuts:root >lvcreate -L 50 -n snapshot -s /dev/zweite_testvg/testfs1

   >lvscan
   ...
   lvscan -- ACTIVE   Original "/dev/develop/400M" [400.00 MB]
   lvscan -- ACTIVE   Snapshot "/dev/develop/snapshot" [31.50 MB] of
   /dev/develop/400M
   ....
   lvscan -- 13 logical volumes with 17.05 GB total in 2 volume groups
   lvscan -- 13 active logical volumes


-small program which simply reads from a snapshot and writes to a file

   #define SIZE 4*4096

   int main(int argc, char **argv)

   {
      struct timeval now,save;
      struct timezone tz;
      char buffer[SIZE];
      ssize_t size,count=SIZE;
      int fd,fd2,counter=0;

      fd=open(argv[1], O_RDONLY, O_NONBLOCK); // filedescriptor for reading
      fd2=open("/BIGFS/file", O_RDWR);        // filedescriptor for writing

      if (fd>0)
      {
         printf("%s opened for reading\n",argv[1]);
         do
         {
            gettimeofday(&save,&tz);
            size= read(fd, (void *) buffer, count);
            gettimeofday(&now,&tz);
            if( now.tv_sec-save.tv_sec > 1 )
               printf("%d: %ld seconds needed for bytes
   %d\n",counter,now.tv_sec-save.tv_sec,(int) size);
            size= write(fd2, (void *) buffer, size);
            counter++;
         } while ( size > 0 );
      }

      close(fd);
      close(fd2);

      return 0;
   }



-output using different values for SIZE (16384, 16383, 16385):

/dev/zweite_testvg/snapshot opened for reading
9704: 11 seconds needed for bytes 16384
12002: 12 seconds needed for bytes 16384
12435: 29 seconds needed for bytes 16384
14661: 7 seconds needed for bytes 16384
14669: 40 seconds needed for bytes 16384
16071: 17 seconds needed for bytes 16384
18456: 11 seconds needed for bytes 16384
/develop/rem/peterman/C/linux

peanuts:root >gcc -o myread myread.cpp
/develop/rem/peterman/C/linux
peanuts:root >./myread /dev/zweite_testvg/snapshot
/dev/zweite_testvg/snapshot opened for reading
7532: 2 seconds needed for bytes 16383
/develop/rem/peterman/C/linux

peanuts:root >gcc -o myread myread.cpp
/develop/rem/peterman/C/linux
peanuts:root >./myread /dev/zweite_testvg/snapshot
/dev/zweite_testvg/snapshot opened for reading
/develop/rem/peterman/C/linux


The maximum time read was hanging was 40 seconds. I detected similar
problems reading 3*4096 bytes.

Regards
   Martin






More information about the linux-lvm mailing list