4 c# performance service multithreading
这是我的Web服务服务器端和客户端的示例程序.我遇到了一个strnage性能问题,即使我增加调用Web服务的线程数,性能也没有提高.同时,任务管理器性能面板的CPU /内存/网络消耗很低.我想知道什么是瓶颈以及如何改进它?
(我的测试经验,线程数增加一倍,总响应时间几乎翻倍)
客户端:
class Program
{
static Service1[] clients = null;
static Thread[] threads = null;
static void ThreadJob (object index)
{
// query 1000 times
for (int i = 0; i < 100; i++)
{
clients[(int)index].HelloWorld();
}
}
static void Main(string[] args)
{
Console.WriteLine("Specify number of threads: ");
int number = Int32.Parse(Console.ReadLine());
clients = new Service1[number];
threads = new Thread[number];
for (int i = 0; i < number; i++)
{
clients [i] = new Service1();
ParameterizedThreadStart starter = new ParameterizedThreadStart(ThreadJob);
threads[i] = new Thread(starter);
}
DateTime begin = DateTime.Now;
for (int i = 0; i < number; i++)
{
threads[i].Start(i);
}
for (int i = 0; i < number; i++)
{
threads[i].Join();
}
Console.WriteLine("Total elapsed time (s): " + (DateTime.Now - begin).TotalSeconds);
return;
}
}
Run Code Online (Sandbox Code Playgroud)
服务器端:
[WebMethod]
public double HelloWorld()
{
return new Random().NextDouble();
}
Run Code Online (Sandbox Code Playgroud)
乔治,提前谢谢
虽然您正在创建多线程客户端,但请记住,.NET具有可配置的瓶颈,可同时调用2个单个主机.这是设计的.请注意,这是在客户端,而不是服务器上.
尝试在客户端调整app.config文件:
<system.net>
<connectionManagement>
<add address=“*” maxconnection=“20? />
</connectionManagement></system.net>
Run Code Online (Sandbox Code Playgroud)
在这篇短文中有更多信息:
我的经验通常是锁定是问题:我曾经有一个大规模并行服务器,它花费了更多时间上下文切换而不是执行工作.
所以 - 检查你的内存并在perfmon中处理计数器,如果你看一下上下文切换及其高(每秒超过4000),那么你就麻烦了.
您也可以检查服务器上的内存统计信息 - 如果它花费所有时间交换,或者只是创建和释放字符串,它似乎也会停止.
最后,检查磁盘I/O,原因与上面相同.
解决方案是移除您的锁,或保持它们至少一段时间.通过消除对COM BSTR及其全局锁的依赖来解决我们的问题,你会发现C#有很多类似的同步瓶颈(旨在保证你的代码安全运行).当我将一个简单的C#应用程序从单核移动到多核盒时,我已经看到性能下降.
如果你不能删除锁,最好的选择是不要创建尽可能多的线程:)使用线程池来让CPU完成一个作业,然后再启动另一个.