[GHC] #8224: Excessive system time -- new IO manager problem?

GHC ghc-devs at haskell.org
Wed Nov 13 00:30:45 UTC 2013


#8224: Excessive system time -- new IO manager problem?
-------------------------------------+-------------------------------------
        Reporter:  rrnewton          |            Owner:
            Type:  bug               |           Status:  new
        Priority:  high              |        Milestone:  7.8.1
       Component:  Runtime System    |          Version:  7.7
      Resolution:                    |         Keywords:  IO Manager,
Operating System:  Linux             |  System Time
 Type of failure:  Runtime           |     Architecture:  x86_64 (amd64)
  performance bug                    |       Difficulty:  Unknown
       Test Case:                    |       Blocked By:
        Blocking:                    |  Related Tickets:
-------------------------------------+-------------------------------------

Comment (by AndreasVoellmy):

 I did some more experiments, and I now think it has to do with making
 "safe" foreign calls from all of the 32 threads.  I modified the IO
 manager so that all of the polling threads (and their epoll backends) are
 created. Only one of the them is used (on cap 0) is used to register
 files. I then modified the poll loops so that only the one on cap 0 is
 running the normal polling loop and the others simply return right away.
 With this setup, the performance is good (about 40-50 ms for -N32).
 However, if I have all poll loops (except the one normal poll loop for cap
 0) simply make a "safe" call to `usleep(10)` then the performance goes
 back to about 200ms.  I'll post a patch here so that others can see.

 So it looks to be related to the cost of doing safe foreign calls. With
 the parallel IO manager each of the N pollers will make a safe foreign
 call when there is no work to do. I'm not sure that this will have much of
 an impact on most programs, but for the empty program it represents a
 large part of the work.

 I'm also not sure this is related to the 8 minute system time mentioned in
 the original report.  rnewton, can you provide a recipe for how to
 recreate this?

 Is the 200 ms startup time for 32 cores an issue? At 16 cores it is about
 50-60ms and at 8 cores about 10-20ms.

 One possible resolution (besides doing nothing or making safe foreign
 calls cheaper) would be to provide an RTS option to use a specific number
 of IO managers, or at least to differentiate between using 1 or using N.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8224#comment:14>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list