【问题标题】:Efficient file read/write between two servers两台服务器之间的高效文件读/写
【发布时间】:2016-02-22 16:45:24
【问题描述】:

服务器 1 应用程序 (C# .NET) 执行文件写入,服务器 2 应用程序 (C# .NET) 执行文件读取(由服务器 1 应用程序写入的相同文件)。在这种情况下:

  1. 哪台服务器应该是最快、最有效的读取和写入的存储点?我想它应该是服务器 1,因为它写得最多。跨服务器读取的轻微延迟可以忽略不计。

  2. 哪个 .NET API(即 FileStream、File.WriteAllText 等)应该用于最可靠的网络文件访问(单线程写入但多线程读取)?

两台服务器位于同一个数据中心内,均运行 Windows Server 2012 并具有 SSD 存储。

【问题讨论】:

  • “存储点”是什么意思?
  • 文件应该存储在哪里。
  • 两个 SSD 的磁盘写入速度是否相同?关于#2,reliable 是什么意思?我从来没有遇到过网络文件读/写的可靠性问题(从 .NET API 的角度来看)
  • SSD 的速度相同。我主要想知道文件应该写在服务器 1 上还是服务器 2 上,以及跨服务器读取/写入文件的最佳方法是什么(即通过网络共享路径,将网络驱动器映射为本地等)。跨度>

标签: c# .net file-io


【解决方案1】:

你可以做一个非常简单的测试。例如,我创建了一个小型测试应用程序,它向本地驱动器和网络驱动器写入和读取 1000 个文件,每个文件 1000 字节。 代码如下:

    private void btnStart_Click(object sender, EventArgs e)
    {
        int count, size;
        count = Int32.Parse(tbCount.Text);
        size = Int32.Parse(tbSize.Text);
        string path = tbPath.Text;

        string stringToWrite = new string('A', size);

        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Start();

        for(int i=0;i<count;i++)
        {
            string fileName = System.IO.Path.Combine(path, i.ToString() + ".tst");
            System.IO.File.AppendAllText(fileName, stringToWrite);
        }

        sw.Stop();
        tbLog.Text += String.Format("{0} files with length {1} saved to {2} in {3}ms"+Environment.NewLine, count, size, path, sw.ElapsedMilliseconds);
    }

    private void btnRead_Click(object sender, EventArgs e)
    {
        int count;
        count = Int32.Parse(tbCount.Text);
        string path = tbPath.Text;

        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Start();

        for (int i = 0; i < count; i++)
        {
            string fileName = System.IO.Path.Combine(path, i.ToString() + ".tst");
            string temp = System.IO.File.ReadAllText(fileName);
        }

        sw.Stop();
        tbLog.Text += String.Format("{0} files loaded from {1} in {2}ms" + Environment.NewLine, count, path, sw.ElapsedMilliseconds);
    }

(第一个函数写入文件,第二个函数读取文件;大小、计数和路径由 UI 定义)。

结果如下:
写入 1000 个文件,每个文件 1000 个字节:
本地驱动器:800ms
网络驱动器:9000ms
读取 1000 个文件,每个文件 1000 个字节:
本地驱动器:500ms
网络驱动器:5000ms

所以你看到有人应该为远程访问付费——作者或读者。您还看到写入远程位置的时间是从远程位置读取的两倍

我认为应该根据您的应用程序和服务器功能的逻辑做出决定 - 哪个服务器更忙,哪个服务器应该快速处理信息?例如,如果第一台服务器以非常高的速度获取数据并且应该将所有数据快速实时保存到文件中,而第二台服务器可能会排队处理文件并花时间而不急于 - 那么文件应该是本地保存在第一台服务器上。如果第一台服务器只是写入文件并且它的处理器/IO 不是太忙,但第二台服务器通过处理文件加载到最大 - 让第一台服务器将文件传送到第二台服务器的本地驱动器。

还要考虑可扩展性 - 如果将来您需要 5 台“服务器 1”类型的服务器为单个服务器 2 写入文件怎么办?或者,5 台“服务器 2”类型的服务器同时处理单个服务器 1 写入的文件?还是许多服务器同时写入和读取文件?如果这些选项相关,可能是数据库或某些队列解决方案会更好。

但是,如果您不关心所有这些事情并且只希望获得更好的整体性能 - 那么,再次在本地写入文件并从远程位置读取会更快。

【讨论】:

  • 谢谢。将文件写入和读取已挂载的 NAS 驱动器是否比在具有 SSD 的服务器上本地写入文件和另一台通过网络读取的服务器上更好或更差?
  • 我不知道 - 它应该被测试并且我没有硬件可以尝试......如果你有一些测试环境,只需使用上面的代码并查看写入和读取时间。
猜你喜欢
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多