2016-02-22 4 views
2

Приложение 1 сервера (C# .NET) выполняет запись файлов, а приложение Server 2 (C# .NET) выполняет чтение файлов (из тех же файлов, написанных приложением Server 1). В этом случае:Эффективное чтение/запись файлов между двумя серверами

  1. Какой сервер должен быть точкой хранения для быстрого и эффективного чтения и записи? Я полагаю, это должен быть Сервер 1, поскольку он пишет больше всего. Небольшая латентность в кросс-серверных чтениях может быть незначительной.

  2. Какой .NET API (то есть FileStream, File.WriteAllText и т. Д.) Следует использовать для обеспечения максимально надежного доступа к сетевому файлу (однопотоковая запись, но многопоточное чтение)?

Оба сервера расположены в одном и том же центре обработки данных, оба запускают Windows Server 2012 и имеют хранилище SSD.

+0

Что вы подразумеваете под «точкой хранения»? – Vikhram

+0

Где файлы должны храниться. – Nick

+0

Являются ли скорости записи на диск для обоих SSD одинаковыми? Re # 2, Что вы подразумеваете под «надежным»? У меня никогда не было проблем с надежностью для чтения/записи сетевых файлов (с точки зрения .NET API). – Vikhram

ответ

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); 
    } 

(Первая функция записывает файлы, вторая функция считывает файлы, размер, граф и путь определяется из пользовательского интерфейса).

Вот результаты:
    Запись 1000 файлов 1000 байтов каждый:
        Локальный диск: 800ms
        Сетевой диск: 9000ms
    Чтение 1000 файлов 1000 байтов каждый :
        Местный привод: 500мс
        Сетевой диск: 5000 мс

Таким образом, вы видите, что кто-то должен платить за удаленный доступ - писатель или читатель. Вы также видите, что запись в удаленное местоположение вдвое длиннее, чем чтение с удаленного места.

Я думаю, что решение должно быть принято на основе логики вашего приложения и функций сервера - какой сервер более занят, какой сервер должен быстро обрабатывать информацию? Например, если первый сервер получает данные с очень высокой скоростью и должен быстро сохранять все данные в файлах в реальном времени, а второй сервер может поставить очередь на обработку файлов и не спешить, - тогда файлы должны быть сохраненный локально на первом сервере. Если первый сервер просто пишет файлы, а его процессор/IO не слишком занят, а второй сервер загружается до максимума, обрабатывая файлы - пусть первый сервер доставляет файлы на локальный диск второго сервера.

Подумайте также о масштабируемости - что, если в будущем вам понадобятся 5 серверов типа «Сервер 1» для записи одного сервера 2? Или, 5 серверов типа «Сервер 2» одновременно обрабатывают файлы, написанные единственным сервером 1? Или много серверов записывают и читают файлы одновременно? Может быть, база данных или какое-то решение в очереди будет лучше, если эти параметры актуальны.

Но, если вам все это безразлично и просто нужно иметь лучшую общую производительность, то, опять же, запись локальных файлов и чтение из удаленного места происходит быстрее.

+0

Спасибо. Будет ли запись файлов на жесткий диск NAS и чтение с него лучше или хуже, чем запись файлов локально на сервере с SSD и другим сервером, читающим по сети? – Nick

+0

Я не знаю - он должен быть протестирован, и у меня нет оборудования, чтобы попробовать ... Если у вас есть тестовая среда, просто используйте вышеприведенный код и посмотрите время записи и чтения. – SashaDu