我有一台开发 Web 服务器,其中有一个应用程序目录映射到我的本地计算机的驱动器 Z:(例如 \\web_server\wwwroot)。共享文件夹需要域凭据才能访问(我的域帐户是该文件夹的共同所有者)。
我可以正常读写文件,但是 msysGit 性能很慢。
网络服务器:
patrick@web_server /c/inetpub/wwwroot (master) $ time git status > /dev/null
real 0m1.887s
user 0m0.015s
sys 0m0.015s
本地机器(访问映射的网络驱动器 Z)
patrick@local_machine /z (master) $ time git status > /dev/null
real 0m25.500s
user 0m0.000s
sys 0m0.015s
那么我该如何排除导致 25 秒挂起的原因呢?
答案1
git status
是一个读取和写入大量文件的命令。网络存储(即使通过某些 LAN 连接)在处理大量文件或大量数据(或两者)时可能会慢得令人无法接受。
问题在于 SMB(服务器消息块,又名 Samba,又名 Windows 文件共享)是一种非常“健谈”的协议,它发送很多来回运送小数据包,并且需要满载“应用程序轮次”是指您需要的数据越多,应用程序轮次就越大。“轮次”是指客户端和服务器之间的一次往返。
一些东西:
尝试
ping
从本地计算机连接远程主机。如果超过 5 毫秒,网络存储可能不适合上传少量几千字节的文件。还要检查抖动和数据包丢失。抖动是指 ping 在不同值之间变化很大,而数据包丢失是指 ping 完全丢失(没有得到响应)。两者都是非常严重的损害,几乎和延迟一样严重。尝试使用 WireShark 观察主机和路由器之间的通信
git status
。您可能会看到很多TCP 请求如下:数据包从你的机器出去
- 你的机器等待(不做任何事)
- 服务器发送响应
对于每个从您的计算机发出并发往远程计算机的数据包,将其标记为“O”(表示“出站”)。对于每个从远程计算机发出并发往您的计算机的数据包,将其标记为“I”(表示“入站”)。
- 计算一行中“I”数据包的数量,中间不包含任何“O”数据包。
- 计算一行中“O”数据包的数量,中间不包含任何“I”数据包。
- 计算出“I”数据包数量与“O”数据包数量的粗略比例。
- 如果你是阅读(下载)文件,并且比例不高度支持“I”数据包(进入你计算机的数据包),那么协议就是健谈。
- 如果你是写作(上传或修改)文件,并且比例不高度支持“O”数据包(来自您计算机的数据包),则协议是健谈。
- 检查尺寸每个数据包相对于您对大型文件的原始 HTTP 下载的预期连接吞吐量。
- 将延迟乘以往返次数,再加上文件的传输时间,得出一个数字,该数字应该是大约25秒。
解决方案:减少延迟,或使用较新版本的 Windows Server 支持的较新版本的 SMB 协议(应用程序轮换次数更少,因此在 WAN 上性能更高),或使用 FTP 之类的通信量非常低的协议(但访问大量文件时开销仍然很高),或者直接在服务器上操作,仅根据需要将数据批量(例如 zip 文件)传输到远程服务器。
答案2
看这个问题了解您可以采取哪些措施来加速网络驱动器,例如将其置于“慢速链接”模式,以便文件最终同步。这有很大帮助,因为您正在读取和写入本地磁盘而不是网络。