2012-08-17 5 views
5

В настоящее время я работаю над небольшим внутренним тестирующим приложением для создания нескольких типов нагрузки на компьютер, чтобы мы могли видеть, как наше программное обеспечение работает под нагрузкой. Я получаю зависание по одному запросу, так как я делаю способ указать процентное использование процессора (скажем, 40%) до того, как пользователь запустит программу, и, надеюсь, сохранит процессор в диапазоне + - 10% от того, что они вложили. Мне сказали, что раньше они видели программы, но все, что я видел, которые утверждали, что это так, не сработали. Я пытаюсь прочитать среднее использование и спящий поток работает так, что загрузка процессора снижается, но я обнаружил, что это не точно. Он также будет использоваться на нескольких серверах, каждый из которых имеет разные процессоры, поэтому я не могу делать очень жесткое кодирование, так как он должен работать на каждом сервере. Я лично не думаю, что его можно точно сделать, но я прошу здесь, как последнее усилие, чтобы посмотреть, не встретил ли кто-нибудь другой подобный программный продукт, и знает, как это будет написано.C# Сохранять процессор в/около указанного процента использования для целей тестирования

Редактировать: Я попытался использовать поток с более низким приоритетом, а также было сказано, что это не будет им полезно (хотя у меня была опция, созданная только для целей тестирования, прежде чем это было запрошено мной).

+0

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

ответ

3

Мы сделали что-то подобное, а затем снова настроили сервер приложений. Мы обнаружили, что наша общая пропускная способность была лучшей, когда процессор составлял около 70%. Наше решение состояло в том, чтобы развернуть дополнительные потоки с задержкой между ними, пока не будет достигнута желаемая нагрузка. Если CPU превысил 80%, мы уменьшили количество запущенных потоков (сигнализировали поток, чтобы завершить свою текущую работу, а затем прекратить). Если процессор упал ниже 60%, мы выпустили новый поток.

Вы можете применить аналогичную логику для создания искусственной нагрузки, которую вы можете настроить на целевое использование ЦП. Ваши потоки должны были бы балансировать CPU и не-CPU (IO, или просто спать), чтобы обеспечить точную настройку. Если ваши потоки очень интенсивные, каждый из них будет потреблять 1 процессорный ядро ​​примерно на 100%.

+0

Если вы не возражаете, я спрашиваю, как выглядела ваша нить? В настоящее время у меня просто есть постоянное сложение и вычитание в бесконечном цикле, и это полностью поглощает все ядро ​​(хотя машина, над которой я работаю в данный момент, не очень мощная) – wgallon

+0

@BillyGallon, Infinite CPU связанный цикл будет потреблять 100% ядра на любой машине (если планирование уровня ОС не будет планировать этот поток либо из-за приоритета, либо из других ограничений, то есть, как предложено usr) –

+0

Нити в нашем случае выполняли реальную работу, выбирая данные из таблицу БД, а затем выполнять вычисления на ней. Я подозреваю, что перемежающиеся вызовы Thread.Sleep (сон для случайных, но довольно коротких интервалов) с интенсивными вычислениями ЦП должны позволить вам создать поток, который усредняет скромное использование ЦП, чтобы у вас была разумная способность контролировать общую нагрузку, генерируемую несколькими потоками , –