在授予来自同一文件的多个线程的读访问权时,应用程序卡住了

时间:2016-05-04 09:27:48

标签: c++ database-design operating-system

我们在delphi 2010中开发了一个服务器应用程序。

在这种情况下,服务器运行多个线程,这些线程访问相同的文件(大小为aprox 2.5GB),用于在作业#1(一个大而长的计算工作)上读取顺序访问中的数据。

该文件存储在240GB SSD驱动器上的win2012机器上。 当这个作业(#1)正在运行时,对同一个文件执行NO WRITE作业。

当前的问题是当作业#1正在运行时,同一服务器(exe)就是这样 在不同的作业上运行不同的线程,CAN通过不同的线程(作业)访问/读取不同的文件,在同一个驱动器上的不同目录上...也 与此同时,我们可以看到CPU处于低电平 - 大约16%。

  • 我们应该从哪里开始寻找?
  • 这是某种Windows文件访问限制吗?
  • 这是驱动程序限制吗?

更多信息: 我们使用命令

CreateFileW(FileName, GENERIC_READ, FILE_SHARE_READ OR FILE_SHARE_WRITE, NIL, 
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL OR FILE_FLAG_RANDOM_ACCESS, 0);

其他硬件信息:

  • 主板 - 技嘉x99-Gaming5(英特尔芯片组)
  • CPU - Intel Core i7-5930K
  • 内存 - 32GB 2133Mhz
  • 操作系统 - Windows 2012R2
  • HD - Corsair XT 240GB SSD

1 个答案:

答案 0 :(得分:0)

我假设服务器是在单个进程上执行的,而这个进程正在创建创建多个线程的所有作业。因此,所有线程都被计为同一进程的线程。

线程具有内存占用,并且允许在同一进程中创建的线程数取决于此占用空间,因为该进程还限制了它可以使用的可用内存。 线程的内存占用量越大,可以在同一进程中创建的线程数越少。

如果您还没有这样做,作为调查的第一步,请查看:

  1. 服务器应用程序同时创建和处理的线程数(作为所有作业的整体)
  2. 重新考虑每个线程维护和使用的堆栈大小。