我正在玩一些基本的haskell网络的东西,但是有一个问题让我抓狂。下面这段非常简单的服务器代码似乎泄漏了内存,我就是不知道为什么。
首先,我派生了accept-method并回显所有传入的消息。我已经使用Apache Benchmark工具ab测试了服务器。但是在使用ab进行了几次测试之后,服务器进程开始泄漏内存,不是很多,而是持续地泄漏。我估计每10000个请求大约有1MB。
问题是:这是某种内部垃圾收集器优化,还是它确实泄漏了内存?我已经测试过这个程序的内存使用量高达200MB,而且还在增长。
在本例中,我使用了严格的ByteStrings。我做的另一个测试是使用基于句柄的IO,它不会导致内存总增长超过3MB。
使用惰性IO (ByteString.Lazy)也会导致同样的问题,但速度会更快。我使用的是GHC 7.6 (Windows 8)。
echoClient :: Socket -> IO ()
echoClient nextSock = do
-- Get a stream of bytes
stream <- NetStrictBS.recv nextSock 120
-- Echo back
NetStrictBS.send nextSock stream
-- Kill the socket
sClose nextSock
acceptClients :: Socket -> IO ()
acceptClients sock = do
-- Start with zero index
loop sock 0
where
loop sock sockId = do
-- Accept socket
(nextSock, addr) <- accept sock
-- Disable Nagle
setSocketOption nextSock NoDelay 1
-- Process client
echoClient nextSock
-- Accept next client
loop sock (sockId + 1)
main = withSocketsDo $ do
-- Setup server socket
sock <- tcpSock
setSocketOption sock ReuseAddr 1
bindSocket sock (SockAddrInet 1337 iNADDR_ANY)
listen sock 128
-- Fork the acceptor
forkIO $ acceptClients sock
print "Server running ... " >> getLine >>= print发布于 2013-06-18 20:06:30
我刚和一位同事谈过,他告诉我问题出在这个部分
loop sock (sockId + 1)我在没有计算的情况下构建了thunks,这肯定会填满堆。我希望这对其他面临类似问题的人有所帮助。
https://stackoverflow.com/questions/17166495
复制相似问题