我的 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抓住了正确的时刻。从它的日志中我可以看到:
- 客户端 PC 和服务器通过 LLMNR 相互查找
- 他们通过 TCP 协商使用 SMB
- 他们切换到 SMB2
- 然后客户端PC向服务器端口445发送TCP ACK
- 等待4秒后,客户端PC发送NBNS广播LAN请求(名称查询NB MY_SERVERNAME<1c>)
- 然后等待 1 秒后重新发送此请求
- 等待 700 毫秒后再次重新发送此请求
- 从步骤 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 对同一数据库的请求会遇到延迟。