首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Haskell套接字编程-内存泄漏

Haskell套接字编程-内存泄漏
EN

Stack Overflow用户
提问于 2013-06-18 18:24:19
回答 1查看 752关注 0票数 4

我正在玩一些基本的haskell网络的东西,但是有一个问题让我抓狂。下面这段非常简单的服务器代码似乎泄漏了内存,我就是不知道为什么。

首先,我派生了accept-method并回显所有传入的消息。我已经使用Apache Benchmark工具ab测试了服务器。但是在使用ab进行了几次测试之后,服务器进程开始泄漏内存,不是很多,而是持续地泄漏。我估计每10000个请求大约有1MB。

问题是:这是某种内部垃圾收集器优化,还是它确实泄漏了内存?我已经测试过这个程序的内存使用量高达200MB,而且还在增长。

在本例中,我使用了严格的ByteStrings。我做的另一个测试是使用基于句柄的IO,它不会导致内存总增长超过3MB。

使用惰性IO (ByteString.Lazy)也会导致同样的问题,但速度会更快。我使用的是GHC 7.6 (Windows 8)。

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-18 20:06:30

我刚和一位同事谈过,他告诉我问题出在这个部分

代码语言:javascript
运行
复制
loop sock (sockId + 1)

我在没有计算的情况下构建了thunks,这肯定会填满堆。我希望这对其他面临类似问题的人有所帮助。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17166495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档