我刚刚开始在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/await CTP。
现在,对于一个单一的网页点击,这是很好的工作。我只是想和托管这个的服务器打交道,所以我做了…
ab -n 1000 -c 5 http://server/page.cshtml
它将处理500-700个请求,然后崩溃。虽然我不确定我是否会有这样的负载,但我相信这表明我的代码中有一个明显的缺陷,并希望有人比我更聪明地指出我做错了什么。
谢谢!
发布于 2011-07-08 12:21:31
我注意到的第一件事是,代码太复杂了,不能放在剃刀视图中--它需要移动到控制器。但这本身可能不是问题所在。
问题可能是创建了大量连接,在加载下一个连接之前,这些连接可能没有完全清除。从BookSleeve站点:
A连接是线程安全的,并且(除了等待)是非阻塞的,所以你可以根据需要在任意多的调用者之间共享连接-这使得网站可以非常有效地使用单个redis连接。此外,数据库切换(上面示例中的12个)是在消息级别处理的,因此您不需要发出单独的SELECT命令-这允许在一组数据库上使用多租户,而不必同步操作。
这意味着,与创建1000个连接来处理每个查询相比,创建一个共享连接来处理1000个查询可能会获得更好的结果。
https://stackoverflow.com/questions/6614355
复制相似问题