Windows Server 2012 R2 中的第一个字节时间 (TTFB) 较高

Windows Server 2012 R2 中的第一个字节时间 (TTFB) 较高

我的 Windows Server 2012 R2 首次访问时需要等待很长时间。无论运行的是哪种服务:RDP 服务器、SMB 访问、Microsoft SQL Server 还是邮件服务器。首次访问总是会延迟。例如,首次访问 SMB 后,访问其他服务(例如 MS SQL Server 数据库)的速度很快。或者,例如,在查看邮件后,我可以非常快速地访问 SMB 共享。当我让服务器休息一段时间后,延迟又出现了。

访问此主机上在 Hyper-V 中运行的 CentOS 虚拟机始终很快(我认为)。有 2 个虚拟机,每个虚拟机分配有 512MB RAM;动态内存已关闭。

我认为以下可能是原因:

  • 网络问题
  • 客户端计算机端的问题
  • 服务器 RAM 不足(8 GB 够用吗?)
  • 服务器上的磁盘子系统效率低下,需要唤醒所有 HDD 并等待它们启动
  • 其他内容

任务管理器显示服务器的平均 CPU 负载大多在 1-2% 左右,并且占用了 30% 的 RAM。

您将采取哪些步骤来找出问题所在?

更新

今天我将 RAM 从 8 GB 升级到了 16 GB,但首次访问延迟没有任何变化。

我还关闭了主机上的页面文件。同样,它没有改变任何东西。

更新

最后我终于用WireShark抓住了正确的时刻。从它的日志中我可以看到:

  1. 客户端 PC 和服务器通过 LLMNR 相互查找
  2. 他们通过 TCP 协商使用 SMB
  3. 他们切换到 SMB2
  4. 然后客户端PC向服务器端口445发送TCP ACK
  5. 等待4秒后,客户端PC发送NBNS广播LAN请求(名称查询NB MY_SERVERNAME<1c>)
  6. 然后等待 1 秒后重新发送此请求
  7. 等待 700 毫秒后再次重新发送此请求
  8. 从步骤 1 开始 6.5 秒后,客户端 PC 最终发送 SMB2 会话设置请求 NTLMSSP_NEGOTIATE,然后开始正常的 SMB 通信。

更新

关闭“TCP/IP 上的 NetBIOS”没有帮助。

查看事件查看器,发现来自 MS SQL Server 2008 R2 Express 的有趣消息:

========================
Level: Information
Date: 17-Jun-22
Source: MSSQL$SQLEXPRESS
Task Category: Server
========================

Time  Event ID
08:44:02    17401   Server resumed execution after being idle 822 seconds: user activity awakened the server. This is an informational message only. No user action is required.
08:08:36    17401   Server resumed execution after being idle 346 seconds: user activity awakened the server. This is an informational message only. No user action is required.
07:47:31    17403   Server resumed execution after being idle 1792 seconds. Reason: timer event.
07:02:20    17403   Server resumed execution after being idle 1792 seconds. Reason: timer event.
06:17:08    17403   Server resumed execution after being idle 1792 seconds. Reason: timer event.
05:31:57    17403   Server resumed execution after being idle 1792 seconds. Reason: timer event.
04:46:45    17403   Server resumed execution after being idle 1792 seconds. Reason: timer event.
04:01:34    17403   Server resumed execution after being idle 1792 seconds. Reason: timer event.

08:08:36 是我用客户端应用程序连接数据库的时间。

该问题与 MS SQL Server 用户实例无关。

更新

有一项服务不会遇到这种延迟:

我在 Delphi 中创建了一个基于 Indy 的 HTTP 服务器,该服务器可访问 MS SQL 服务器上的相同数据库。通过 HTTP 向该应用程序发出的请求可立即得到满足。

第一次使用 ADO 对同一数据库的请求会遇到延迟。

相关内容