Нагрузка на процессор порождением потоков - PullRequest
1 голос
/ 17 февраля 2012

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

В данный момент пользователь просто фоновый работник. Теперь, независимо от того, сколько «пользователей» я порождаю, нагрузка на процессор для ядер никогда не падает.

Теперь я довольно плохо знаком с многопоточностью, но я думаю, это связано с аппаратным ограничением, в данном случае, 4 ядер. Ядра настроены на работу, и после этого это просто вопрос временного среза.

Есть ли способы обойти это? Я бы хотел подчеркнуть как можно больше ядер.

Ответы [ 4 ]

3 голосов
/ 17 февраля 2012

Тестовый код, который я использую, приведен ниже.

Он создает поток для каждого ЦП, зарегистрированного в системе, и имеет каждый оборот потока, если вы не сбросите его обратно.

Переменная loadLevelобычно устанавливается полосой прокрутки с диапазоном 0..100.

Thread[] cpuLoadThread;
public Form1()
{
    InitializeComponent();

    cpuLoadThread = new Thread[Environment.ProcessorCount];

    for(int i = 0; i < cpuLoadThread.Length; i++)
    {
        cpuLoadThread[i] = new Thread(new ThreadStart(cpuLoadProc));

        cpuLoadThread[i].IsBackground = true;
        cpuLoadThread[i].Name = "CPU Load Thread";
        cpuLoadThread[i].Start();
    }

}


void cpuLoadProc()
{
    System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
    stopWatch.Start();

    while (true)
    {
        if (stopWatch.ElapsedMilliseconds > loadLevel)
        {
            Thread.Sleep(100 - loadLevel);
            stopWatch.Reset();
            stopWatch.Start();
        }
    }
}
0 голосов
/ 17 февраля 2012

VS2010 имеет довольно хорошую функциональность Load Test.Один из моих коллег написал пост в блоге о симуляции нескольких пользователей здесь .Основой для этого является написание нескольких модульных тестов для наиболее распространенных операций, выполняемых вашими пользователями, а затем позволить VS Load Test выполнить многопользовательскую работу за вас.

0 голосов
/ 17 февраля 2012

Это все зависит от алгоритма планирования ОС и CLR (так как он скрывает некоторые детали низкого уровня). Чтобы разрешить нескольким потокам запускать процессорное время среза между всеми потоками и прерываниями.

Этот код должен подчеркнуть его достаточно для вашего теста, если нет, вам может потребоваться выбрать C ++ или C

int nCores = 4;
for (int i = 0; i < nCores;i++ )
{
    var t = new Thread(() =>
                        {
                            while (true)
                            {
                            }
                        });
    t.Priority = ThreadPriority.Highest;
    t.Start();
}
0 голосов
/ 17 февраля 2012

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

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