并行编程我有一个具有类似于下面的代码Windows服务:为Windows服务
List<Buyer>() buyers = GetBuyers();
var results = new List<Result();
Parallel.Foreach(buyers, buyer =>
{
// do some prep work, log some data, etc.
// call out to an external service that can take up to 15 seconds each to return
results.Add(Bid(buyer));
}
// Parallel foreach must have completed by the time this code executes
foreach (var result in results)
{
// do some work
}
这是一切优秀和良好的和它的作品,但我认为我们从可扩展性问题的痛苦。我们平均每分钟有20-30个入站连接,并且每个连接都会触发此代码。每个入站连接的“买家”收藏可以有1到15个买家。有时候,我们的入站连接数会出现每分钟超过100个连接的峰值,并且我们的服务器停止工作。
每台服务器(两台负载均衡的8台核心服务器)的CPU使用率仅为50%左右,但线程数继续增加(每个入站连接的响应时间从3次增加到350次) -4秒到1.5-2分钟。
我怀疑上面的代码是我们的可伸缩性问题的责任。鉴于Windows服务(无UI)上的这种使用场景(I/O操作的并行性),Parallel.ForEach是最佳方法吗?我没有太多的异步编程经验,并期待着利用这个机会来了解更多,我想从这里开始获得一些社区建议,以补充我在Google上找到的东西。
平均而言,在任何特定时刻有多少请求正在执行? –
这看起来不像'Parallel.For'的好用,因为大多数线程都会阻塞,导致线程池产生新的线程。 IO代替使用异步。 –
会降低MaxDegreeOfParallelism帮助'Parallel.ForEach(列表,新ParallelOptions() \t \t \t { \t \t \t \t MaxDegreeOfParallelism = Environment.ProcessorCount, \t \t \t},parallelAction);' – ziddarth