Почему ваш код не должен использовать 100% CPU? [закрыто]

42

Я говорю конкретно о программе на C # .NET 4, работающей на Windows XP или выше, но общие ответы также приемлемы.

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

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

Это правда? И если так, то почему? Раньше у меня было впечатление, что 100% загрузка ЦП предпочтительнее для интенсивной или длительной работы, и я не мог найти достойных источников по этому вопросу в любом случае.

Ник Уделл
источник
6
Если предположить, что ваше приложение - единственное, что работает на коробке, то, строго говоря, 100% загрузка ЦП на самом деле не плохая, а скорее, это может означать, что есть кое-что, что вы могли бы сделать лучше. Я мало работал с настольными приложениями, но, например, для веб-приложений я никогда не видел приложений, которые бы максимизировали нагрузку на процессор, и код, использующий эти циклы, был действительно оптимальным. Там всегда что-то не так. Однако это происходит потому, что в Интернете мы часто связаны с вводом / выводом, поэтому проблема с процессором кажется неуместной. Я уверен, что ваше приложение отличается.
Брэндон
7
Кроме того, разные операционные системы обрабатывают этот случай по-разному. Мой Windows-бокс, например, работает ужасно, если процессор загружен на 100%. С другой стороны, я видел, как сервер Linux работал на 100% CPU в течение нескольких дней подряд, и это было нормально. (Хотя мы выпустили исправление через несколько дней.)
Брэндон
17
Вы хотите выполнять работу как можно быстрее, не будучи чрезмерно расточительным. Если вы используете 100% ЦП для полезных вычислений, тогда это хорошо. Если вы используете 100% ЦП в бесполезных циклах, это пустая трата времени.
NWP
10
Вы заплатили за все это. Используйте все это.
Брайан Хупер
4
Этот вопрос, кажется, не по теме, потому что он касается электроники, а не программирования.

Ответы:

59

Если охлаждения недостаточно, процессор может перегреться. Но все они (ну, по крайней мере, все современные процессоры ПК) оснащены различными механизмами тепловой защиты, которые снижают тактовую частоту или, в конечном итоге, отключаются.

Так что да, на запыленном ноутбуке 100% загрузка процессора может вызвать временные проблемы, но ничего не сломается и не «ухудшится» (что бы это ни значило).

Для проблем, связанных с процессором, 100% загрузка процессора - правильный путь.

Что касается отзывчивости приложений (UI), это отдельная концепция от использования ЦП. Вполне возможно иметь неотвечающее приложение, которое использует 1% CPU, или адаптивное приложение, которое использует 100% CPU. Отзывчивость пользовательского интерфейса сводится к объему работы, выполненной в потоке пользовательского интерфейса, и приоритету потока пользовательского интерфейса по сравнению с другими потоками.

Joonas Pulakka
источник
3
и операционная система может даже принудительно задействовать режим охлаждения для ядер
ratchet freak
8
Я думаю, что реальный ответ заключается в том, что большинство процессов не связаны с процессором, а вместо этого связаны с вводом / выводом, поэтому обычно мы живем в мире, где 100% загрузка ЦП является ненормальной, по крайней мере для «общих / общих» вычислений.
ветрозащита
4
@windfinder Я бы сказал, что для «вычислений» достижение 100% вполне стандартно, но только до тех пор, пока «вычисления» должны что-то делать с математикой :), например, обработка запросов MySQL для меня не вычисление;)
yo '
@tohecz - В том смысле, в котором я использовал это, вычисление просто означает время процессора. Мы здесь просто ссоримся по терминологии, для меня все, что делает процессор - это вычисления (он «вычисляет»). Как специалист по данным, я также скажу, что большинство математик также связаны с вводом / выводом (помимо самой тривиальной математики). Много времени вы проводите в мире математики, чтобы найти способ эффективно сжимать / передавать данные на ваш процессор, чтобы поддерживать максимально возможную загрузку этого процессора (при этом, конечно, минимизируя неэффективность кэша).
ветрозащита
4
Анекдот о «пыльных ноутбуках»: в своих экспериментах с магистерской диссертацией я использовал 4-летний ноутбук в качестве бегуна. 24/7 100% загрузка процессора в течение 3 месяцев . После этого указанный ноутбук был переведен на серверную должность еще на 4 года, прежде чем в конечном итоге избавиться от призрака (возможно, из-за уже поврежденной проблемы с графикой).
Миколак,
15

Программы Windows (winforms / WPF) должны всегда реагировать. С наивной реализацией процесса, который использует ресурсы процессора на 100%, слишком просто заставить вашу программу или даже вашу систему казаться вялой и зависающей.

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

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

Питер Б
источник
3
Конечно, программы, выполняющие долгосрочные вычисления, вероятно, должны быть не приложениями winforms / wpf, а пакетными заданиями без пользовательского интерфейса. Это делает их проще, поскольку им не нужно заботиться о наличии отзывчивого потока пользовательского интерфейса и позволяет запускать их через планировщик задач и тому подобное. Если необходим пользовательский интерфейс, я бы по-прежнему рекомендовал запускать приложение в совершенно отдельном процессе (который может довольно легко реагировать на запросы; этого достаточно, чтобы избежать блокировки ожидания сообщения о состоянии из пакетного задания).
Ян Худек
15

Как правило, нет ничего плохого в том, что программа использует 100% CPU, хотя на самом деле она выполняет полезную работу и не отнимает время от чего-то более важного . Если конкретная аппаратная платформа, например, способна непрерывно использовать 100% -ный ЦП в течение одной секунды, прежде чем ей придется сбросить скорость до 50%, чтобы избежать перегрева, обычно лучше, если приложение выполняет полезную работуработать настолько быстро, насколько это возможно, и позволить процессору или ОС справиться с любым необходимым регулированием, чем для приложения, чтобы догадаться, насколько быстро оно «должно» работать. Если приложение или поток выполняет работу с низким приоритетом, что было бы полезно, но не всегда критично по времени, для ОС может быть полезно ограничить использование ЦП задачами с низким приоритетом до 50%, чтобы, если ЦП должен был это делать что-то быстро, оно будет готово к «спринту» на секунду, но приложение не должно беспокоиться о таких вещах, кроме запроса низкого приоритета потока.

Наибольшие ситуации, когда использование 100% ЦП плохо, это когда:

  • Приложение занято в ожидании какого-либо события, которое не будет ускоряться постоянным опросом [и может фактически быть отложено, если потраченная впустую проверка, выполненная ли задача, занимает ресурсы ЦП, которые в противном случае могли бы быть потрачены на выполнение задачи].

  • Приложение перерисовывает дисплей слишком часто. Определение «чрезмерно часто» будет в некоторой мере зависеть от природы устройства отображения и отображаемого контента. Если аппаратное обеспечение дисплея может отображать 120 кадров в секунду, могут быть случаи, когда анимация может отображаться со скоростью 120 кадров в секунду без добавления размытия в движении, но не может быть отображена чисто при более низкой частоте кадров без ее добавления. Если рендеринг кадра с размытым движением займет намного больше времени, чем рендеринг без него, то рендеринг со скоростью 120 кадров в секунду на оборудовании, которое его поддерживает, на самом деле может быть не более дорогостоящим, чем рендеринг с более низкой частотой кадров с размытым движением. [Простая ситуация: колесо с 29 спицами, вращающееся со скоростью один оборот в секунду. При 120 кадрах в секунду колесо, кажется, вращается с правильной скоростью и направлением; на скорости 60 кадров в секунду,

Бывший хорошо узнаваем как плохой. Второй немного более тонкий. Если один из них ориентирован на мобильную платформу, в некоторых случаях может быть желательно разрешить пользователям выбирать желаемую частоту кадров анимации, поскольку некоторые пользователи могут не беспокоиться о времени автономной работы, но хотели бы получить анимацию лучшего качества, в то время как другие допускают более низкое качество. анимация в обмен на лучшее время автономной работы. Вместо того, чтобы приложение пыталось угадать, где должен быть компромисс, может быть полезно позволить пользователю настроить его.

Supercat
источник
10

«Современные процессоры дешевы и быстро деградируют при 100% процессоре».

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

Процессоры не всегда имели терморегуляцию. Затем у некоторых AMD Durons возникли проблемы (якобы можно было их уничтожить, если бы они работали без радиатора). Теперь все процессоры ПК будут иметь встроенные датчики температуры, которые возвращаются в тактовую частоту процессора и замедляют тактовую частоту, чтобы предотвратить повреждение. Таким образом, вы можете обнаружить, что ваша программа использует 100% доступного процессора, но процессор работает только на 75% своей номинальной скорости, потому что его охлаждение неадекватно.

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

Как в Windows, так и в Linux есть центральные процессорные системы, которые будут управлять производительностью и температурным режимом. Поскольку это делается на уровне ОС, он может учитывать общее потребление ресурсов ЦП. Операционная система несет ответственность за управление оборудованием и предотвращение его неправильного использования пользовательскими программами. Ответственность за поддержание чистоты и работы вентиляторов несет владелец оборудования , а производитель в первую очередь должен установить соответствующие радиаторы и вентиляторы.

Есть несколько случаев, когда устройства имеют недостаточное охлаждение, но поток отдачи учит производителей не делать этого.

pjc50
источник
Это видео о взрывающейся AMD Duron, вероятно, подделка. Ваше заявление о терморегуляции остается в силе.
Сэм
1
Хм, я вынул это, поскольку я вижу довольно много утверждений на Google, что это было подделкой.
pjc50
3
Можно перегреть современный процессор Intel Core, написав код, который запускает движок SSE и намеренно отключает управление процессором в ОС. Похоже, что производители (даже сами Intel) разрабатывают тепловые требования, исходя из предположения, что ненормально (возможно?) Заставлять процессор все время вычислять заявленные 4 флопа за такт. Когда кому-то действительно удается написать код, который делает это, его процессор начинает перегреваться. См .: stackoverflow.com/questions/8389648/…
slebetman
^ «якобы можно было уничтожить один, если бы он работал без радиатора» - я «лично подтвердил», что раньше можно было уничтожить К7 без радиатора… ; это как, почти 2 десятилетия назад? !!
user2864740
3

Чтобы сыграть защитника дьявола: В некотором смысле, программа, которая не может достичь 100% использования, может вызвать худший износ: если она не приостановлена ​​в ожидании нажатия клавиши, есть вероятность, что она приостановлена ​​в ожидании дискового ввода-вывода большую часть времени. А диски - это (до сих пор обычно) большие механические устройства, которые подвержены механическому износу или риску удара / гироскопического воздействия при их перемещении, не говоря уже о потребляемой мощности.

Хаген фон Айцен
источник
В этом случае это просто сложный процесс с большим (в памяти) набором данных, который занимает несколько минут. Но это определенно хороший момент для других читателей.
Ник Уделл,
3

«... современные процессоры дешевы и быстро деградируют при 100% процессоре».

Вам не нужно беспокоиться о «деградации процессора» вообще. Современные процессоры не менее качественны, чем в прежние времена.

Это очень дорого (и дорожает каждые несколько лет) , чтобы сделать процессоры, несколько миллиардов , чтобы построить новый ФАБ не редкость (ссылка).

http://en.wikipedia.org/wiki/Semiconductor_fabrication_plant

Затраты на производство процессора зависят не больше. произведенных единиц. Это хорошо известный в экономике факт. Вот почему они могут быть проданы (относительно) "дешево" в конце концов. (Я думаю, здесь нет необходимости в ссылке)

Я могу перечислить ряд причин, по которым я считаю, что современные процессоры имеют тенденцию быть более качественными, чем в «прежние времена».

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

(С другой стороны, конечно, в настоящее время возможно больше ошибок для процессора с более чем 1,5 миллиардами транзисторов в обычном режиме, чем с несколькими тысячами транзисторов процессора семидесятых. Но это не противоречит моему ответу IMO. Процессоры в целом как правило, имеет много известных ошибок, по крайней мере, в микрокоде, но это не является предметом здесь.)

Есть еще больше причин не беспокоиться о деградации процессора для вашей программы:

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

    Должно быть ясно, что если вы используете CPU 100% 24/7 в течение всего года, он обычно умирает раньше, чем CPU, используемый только каждую вторую неделю один час. Но это верно и для автомобилей, кстати. Только в таких случаях я бы подумал об использовании процессора и возможном сне.

  • Вторая причина в том, что на самом деле очень сложно написать программу, которая использует 100% ЦП от ОС (например, в Windows). Кроме того, современные процессоры (обычно) имеют как минимум 2-4 ядра. Таким образом, традиционный алгоритм, который имеет тенденцию использовать 100% одноядерного ЦП, теперь имеет только 50% для двухъядерного ЦП (упрощенный, но наблюдаемый в реальных сценариях).

  • Более того, операционная система контролирует ЦП, а не вашу программу, поэтому, если есть другие приложения с таким же или более высоким приоритетом (что является значением по умолчанию), ваша программа получает только столько ЦП, сколько возможно, но другие приложения не будут голодать. (Конечно, это только упрощенная теория, и, конечно, многозадачность Windows, Linux и других не идеальна, но в целом я бы посчитал это верным).

«Ранее у меня сложилось впечатление, что 100% загрузка ЦП предпочтительнее для интенсивной или длительной работы».

Да, оставайся с этим. Но, например, если вы ожидаете и зацикливаетесь на другом процессе, другими словами, ничего не делая, было бы неплохо, если бы вы выполняли Thread.Sleep () несколько миллисекунд в этом цикле, предоставляя дополнительное время другим. В то время как это не является необходимым для хорошей многозадачной ОС, я решил некоторые проблемы с этим, например, для Windows 2000. (Это, конечно, не означает использование Sleep () в вычислениях, например ..)

Philm
источник
3
Хотя этот ответ верен сегодня, есть беспокойство о будущем. Раньше такое «твердотельное» означало предельную надежность, но теперь у нас есть MLC-вспышка, которая в некоторых случаях рассчитана только на 1000 циклов стирания на блок. Сколько времени до уменьшения размеров кристалла приводит к аналогичным явлениям для процессоров, которые должны постоянно работать на 100%?
Майкл
2
@ Майкл, процессоры не мутируют и пишут в энергозависимую память, но я все же понимаю, что вы пытаетесь сказать.
Питер
3

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

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

Скорость электромиграции зависит от температуры чипа, а срок службы удваивается на каждые (очень приблизительно) 10 ° C. Фактически это является основой теста под названием «HTOL» (срок службы при высоких температурах), который измеряет, сколько времени понадобится кристаллу, чтобы умереть, скажем, при 125 ° C. Микросхема, работающая при 125 ° C, выйдет из строя примерно в 100 раз быстрее, чем микросхема, работающая при 55 ° C, поэтому, если она рассчитана на срок не менее 10 лет при 55 ° C, чип может выйти из строя в течение 1 месяца при 125 ° C. Если чип работает при более приемлемой температуре, например, 85 ° C, такой чип все равно выйдет из строя как минимум в 5-10 раз быстрее, чем он был предназначен.

Конечно, процессоры обычно проектируются с учетом более высоких температур, поэтому обычно они могут работать годами при температуре 85 ° C в режиме 24/7 при 100% нагрузке. Поэтому я бы посоветовал вам не беспокоиться о «изнашивании» процессора, а беспокоиться только о том, подходит ли 100% загрузка с точки зрения разработки программного обеспечения.

Роман Старков
источник
Нахождение этого слова привело к поиску со многими результатами , которые хорошо читаются в сети SE ... многие из которых есть в Electronics.SE и SuperUser.
1

Если вы выполняете свой код на клиентах, 100% загрузка ЦП означает, что клиентские компьютеры в это время не могут использоваться ни для чего иного, кроме задач с более высоким приоритетом. Поскольку большинство приложений обычно работают с приоритетом по умолчанию, пользователи, использующие эти компьютеры, заметят зависание компьютера и не смогут делать ничего другого на своих компьютерах. Даже если мы говорим о коротких очередях, пользователи, работающие над чем-то, все равно заметят это.

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

Владимир Кочанчич
источник
6
Windows работает таким образом. В Linux и многих других системах потоки, которые ожидали чего-либо (пользовательский ввод), автоматически получают приоритет над потоками, расходуя свое выделенное время, поэтому интерактивные программы остаются отзывчивыми, даже если вы не играете с приоритетами.
Ян Худек
2
@JanHudec Windows на самом деле это делает. superuser.com/questions/194223/…
NtscCobalt
@NtscCobalt: Да. Что, видимо, не является Windows CE. И у Windows возникают серьезные проблемы всякий раз, когда процесс занимает много места на диске, но это, очевидно, что-то другое (обработка диска довольно плоха в Windows в целом).
Ян Худек
1

Таким образом, ситуация такова: у вас есть некоторый код, который выполняется, скажем, в течение пяти часов, используя 100% всех процессоров, который оптимизирован настолько, насколько вы можете, владелец машины в порядке с машиной, которую невозможно использовать в течение пяти часов, и ваш коллега утверждает, что было бы лучше запустить ваш код за 6 часов, используя 83,33% всех процессоров, потому что это снижает нагрузку на компьютер.

Это зависит от компьютера, который вы используете. Я знаю, что производитель компьютеров отказался от гарантийного ремонта в течение гарантийного срока на дешевых домашних компьютерах, которые использовались в научных условиях, работающих круглосуточно. Они явно хотели, чтобы клиент купил их более дорогие серверы или «деловые» компьютеры. Были ли они успешными, я не знаю.

Каждый мой Mac в какой-то момент имеет жизненный код при 100% -ной загрузке ЦП в течение нескольких дней. В одном случае мне пришлось выключить дисплей, потому что у меня не было оригинального зарядного устройства для ноутбука, а с 4 ядрами и гиперпоточностью оно потребляло больше энергии, чем поставляемое зарядное устройство - поэтому батарея разрядилась, и когда она достигла 5 процентов компьютер замедлял тактовую частоту, пока батарея не достигла 10%! (С выключенным дисплеем он работал на полной скорости в течение нескольких дней). Ни в коем случае никаких побочных эффектов.

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

gnasher729
источник
0

Если вы можете, сделайте свой код задачей с более низким приоритетом, и убедитесь, что поток с высокой загрузкой процессора отделен от графического интерфейса. Тогда вы можете использовать его на 100%, но пользователь всегда может выполнять другие задачи и оставаться отзывчивым. Сам по себе процессор рассчитан на то, чтобы какое-то время работать на 100%, иначе он не будет освобожден. Если конечный пользователь не внес серьезные и опасные изменения в свое оборудование, вы не сможете ничего повредить.

raptortech97
источник