两个服务器之间的高效文件读/写

时间:2016-02-22 01:30:08

标签: c# .net file-io

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

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

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

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

1 个答案:

答案 0 :(得分: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
网络驱动器:5000毫秒

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

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

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

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

相关问题