This is the mail archive of the cygwin@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

pipe performance problem


hello,

it seems that the pipe code with recent cygwin versions causes a
performance problem when much data (3.6 MB per second in this case) is
transferred from one program to another.

i use mkisofs to make an iso filesystem from files on the fly and pipe
the output directly to cdrecord which writes the fs to the cd-r. cmd
line looks like this:

mkisofs -J -R -l * | cdrecord -dev=1,0,0 -v -dummy -speed=24 -

with cygwin 1.1.8 this works like expected. however with recent cygwin
versions, f.e. cvs today, i get a buffer underrun in a few seconds. this
usually means the data was not delievered fast enough or not at all.

i've investigated the problem and included a few lines (i got 50MB if
someone wants to see more) from the strace logs at the bottom. basically
what you can see is:

1.1.18

mkisofs reads in 1024 chars from the testfile a few times.
now mkisofs writes about 50 - 250 to stdout. a few microseconds later
cdrecord reads the exact number of bytes from stdin. this happens again
and again until mkisofs reads 1024 chars from the testfile again.

1.3.15

mkisofs reads in 1024 chars from the testfile a few times, then writes
1024 out to stdout the same number of times it read from the file. but
now cdrecord doesn't read in 1024 for every 1024 that were written by
mkisofs. instead it swallows 17048 in one time. sometimes it divides the
17048 in two smaller chunks (like 4096 and 13312), but never more than
two.

it looks like 1.3.15 uses big chunks, and "flushes" them in one
go while 1.1.8 reads/writes small chunks synchronous.

thomas

ps. here are the strace lines:

1.1.18:

   28 3862029 [main] mkisofs 668 fhandler_base::read: returning 1024 chars, binary mode
   25 3862054 [main] mkisofs 668 _read: 1024 = read (3<001/testfile>, 0xA011F28, 1024), bin 4096, errno 2
   28 3862082 [main] mkisofs 668 _read: read (3, 0xA011F28, 1024) blocking, sigcatchers 0
   26 3862108 [main] mkisofs 668 _read: non-interruptible read
   27 3862135 [main] mkisofs 668 fhandler_base::read: returning 1024 chars, binary mode
   25 3862160 [main] mkisofs 668 _read: 1024 = read (3<001/testfile>, 0xA011F28, 1024), bin 4096, errno 2
   27 3862187 [main] mkisofs 668 _read: read (3, 0xA011F28, 1024) blocking, sigcatchers 0
   25 3862212 [main] mkisofs 668 _read: non-interruptible read

   25 3862320 [main] mkisofs 668 fhandler_base::write: binary write
   29 3862349 [main] mkisofs 668 fhandler_base::write: 84 = write (0xA016108, 84)
  132 3862481 [main] mkisofs 668 _write: 84 = write (1, 0xA016108, 84)
   27 3862508 [main] mkisofs 668 _write: write (1, 0xA016108, 68)
   25 3862533 [main] mkisofs 668 fhandler_base::write: binary write
   28 3862561 [main] mkisofs 668 fhandler_base::write: 68 = write (0xA016108, 68)
  129 3862690 [main] mkisofs 668 _write: 68 = write (1, 0xA016108, 68)
   27 3862717 [main] mkisofs 668 _write: write (1, 0xA016108, 85)

  120 3878372 [main] cdrecord 848 fhandler_base::read: returning 84 chars, binary mode
   38 3878410 [main] cdrecord 848 _read: 84 = read (0<{stdin}>, 0xF14599, 49767), bin 4096, errno 2
   25 3878435 [main] cdrecord 848 _read: read (0, 0xF145ED, 49683) blocking, sigcatchers 0
   24 3878459 [main] cdrecord 848 _read: non-interruptible read
  119 3878578 [main] cdrecord 848 fhandler_base::read: returning 68 chars, binary mode
   39 3878617 [main] cdrecord 848 _read: 68 = read (0<{stdin}>, 0xF145ED, 49683), bin 4096, errno 2
   24 3878641 [main] cdrecord 848 _read: read (0, 0xF14631, 49615) blocking, sigcatchers 0
   24 3878665 [main] cdrecord 848 _read: non-interruptible read


1.3.15:

   28  572570 [main] mkisofs 944 fhandler_base::read: returning 1024 chars, binary mode
   26  572596 [main] mkisofs 944 readv: 1024 = readv (3, 0x22D598, 1), errno 0
   27  572623 [main] mkisofs 944 readv: readv (3, 0x22D598, 1) blocking, sigcatchers 0
   26  572649 [main] mkisofs 944 readv: no need to call ready_for_read
   28  572677 [main] mkisofs 944 fhandler_base::read: returning 1024 chars, binary mode
   26  572703 [main] mkisofs 944 readv: 1024 = readv (3, 0x22D598, 1), errno 0
   27  572730 [main] mkisofs 944 readv: readv (3, 0x22D598, 1) blocking, sigcatchers 0
   26  572756 [main] mkisofs 944 readv: no need to call ready_for_read

   25  580608 [main] mkisofs 944 fhandler_base::write: binary write
   28  580636 [main] mkisofs 944 fhandler_base::write: 1024 = write (0x475D30, 1024)
   26  580662 [main] mkisofs 944 writev: 1024 = write (1, 0x22D328, 1), errno 0
   27  580689 [main] mkisofs 944 writev: writev (1, 0x22D328, 1)
   25  580714 [main] mkisofs 944 fhandler_base::write: binary write
   38  580752 [main] mkisofs 944 fhandler_base::write: 1024 = write (0x476130, 1024)
   26  580778 [main] mkisofs 944 writev: 1024 = write (1, 0x22D328, 1), errno 0
   27  580805 [main] mkisofs 944 writev: writev (1, 0x22D328, 1)

10586  586468 [main] cdrecord 1156 peek_pipe: /dev/piper, ready for read
   48  586516 [main] cdrecord 1156 fhandler_base::ready_for_read: read_ready 1, avail 1
   73  586589 [main] cdrecord 1156 fhandler_base::read: returning 17408 chars, binary mode
   31  586620 [main] cdrecord 1156 readv: 17408 = readv (0, 0x22D618, 1), errno 9
   28  586648 [main] cdrecord 1156 readv: readv (0, 0x22D618, 1) blocking, sigcatchers 0
10541  597189 [main] cdrecord 1156 peek_pipe: /dev/piper, ready for read
   32  597221 [main] cdrecord 1156 fhandler_base::ready_for_read: read_ready 1, avail 1
   46  597267 [main] cdrecord 1156 fhandler_base::read: returning 9216 chars, binary mode
   28  597295 [main] cdrecord 1156 readv: 9216 = readv (0, 0x22D618, 1), errno 9
   63  597358 [main] cdrecord 1156 readv: readv (0, 0x22D618, 1) blocking, sigcatchers 0
   35  597393 [main] cdrecord 1156 peek_pipe: /dev/piper, ready for read
   58  597451 [main] cdrecord 1156 fhandler_base::ready_for_read: read_ready 1, avail 1
   45  597496 [main] cdrecord 1156 fhandler_base::read: returning 8192 chars, binary mode
   28  597524 [main] cdrecord 1156 readv: 8192 = readv (0, 0x22D618, 1), errno 9
   27  597551 [main] cdrecord 1156 readv: readv (0, 0x22D618, 1) blocking, sigcatchers 0


--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]