1

私はWindowsでBookSleeve(およびredis)をいじり始めたばかりで、ここで間違っている可能性のあることについて何らかの方向性を得ることができるかどうかを確認したいと思っていました。次のコードを使用し、それに対してabを実行すると、w3wsvc.exeがクラッシュする前に最大500のリクエストを処理できます。デバッグするプロセスに接続すると、redisサーバーへのリクエストがタイムアウトしていることがわかります。

@using (var conn = new BookSleeve.RedisConnection("localhost"))
{        
    conn.Open();
    var catgrabber = conn.ListRange(0,"categories",0,-1);
    byte[][] categories = conn.Wait(catgrabber);
    foreach (byte[] category in categories)
    {
        <h3> @System.Text.UTF8Encoding.UTF8.GetString(category) </h3>
        var actgrabber = conn.ListRange(0, String.Format("activity:{0}",
            System.Text.UTF8Encoding.UTF8.GetString(category).Replace(' ', '_')), 0, -    1);
        byte[][] activities = conn.Wait(actgrabber);
        foreach (byte[] activity in activities)
        {
            <label for="@System.Text.UTF8Encoding.UTF8.GetString(category).Replace(' ', '_'):@System.Text.UTF8Encoding.UTF8.GetString(activity):12345">
            <input type="checkbox" id="@System.Text.UTF8Encoding.UTF8.GetString(category).Replace(' ', '_'):@System.Text.UTF8Encoding.UTF8.GetString(activity):12345" value="@System.Text.UTF8Encoding.UTF8.GetString(activity)"/>
            @System.Text.UTF8Encoding.UTF8.GetString(activity)
        </label><br />
        }
    }
}

.NET async /awaitCTPをまだインストールしていません。

さて、たった1つのWebページがヒットしただけで、これはうまく機能します。私はこれをホストしているサーバーを強打したかったので...

ab -n 1000 -c 5 http://server/page.cshtml

500〜700のリクエストを処理してから、クラッシュします。この種の負荷がかかるかどうかはわかりませんが、これは私のコードに明らかな欠陥があることを示していると思います。私が間違っていることを指摘するよりも賢い人が欲しいと思います。

ありがとう!

4

1 に答える 1

2

私が最初に気付くのは、そのコードが非常に複雑すぎてかみそりのビューに表示できないことです。コントローラーに移動する必要があります。それ自体はおそらく問題ではありません。

問題は、作成されている多数の接続であり、次の接続がロードされる前に完全にクリーンアップされていない可能性があります。BookSleeveサイトから:

接続はスレッドセーフであり、(待機を除いて)非ブロッキングであるため、必要な数の呼び出し元間で接続を共有できます。これにより、Webサイトは単一のredis接続を非常に効果的に使用できます。さらに、データベースの切り替え(上記の例では12)はメッセージレベルで処理されるため、個別のSELECTコマンドを発行する必要はありません。これにより、操作を同期することなく、データベースのセットでマルチテナンシーを使用できます。

つまり、1000個のクエリを処理するために1つの共有接続を作成する方が、それぞれ1つのクエリを処理するために1000個の接続を作成する場合よりも、おそらくより良い結果が得られます。

于 2011-07-08T04:21:31.267 に答える