[GHC] #15746: Memory leak in print when RTS option -N is >= 2
GHC
ghc-devs at haskell.org
Sun Oct 14 14:46:45 UTC 2018
#15746: Memory leak in print when RTS option -N is >= 2
-------------------------------------+-------------------------------------
Reporter: nmattia | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.6.1
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
In GHC 802 the code below runs with constant memory. In GHC 822, 843 and
861 the code below runs with constant memory only if at most one core is
used. If the RTS option -N is set to anything greater than 1, the memory
usage grows with the size of "big_file".
{{{#!hs
import Data.ByteString.Builder.Extra (defaultChunkSize)
import Data.Function
import System.IO
import qualified Data.ByteString as BS
main :: IO ()
main = do
h <- openFile "big_file" ReadMode
fix $ \loop -> do
bs <- BS.hGetSome h defaultChunkSize
if BS.null bs
then pure ()
else do
print bs
loop
}}}
You can reproduce this by cloning https://github.com/nmattia/ghc-print-
leak and running "nix-shell". Alternatively save the code above to
"Main.hs" and run "ghc ./Main.hs -threaded -rtsopts" and then "./Main +RTS
-M2M -N[1|2] > /dev/null".
Side note: the memory does not grow as quickly if the _size_ of the
bytestring is printed, i.e. it seems to be a problem specific to
hPutStrLn/print as opposed to the actual file content/bytestring being
retained. I first encountered this issue when using conduit for the loop.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15746>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list