Моделируйте устойчивую загрузку ЦП и скачки

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

def plot(xx, yy, good):
    """Plot data

    Good parts are plotted as black, bad parts as red.

    Parameters
    ----------
    xx, yy : 1D arrays
        Data to plot.
    good : `numpy.ndarray`, boolean
        Boolean array indicating if point is good.
    """
    import numpy as np
    import matplotlib.pyplot as plt
    fig, ax = plt.subplots()
    from matplotlib.colors import from_levels_and_colors
    from matplotlib.collections import LineCollection
    cmap, norm = from_levels_and_colors([0.0, 0.5, 1.5], ['red', 'black'])
    points = np.array([xx, yy]).T.reshape(-1, 1, 2)
    segments = np.concatenate([points[:-1], points[1:]], axis=1)
    lines = LineCollection(segments, cmap=cmap, norm=norm)
    lines.set_array(good.astype(int))
    ax.add_collection(lines)
    plt.show()

42
задан kjv 25 March 2010 в 19:50
поделиться

1 ответ

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

Тем не менее, мы можем смоделировать нагрузку 40% в течение, скажем, секунды, если процессор будет работать в течение 0,4 секунды и в режиме сна 0,6 секунды. Это дает среднее использование в 40% за эту секунду.

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

Следующий метод использует аргумент, который является желаемым использованием, а затем использует один процессор / ядро ​​до такой степени:

public static void ConsumeCPU(int percentage)
{
    if (percentage < 0 || percentage > 100)
        throw new ArgumentException("percentage");
    Stopwatch watch = new Stopwatch();
    watch.Start();            
    while (true)
    {
        // Make the loop go on for "percentage" milliseconds then sleep the 
        // remaining percentage milliseconds. So 40% utilization means work 40ms and sleep 60ms
        if (watch.ElapsedMilliseconds > percentage)
        {
            Thread.Sleep(100 - percentage);
            watch.Reset();
            watch.Start();
        }
    }
}

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

Следует иметь в виду две вещи:

  • в многоядерных системах вам придется создавать один поток для каждого ядра. В противном случае вы увидите, что задействуется только один процессор / ядро, дающее примерно «процентное соотношение / количество ядер».
  • Тема. Сон не очень точный. Это никогда не будет гарантировать точное время с точностью до миллисекунды, поэтому вы увидите некоторые изменения в своих результатах

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

56
ответ дан Isak Savo 26 November 2019 в 23:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: