Как исправить моно, используя 100% CPU?

У меня возникла проблема, когда я запускаю фоновый процесс, используя mono 3.0.3 на коробке SLES, и при использовании top я обнаружил, что он использует 100% ЦП. Я искал и пробовал следующие возможные решения:

1) Установка переменной среды MONO_THREADS_PER_CPU на 1000, т.е.

export MONO_THREADS_PER_CPU=1000

Это не сработало. Я пробовал с 300, согласно этой теме, но это тоже не сработало .

2) Согласно этому потоку стека post, использование таймеров в программе, которая будет выполняться с использованием моно, может привести к высокой нагрузке на ЦП, однако я сделал очень простую тестовую программу с бесконечным циклом и запустил ее... и моно по-прежнему использовал 100% ЦП.

Это программа, которую я использовал, чтобы проверить, было ли это просто из-за использования таймеров:

    static void Main(string[] args)
    {
        while(true)
        {
            //Console.WriteLine("Stayin alive.");
        }
    }

3) Я подумал, что, возможно, это проблема в моно версии 3.0.3, поэтому я обновился до версии 3.6.0, которая, по-видимому, является последней версией, рекомендованной для SLES 11.3. Моно по-прежнему занимает 99-100% процессорного времени.

Так что я задаюсь вопросом, что происходит и как я могу решить эту проблему. Любая помощь очень ценится.


person Tino    schedule 28.07.2015    source источник
comment
Ваш тестовый код будет запускать 100% загрузку ЦП в любой системе (mono/.NET/c++/etc), это бесконечный цикл без выхода... Я предполагаю, что проблема в вашем коде, а не в настройке Mono. Не видя, что вы делаете, трудно сказать вам, как это исправить, но я предполагаю, что это неправильный путь. Тот факт, что поток является фоновым, не означает, что он не может потреблять ресурсы процессора.   -  person Ron Beyer    schedule 28.07.2015
comment
Вы пытались запустить код в вопросе, который вы связали? Это был бы лучший способ увидеть, являются ли таймеры проблемой. Как уже было сказано, бесконечные циклы всегда будут 100%, если вы где-то не спите.   -  person user1942027    schedule 28.07.2015
comment
как я могу решить эту проблему Не используйте глупые бесконечные циклы while, которые на самом деле ничего не делают. Вы можете вручную ограничить цикл, вызвав Thread.Sleep() с небольшим интервалом внутри вашего цикла. Кстати, одноядерная система будет на 100%. Двухъядерная система будет использовать 50%, в то время как трехъядерная система будет использовать 33% и т. д. ... поняли?   -  person Idle_Mind    schedule 28.07.2015
comment
Thread.Sleep() — это блокирующий вызов, он все равно будет использовать 100% доступных ресурсов.   -  person Null511    schedule 20.01.2018


Ответы (1)


Ограничение ЦП должно быть установлено на уровне Linux. Например:

https://unix.stackexchange.com/questions/151883/limiting-processes-to-not-exceed-more-than-10-of-cpu-usage

пример

cpulimit -l 50 COMMAND

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

person Kevin Seifert    schedule 28.07.2015
comment
Действительно, это был бесконечный цикл (причем однострочный). - person Tino; 29.07.2015