Как это возможно? Параллельно. Для странности - PullRequest
0 голосов
/ 04 февраля 2012

У меня есть 2 сервера с разными спецификациями, но оба они используют одно и то же приложение.

Сервер 1 - это Hyper-V с 2 x 2,4 ГГц, сервер - это VPS и имеет 2 x Intel Xeon CPU E55402.53 ГГц.

У меня есть универсальный обработчик, который берет некоторые вещи из формы и обрабатывает некоторые данные в списке некоторых объектов параллельно, используя Parallel.For.Я использую по умолчанию MaxDegreeOfParallelism.Ничего странного.

Но ... Когда я включил некоторую регистрацию, чтобы выяснить, почему второй сервер лучше (быстрее) делает то же, что и первый сервер, результаты не соответствуют тому, что вы обычно делаете.думаю, что реальность должна быть такой.

«Проблема» в том, что у меня есть журналы с сервера 1, которые выглядят так (отрывок):

ÖVERKALIX -> table.Select [1]: 78,125 мс doubles.AddRange: 0 мс результатов [0]: 0 мс

ÖVERKALIX -> таблица. Выберите [1]: 62,5 мс doubles.AddRange: 0 мс результатов [0]: 0 мс

ÖVERTORNEÅ -> table.Select [1]: 62,5 мс doubles.AddRange: 0 мс результатов [0]: 0 мс

ÖVERTORNEÅ -> table.Select [1]: 78,125 мс doubles.AddRange:Результаты 0 мс [0]: 0 мс

Всего серверных атрибутов exekvera 592 Время: 20062,5 мс

И журнал второго (например, отрывок):

ÖVERKALIX -> table.Select [1]: 99 мс doubles.AddRange: 0 мс результатов [0]: 0 мс

ÖVERKALIX -> table.Select [1]: 103 мс doubles.AddRange: 0 мс результатов [0]: 0 мс

ÖVERTORNEÅ -> table.Select [1]: 100 мс doubles.AddRange: 0 мс результатов [0]: 0мс

ÖVERTORNEÅ -> таблица. Выберите [1]: 104 мс doubles.AddRange: 0 мс результатов [0]: 0 мс

Всего серверных атрибутов exekvera 592 фрез: 4479 мс

Если вы посмотрите на это, то увидите, что здесь что-то странное.Первый сервер выполняет все отдельные запросы быстрее, чем второй сервер, но общее время всех запросов превышает второй сервер ...

ПОЧЕМУ?

Обычно вы думаете, что если нужно выполнить n операций, а каждая операция занимает t мс, то общее время этих операций НИКОГДА не должно быть больше, чем если бы у вас было n операций, для которых требуется каждая операция (например,) (t + 1) мс.

Но в любом случае, у нас есть записи, в которых говорится, что верно, что t> (t + 1).Я разочарован!Ну, я не эксперт, но это невозможно:)

Итак, что вы думаете по этому поводу?

Это из-за чего-то гиперпоточного?

Это потому, что для создания нового потока на первом сервере требуется больше времени (это кажется наиболее разумным ответом)?

Если это связано с проблемами создания потока, есть лиКак я могу измерить это?

ОБНОВЛЕНИЕ:

Я углубился в проблему, и возникла закономерность.Вот некоторые данные с сервера 1 (время в мс):

78,125 187,5 78,125 93,75 750 62,5 62,5 62,5 78,125 46,875 78,125 46,875 1203,125 62,5 1125 78,125 2500 62,5 46,875 78,125 62,5 62,5 1484,375 62,5 62,5 1437,5 62,5 78,125

И вот те же запросы, выполняемые на сервере 2:

104 104 156 116 117 116 114 115 112 107 110 112 164 128 128 124 112 111 99 104 109 105 241 115 116 115 112 112

Как видите, сервер 1 работает быстрее, но иногда (например, значения: 1203.125, 1484.375 и 2500) он занимает намного больше времени, чем сервер 2.

Итак, кажется, что сервер 1 работаетбыстрее для небольшого набора запросов, а сервер 2 быстрее (более плавный?) или большой набор запросов?

Можно ли сделать какие-либо выводы из этих чисел?

Почему мы видим эти различия?

Заранее спасибо!

1 Ответ

4 голосов
/ 04 февраля 2012

Здесь так много всего, что может происходить.

Во-первых, я ожидал бы, что сервер 2 будет быстрее .. В конце концов, он имеет более быстрые процессоры.

Вне:

Вы упоминаете, что ваше приложение работает на обоих серверах; однако оба они также являются виртуальными машинами.

Что еще работает на этих физических коробках? или даже что еще работает на виртуальных машинах?

Это может быть буквально что угодно. Может быть, на сервере 1 также есть виртуальная машина, которая выполняет запланированное задание так часто, что требует больших ресурсов ... Может быть, на сервере 1 есть совершенно другой дисковый массив, чей кэш записи не успевает за потребностями и вынужден время от времени останавливаться, чтобы смывать?

Возможно, сетевая карта сервера 1 перегружена входящими / исходящими данными, что опять-таки вызвано каким-либо запланированным заданием. Может быть, Боб, когда-либо услужливый системный администратор, любит заходить на сервер 1, чтобы он загрузил свое абсолютно легальное программное обеспечение msdn .

Дело в том, что никто не сможет рассказать вам о том, что происходит, так как в нем слишком много переменных.

С чего бы начать:

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

  2. Профиль. Что происходит с процессором, диском и памятью. Нужно ли серверу 1 выполнять страничную память на / с диска Другими словами, имеет ли он достаточно оперативной памяти, чтобы хранить ваше приложение и все его данные в памяти без необходимости его очистки? А как насчет Сервера 2?

  3. Если вы выполняете чтение с диска, каковы характеристики дисковода между двумя компьютерами. Вы могли бы иметь радикально различную производительность на почти идентичных машинах, где буквально разница only заключается в том, что один из них имеет диски SCSI со скоростью 15 000 об / мин в конфигурации RAID 0, а другой - один диск PATA 5400 об / мин.

  4. Я упоминал профилирование? Где происходит пауза, каково состояние физического оборудования во время паузы. Вы обрабатываете одинаковые данные на каждом ящике?

  5. Решите, имеет ли это значение. Вероятно, это должно быть номер 1. В конце концов, у вас другое аппаратное обеспечение, поэтому вы должны ожидать разные результаты производительности. Вероятно, единственное, что действительно имеет значение, это то, что Сервер 1 иногда испытывает паузу. В этом случае полностью игнорируйте сервер 2 и профилируйте сервер 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...