为什么C#代码在服务器上的运行速度比开发机器慢得多?

时间:2016-11-01 17:07:48

标签: c# mysql multithreading performance windows-services

我有一个代码块,它从文件中读取n行,将它们加载到MySQL的临时表中,执行一些清理并与其他数据进行比较,然后根据清理结果对其他数据进行更新。 / p>

它部署为Windows服务。它一度使用多线程。它依赖于以旧式方式向MySql发出命令,执行命令和调用存储过程,而不是使用ORM(如Entity Framework)。

代码运行正常。当我在服务器上运行它而不是在调试模式下运行我的本地代码时,令我困惑的是比较性能。这就是我记录的内容:

int blockSize = 5000;

Stopwatch sw = new Stopwatch();
sw.Start();
// reads [blockSize] rows from file and appends a cleansed version to each
sw.Stop();
_log.Info(string.Format("Took {0} ms to CLEAN DATA {1} rows", sw.ElapsedMilliseconds, blockSize));

sw.Reset();
sw.Start();
// bulk copies the rows into a temp table in MySQL
sw.Stop();
_log.Info(string.Format("Took {0} ms to LOAD DATA {1} rows", sw.ElapsedMilliseconds, blockSize));

sw.Reset();
sw.Start();
// multi-threaded code which runs through the temp table and gives each record an updateId
sw.Stop();
_log.Info(string.Format("Took {0} ms to COMPARE DATA {1} rows", sw.ElapsedMilliseconds, blockSize));

sw.Reset();
sw.Start();
// executes a MySQL command to update another table using the updateId determined above
sw.Stop();
_log.Info(string.Format("Took {0} ms to SAVE DATA {1} rows", sw.ElapsedMilliseconds, blockSize));

这里有一个迭代在我的本地机器上执行的速度有多快,该机器有4个内核和8GB内存。它正在与开发MySql Server讨论数据库工作,而不是本地安装:

  • 花了12643毫秒到CLEAN DATA 5000行
  • 花了349毫秒到LOAD DATA 5000行
  • 花费11864毫秒到COMPARE DATA 5000行
  • 花了940毫秒来保存数据5000行

在相同的8核16GB RAM开发机上运行数据库时,将相同代码作为服务部署需要多长时间:

  • 花了174毫秒到CLEAN DATA 5000行
  • 花了293毫秒到LOAD DATA 5000行
  • 花费461566毫秒到比较数据5000行
  • 花了130毫秒来保存数据5000行

正如您所看到的,在功能更强大的机器上,比较步骤慢了38倍,而其他所有内容都略快一些。

该服务器正在努力工作,但它并没有最大化CPU或RAM或磁盘。除了普通的Windows功能之外,它在后台还没有做太多其他事情。它是一个虚拟服务器,并且它运行了这个代码的(较旧)版本,但由于据称可以使用更多内核和RAM来执行此操作,因此速度很慢。这不是一次性的:虽然这只是一组数据,但重复测试显示了类似的模式。

无法解释这里发生了什么。我只能想象它是:

之一
  • 事实上,这只发生在他应用程序的多线程部分,但应该更快,而不是更慢。
  • 事实上它被赋予了更多的VM核心和RAM,但这也应该让它更快。
  • 它被部署为Windows服务而不是VS中的调试
  • 它在运行数据库
  • 的同一台计算机上执行的事实

但这些都没有多大意义。谁能提出可能的原因?或者我该如何诊断问题?

0 个答案:

没有答案