Как вы оцениваете, сколько памяти купить?

10

У меня есть пользовательское серверное приложение, которое работает на Windows 2008 R2. Это домашняя служба Windows, написанная на .Net и поддерживающая несколько пользовательских терминалов. У меня есть тестовая машина, которая имеет спецификации, аналогичные действующему серверу, и у меня есть набор клиентских симуляторов, которые я могу использовать для создания нагрузки, которая является разумным приближением к реальной системе. Я должен быть в состоянии поддерживать 12 000 из них, и в настоящее время серверу не хватает памяти (пейджинг идет через крышу).

Мой план состоял в том, чтобы запустить только 100 из симуляторов, измерить использование памяти, затем снова запустить еще 100 измерить память и повторять до тех пор, пока пейджинг не начнет расти (на самом деле я буду брать более трех точек данных.) Это должно дать мне цифру для объем дополнительной памяти, необходимый для 100 симуляторов и позволяет мне прогнозировать, сколько памяти требуется. Мне нужна только приблизительная идея +/- 30 ГБ, чтобы не покупать полные 2 ТБ (стоимостью 150 000 долларов), которые займет сервер. Мой вопрос заключается в том, является ли этот метод разумным для использования, и если да, то какие счетчики производительности вы бы отслеживали, чтобы определить объем фактически используемой памяти?

Я специально говорю о памяти здесь, так как разница между рабочим набором, частными байтами, фиксированным, общим, виртуальным и всеми другими терминами памяти сбивает меня с толку. Я думаю, что смогу самостоятельно контролировать процессор, ввод-вывод и работу в сети. Еще одна вещь, которую я заметил, заключается в том, что .Net Cache регулирует использование памяти в зависимости от того, что доступно, что затрудняет определение тенденции.

Мартин Браун
источник
Я был бы очень осторожен при проектировании использования памяти, основываясь на двух точках данных, расположенных так близко друг к другу. У меня были бы серьезные сомнения в том, что использование памяти (и, соответственно, ввода / вывода) будет линейно масштабироваться. Возможно, но я подозреваю, что при переходе к большим числам он будет стремиться к нелинейности. Я бы протестировал несколько точек данных, переходя от малого к большому, пока производительность не станет проблематичной (разбиение по страницам, насыщение ввода-вывода и т. Д.), И проект оттуда. Если бы можно было постепенно модернизировать машину и продолжить моделирование с большим количеством клиентов, я буду делать это, пока у меня не появится хорошее представление о форме кривой.
Эван Андерсон
Вы также должны немного лучше понять, что это такое. Это веб? ASPX? PHP? Что-то доморощенное? Пакетные работы? Поведение asp.net отличается от загрузки исполняемых файлов на коробке. Вам нужно некоторое общее представление о том, что система использует на пользователя - ок. цифры - а потом старый конверт. Как вы получите эти цифры, зависит от того, как работает ваша система.
Ян Мерфи
@Evan. Я всегда собирался взять более двух точек данных.
Мартин Браун
@Ian: «какая-то базовая идея о том, что система использует на пользователя» - это именно то, что я пытаюсь выяснить. Если бы я знал это, мне не нужно было бы задавать вопрос. Я обновил вопрос, чтобы попытаться охватить другие ваши вопросы.
Мартин Браун

Ответы:

8

Честно? Я НЕ .
При задании сервера, который будет воспринимать любую реальную рабочую нагрузку, я встраиваю столько оперативной памяти, сколько я могу себе позволить (системы с большей вероятностью будут ограничены в ОЗУ, чем в ЦП или на диске - единственное другое гарантированное узкое место - это лицевая сторона автобус).

Если вы хотите выяснить, сколько ОЗУ ваше приложение может использовать базовый нагрузочный тест, как вы предложили, это хорошее начало, но если у вас уже есть эта система в работе (похоже, что вы делаете), и ваша производственная система меняет вашу задача проще: выясните, сколько пространства подкачки вы используете -> добавьте как минимум в 2 раза больше оперативной памяти (округлите в соответствии с ограничениями размера DIMM вашей системы).

Если вы выполняете нагрузочный тест, чтобы получить приблизительные значения и экстраполировать оттуда, не забывайте учитывать несколько вещей:

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

  2. Вам все еще нужна свободная оперативная память для кэширования дисков и общих библиотек, а также для ОС.
    (Это должно быть как минимум несколько концертов по поводу того, что нужно вашему приложению)

  3. ВСЕ программное обеспечение протекает из памяти (по крайней мере, из любого практического программного обеспечения), поэтому следите за этим во время тестирования и убедитесь, что у вас есть место для устранения утечки.

  4. Ваша нагрузка, вероятно, увеличится в течение срока службы сервера. Планируйте соответственно.
    (Если у вас нет хороших показателей планирования емкости, удвойте сегодняшнюю нагрузку и планируйте справиться с этим).

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

    • Первое следствие: если вы покупаете немного больший сервер, чем вам нужно, вы - опытный администратор, который поддерживал работу компании. Вы будете в значительной степени проигнорированы и недооценены.
    • Второе следствие: если вы недооцениваете машину и у вас есть проблемы, вы - некомпетентный шут, который не может ожидать роста в 500%, и все вас ненавидят.
voretaq7
источник
Я одобряю следствия.
mfinni
Спасибо за это. Хотя у нас есть эта система, она в настоящее время поддерживает очень маленькую пробную версию, а это значит, что я не могу получить хорошие цифры от нее.
Мартин Браун
0

Спасибо, обновление, по крайней мере, дает всем понять. То, что вы рассматриваете 2 ТБ памяти, означает, что вы играете в другом поле, чем обычные настройки. Большая система. Ненавижу думать о том, сколько тепла будет выделяться.

Учитывая, что это внутренний серверный процесс и вам не хватает памяти (вы не говорите, на каком уровне вы начинаете пейджинг), но я бы хотел исключить возможность того, что серверный процесс потребляет все большие объемы памяти, прежде чем дальше. Если это происходит, то не имеет значения, что вы делаете, система в какой-то момент остановится.

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

Быстрый возврат к расчету конверта:

2Tb of memory = 1024Gb = 1024*1024Mb = 1048576Mb
1048576Mb / 13000 connections = around 80mb per session

Это не будет вне диапазона нормального рабочего набора .net exe.

Служба имеет несколько потоков? Если они запускают поток для каждого соединения, стоит посмотреть, как они это делают. ProcExp.exe от Microsoft - это простой способ узнать, есть ли у вас несколько потоков и что они потребляют. Он не знает о .net, но даст вам счетчики win32.

Можете ли вы указать, сколько памяти и сколько подключений было у вас при тестировании до начала подкачки?

Итак, как установить, если процесс сервера имеет проблемы утечки памяти? Это может накапливать больше памяти с каждым подключенным сеансом или накапливать память и не освобождать их никогда.

Что вы можете сделать, это выбрать несколько сеансов, которые не провоцируют пейджинг, и имитировать это количество соединений. - Запустите симуляцию в течение нескольких часов и используйте perfmon для просмотра основных счетчиков памяти. - Повторите эти тесты с сеансами, которые кратко подключаются и отключаются.

Идея состоит в том, чтобы увидеть, потребляет ли сервис все больше и больше памяти с каждым сеансом, или открытые сеансы провоцируют постоянно увеличивающееся использование памяти.

Ян Мерфи
источник