这是我的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; } }
服务器端:
[WebMethod] public double HelloWorld() { return new Random().NextDouble(); }
乔治,提前谢谢
虽然您正在创建多线程客户端,但请记住,.NET具有可配置的瓶颈,可同时调用2个单个主机.这是设计的.请注意,这是在客户端,而不是服务器上.
尝试在客户端调整app.config文件:
在这篇短文中有更多信息:
我的经验通常是锁定是问题:我曾经有一个大规模并行服务器,它花费了更多时间上下文切换而不是执行工作.
所以 - 检查你的内存并在perfmon中处理计数器,如果你看一下上下文切换及其高(每秒超过4000),那么你就麻烦了.
您也可以检查服务器上的内存统计信息 - 如果它花费所有时间交换,或者只是创建和释放字符串,它似乎也会停止.
最后,检查磁盘I/O,原因与上面相同.
解决方案是移除您的锁,或保持它们至少一段时间.通过消除对COM BSTR及其全局锁的依赖来解决我们的问题,你会发现C#有很多类似的同步瓶颈(旨在保证你的代码安全运行).当我将一个简单的C#应用程序从单核移动到多核盒时,我已经看到性能下降.
如果你不能删除锁,最好的选择是不要创建尽可能多的线程:)使用线程池来让CPU完成一个作业,然后再启动另一个.