1

我在带有 apache/mod_mono 的 linux 机器上有一个 ServiceStack RESTful Web 服务。

    public DataSetResponse Get(DataRequest req)
    {
        DataSetResponse Response = new DataSetResponse(); 
        DataSet BigData = new DataSet();

        this.Status = this.DataFetcher(ref BigData);   
        Response.Data = BigData;
        Response.Status = this.Status;         

        System.Threading.Thread.Sleep(30000);         
        return Response;
    }

当线程休眠时,我可以看到 mono 是 top 报告的内存的 8%。30 多秒后,当单声道再次具有 cpu 活动时,内存上升到 90%,并引发内存不足异常。Mono 继续运行但不释放其内存。

在小型数据集(大小的 1/10)上,它似乎工作正常,mono 有 1% 的内存。我认为内存增长发生在数据对象被序列化为 Json 之前,然后才流式传输到客户端。

这个对吗?更重要的是,我该如何解决这个问题?

4

1 回答 1

1

我不知道您的服务器有多少 RAM,但如果它在单个请求上达到最大值,我假设由于它是一个 Web 服务,您希望为多个客户端提供服务,因此您可能会收到 2 个或更多这些请求大约在同一时间,您可能需要考虑某种方式来流式传输或分块数据(即,客户端可以一次请求一页数据,并且他们可以继续请求更多页,直到他们拥有整个数据集)。

因此,您的请求 DTO 可能包含一个页面 #,您的数据获取器将抓取该下一页(基于您决定每页的记录数)并返回它。

您的响应需要包括总页数和返回的页面,以便客户端可以决定继续获取数据。

您可能在序列化之前看到 8% 的原因是该对象是其二进制格式 - 将其转换为一个大的 JSON 字符串会真正使其膨胀。

您还可以考虑 ServiceStack 支持的其他一些二进制格式 - ProtoBuf 和 MessagePack。

于 2013-05-31T21:14:24.733 回答