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;
    }

スレッドがスリープ状態になると、top によって報告されているように、mono がメモリの 8% にあることがわかります。30 秒以上後に mono の CPU アクティビティが再び発生すると、メモリが 90% まで上昇し、メモリ不足の例外がスローされます。Mono は引き続き実行されますが、メモリは解放されません。

小さなデータセット (サイズの 1/10) では問題なく動作するようで、mono のメモリは 1% です。クライアントにストリーミングされる前に、データオブジェクトがJsonにシリアル化されると、メモリの増加が発生すると思います。

これは正しいです?さらに重要なことに、これをどのように解決できますか?

4

1 に答える 1

1

サーバーのRAMの量はわかりませんが、単一のリクエストで最大になっている場合、複数のクライアントにサービスを提供することが期待されるWebサービスであるため、これらのリクエストを2つ以上取得する可能性があると推測していますほぼ同時に、データをストリーミングまたはチャンクアップする何らかの方法を検討する必要がある場合があります (つまり、クライアントは一度に 1 ページのデータを要求でき、データセット全体が揃うまでさらに多くのページを要求し続けることができます)。 )。

したがって、リクエスト DTO にページ # が含まれている場合、データ フェッチャーはその次のページを取得し (ページあたりのレコード数を決定したことに基づいて)、それを返します。

応答には、クライアントがデータをフェッチし続けることを決定できるように、合計ページ数と返されたページを含める必要があります。

シリアル化前におそらく 8% と表示される理由は、オブジェクトがバイナリ形式であるためです。これを大きな JSON 文字列に変換すると、実際に膨らみます。

また、ServiceStack がサポートする他のバイナリ形式 (ProtoBuf と MessagePack) を検討することもできます。

于 2013-05-31T21:14:24.733 に答える