【问题标题】:Windows - Does accessing data through "localhost" incur network stack overheadWindows - 通过“localhost”访问数据是否会产生网络堆栈开销
【发布时间】:2016-02-20 19:07:14
【问题描述】:

我有大量的音频文件,我正在通过处理算法尝试从中提取某些数据位(即:整个剪辑的平均音量)。我有许多构建脚本,这些脚本以前从 Samba 网络共享中提取输入数据,我已经创建了一个网络驱动器映射到通过 net use(即:M: ==> \\server\share0)。

现在我有了一个新的 1TB 大容量 SSD,我可以将文件存储在本地并非常快速地处理它们。为了避免大量重写我的处理脚本,我删除了我的网络驱动器映射,并使用localhost 主机名重新创建它。即:M: ==> \\localhost\mydata.

当我使用这种映射时,我是否会冒着产生重大开销的风险,例如数据必须通过 Windows 的网络堆栈的一部分,或者操作系统是否使用任何快捷方式,因此它或多或少等同于直接访问磁盘(即:机器是否知道它只是从自己的硬盘驱动器中提取文件)。 延迟增加并不是我关心的问题,但最大持续平均吞吐量至关重要。

我问这个是因为我正在决定是否应该修改我的所有处理脚本以使用不同的网络路径样式。

额外问题:Linux 主机是否同样如此:它们是否足够聪明,可以知道它们是从本地磁盘提取的?

【问题讨论】:

  • 吞吐量会受到一定影响。在旋转驱动器上,增加的每个文件开销占性能损失的大部分,因此如果您正在处理少量大文件,它可能不会被注意到。在SSD上我不知道。试试看!
  • ... 但在这种情况下,最佳 解决方案可能是使用subst 为文件夹分配驱动器号。其开销可以忽略不计,并且不涉及网络堆栈。
  • 问题似乎假设了两个可能的答案:操作系统优化了对映射到本地共享的驱动器的访问,而它没有。但这并不是那么简单。在您的应用程序和它的数据之间的堆栈中有很多层。在 Linux 和 Windows 上,将在网络层针对本地网络连接进行一些优化(至少避免 MAC 层及以下层)。但是,本地驱动器与映射网络驱动器的代码路径肯定是不同的。在 Harry 的观点中,应用程序的行为会产生显着的差异。底线:确定要知道的基准
  • 这不取决于您使用的读取方法吗?您可以发布获取数据的方法吗?
  • @ChristopherBales 我将使用 XCOPY 命令通过 shell 脚本复制文件,并传递通过 substnet use 创建的网络映射驱动器,如果其中一个比另一个更快的话。跨度>

标签: windows localhost network-share network-shares


【解决方案1】:

为了确保使用 TCP 通过直接文件访问,即使使用“环回”,也会在 Linux 和 Windows 上产生诸如路由、内存分配等开销,是的,环回设备是非物理内核设备,并且比其他网络设备更快,但是不比直接文件访问快。据我所知,在 Windows 上还有其他环回优化,例如 NetDNA 和“Fast TCP Loopback”。

我假设环回设备的瓶颈将是内存(复制)进程。所以直接访问文件而不是通过回送设备在 linux 和 windows 上总是更快(并且资源消耗低)。

此外,这两个操作系统都通过 Windows 上的“命名管道”和 Linux 上的“unix 域套接字”解决了 IPC 的协议开销,使用这些也将比在适用时使用环回设备更快。

【讨论】:

    【解决方案2】:

    当我使用这种映射时,我是否会冒着产生大量开销的风险,

    是的。通过使用 UNC 路径 (\\hostname\sharename\filename) 而不是本地路径 ([\\?\]driveletter:\directoryname\filename),您可以让所有流量通过服务器消息块协议 (SMB / Samba) 发生。这通常会在磁盘访问和访问时间方面增加大量开销。

    网络上的流程是这样的:

    Application -> SMB Client -> Network -> SMB Server -> Target file system
    

    现在通过将文件移动到本地计算机,但仍使用 UNC 访问它们,流程如下:

    Application -> SMB Client -> localhost -> SMB Server -> Target file system
    

    您最小化的唯一一件事(没有消除,到 localhost 的 SMB 流量仍然涉及网络层以及所有相关的计算和流量)是网络流量。

    此外,鉴于 SMB 是专门为网络流量量身定制的,它的读取可能无法以最佳方式使用您的磁盘和操作系统的缓存。例如,它可能会读取特定大小的块,而您的磁盘在读取其他大小的块时会执行得更好。

    如果您希望获得最佳吞吐量和最短访问时间,请尽可能少地使用中间层,在这种情况下通过直接访问文件系统:

    Application -> Target file system
    

    【讨论】:

    • 与 UNC 路径相比,通过 substnet use 使用驱动器映射是否会消除一些开销?另外,substnet use 有什么不同或更好吗?谢谢。
    • 不,传输仍然会在 SMB 上通过 TCP 通过 localhost 进行,大多数额外的瓶颈都在此。 Subst 和 net use 仅用于创建同一资源的不同表示形式,它们不会从根本上改变访问该资源的方式。不过,AFAIK 无法查找 ATM。
    • 谢谢。这正是我想要的。
    • 能否为第二种情况提供一个示例,[\\.\]driveletter:\directoryname\filename。我尝试使用 `\\.\c:\` 来访问我的“C”驱动器,但语法似乎无效。
    • @Dogbert 我的错,见stackoverflow.com/questions/21194530/…。在你的情况下,它是\\?\C:
    猜你喜欢
    • 2011-12-15
    • 2013-04-03
    • 1970-01-01
    • 2010-12-25
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2015-06-02
    相关资源
    最近更新 更多