вопрос
- Может ли бесконечный цикл вызвать всплеск загрузки ЦП?
- Приведет ли частое использование Young GC к скачку загрузки ЦП?
- Испытывают ли приложения с большим количеством потоков высокую загрузку ЦП?
- Каково количество потоков для приложения с высокой загрузкой ЦП?
- Вызывают ли потоки в состоянии BLOCKED резкое увеличение загрузки ЦП?
- ЦП в операционной системе с разделением времени потребляет
us
все ещеsy
?
идеи
1. Как рассчитать загрузку процессора?
CPU% = 1 - idleTime / sysTime * 100
- idleTime: время простоя ЦП
- sysTime: сумма времени, в течение которого ЦП находится в пользовательском режиме и в режиме ядра.
2. Что связано с использованием процессора?
Часто говорят, что программы, интенсивно использующие вычислительные ресурсы, требуют больше ресурсов процессора.
Итак, какие операции в приложении JAVA требуют больше ресурсов ЦП?
Обычные операции с интенсивным использованием ЦП перечислены ниже:
- Частый GC; если объем доступа высок, это может привести к частым GC или даже FGC. Когда объем вызовов большой, выделение памяти будет настолько быстрым, что поток GC будет выполняться непрерывно, что вызовет скачок загрузки ЦП.
- Сериализация и десериализация. Пример будет приведен позже: когда программа выполняет синтаксический анализ xml, количество вызовов увеличивается, что приводит к перегрузке ЦП.
- сериализация и десериализация;
- Регулярное выражение. Я столкнулся с ситуацией, когда регулярное выражение заполняет ЦП; причина может заключаться в том, что реализация механизма, используемая регулярным выражением Java, является автоматом NFA, который будет выполнять поиск с возвратом во время сопоставления символов.
- Переключение контекста потока; есть много запущенных потоков, состояние которых меняется между Blocked (ожидание блокировки, ожидание ввода-вывода и т. д.) и Running. Это может легко произойти, когда конкуренция за блокировку высока.
- Некоторые потоки выполняют неблокирующие операции, такие как
while (true)
утверждение. Если вычисления в программе занимают много времени, поток можно перевести в спящий режим.
3. Связан ли ЦП с процессами и потоками?
Теперь операционные системы с разделением времени используют циклический подход для выделения временных интервалов для планирования процессов. Если процесс ожидает или блокируется, он не будет использовать ресурсы ЦП. Потоки называются облегченными процессами и совместно используют ресурсы процесса. Следовательно, планирование потоков также является разделением времени в ЦП. Но в Java мы используем JVM для планирования потоков. Таким образом, в общем случае существует два режима планирования потоков: планирование с разделением времени и упреждающее планирование.
Отвечать
1. Приведет ли бесконечный цикл while к скачку загрузки ЦП?
да.
Во-первых, бесконечный цикл будет вызывать регистр ЦП для подсчета, эта операция потребляет ресурсы ЦП. Итак, если поток всегда находится в бесконечном цикле, будет ли ЦП переключать потоки?
Бесконечный цикл не освобождает занятый ресурс ЦП, пока не истечет квант времени операционной системы, и бесконечный цикл будет продолжать запрашивать кванты времени у системы до тех пор, пока у системы не останется свободного времени, чтобы делать что-либо еще.
Этот вопрос также задавался в stackoverflow: почему непреднамеренные бесконечные циклы увеличивают загрузку ЦП?
stackoverflow.com/questions/2…
2. Приведут ли частые сборщики мусора Young GC к резкому увеличению загрузки ЦП?
да.
Сам Young GC — это операция, которую JVM использует для сборки мусора, ей нужно вычислять память и вызывать регистры. Поэтому частые молодые сборщики мусора должны потреблять ресурсы ЦП.
Давайте рассмотрим случай из реальной жизни. Цикл for запрашивает набор данных из базы данных, а затем снова инкапсулирует новый набор данных. Если для хранения недостаточно памяти, JVM восстановит данные, которые больше не используются. Таким образом, если требуется большое пространство для хранения, вы можете получить предупреждение об использовании ЦП.
3. Использует ли приложение с большим количеством потоков высокую загрузку ЦП?
время от времени.
Если общее количество потоков велико при проверке состояния системного потока через jstack, но количество потоков в состояниях Runnable и Running мало, загрузка ЦП не обязательно высока.
Я столкнулся с ситуацией, когда количество системных потоков превышает 1000, и более 900 из них находятся в состоянии BLOCKED и WAITING. Этот поток занимает очень мало процессорного времени.
Но в большинстве случаев, если количество потоков велико, то общая причина заключается в том, что большое количество потоков находится в состоянии BLOCKED и WAITING.
4. Большое ли количество потоков для приложений с высокой загрузкой ЦП?
нет.
Ключевым фактором высокой загрузки ЦП являются операции с интенсивными вычислениями. Использование ЦП также может быть высоким, если в одном потоке выполняется много вычислений. Вот почему задачи сценариев данных необходимо запускать на крупномасштабных кластерах.
5. Будут ли потоки в состоянии BLOCKED вызывать резкое увеличение загрузки ЦП?
Не будет.
Всплеск загрузки ЦП больше связан с переключением контекста или слишком большим количеством запущенных потоков. Поток в заблокированном состоянии не обязательно приводит к увеличению использования ЦП.
6. Если значение us или sy ЦП в операционной системе с разделением времени велико, что это означает?
Вы можете узнать значение процессора с помощью командыus
а такжеsy
ценностьtop
, как показано в следующем примере:
us
: процент ЦП, занимаемый пользовательским пространством. Проще говоря, кайф у нас вызывается программой. Поток-нарушитель легко найти, проанализировав стек потоков.sy
: Процент пространства ЦП, занятого пространством ядра. Когда sy имеет высокое значение, если это вызвано программой, то это в основном связано с переключением контекста потока.
Опыт
Как узнать причину высокой загрузки процессора? Процесс анализа кратко описан ниже.
Если вы обнаружите, что загрузка ЦП вашего сервера приложений высока, сначала проверьте такие параметры, как количество потоков, JVM, загрузка системы и т. д., а затем используйте эти параметры для доказательства причины проблемы. Во-вторых, используйте jstack для вывода информации о стеке и используйте инструменты для анализа использования потоков (рекомендуется fastThread, онлайн-инструмент для анализа потоков).
Вот реальный случай:
Однажды ночью я внезапно получил сообщение о том, что загрузка ЦП достигла 100%. Затем я экспортировал информацию о стеке потоков с помощью jstack.
Проверьте журналы дальше:
onsumer_ODC_L_nn_jmq919_1543834242875 - priority:10 - threadid:0x00007fbf7011e000 - nativeid:0x2f093 - state:RUNNABLE
stackTrace:
java.lang.Thread.State:RUNNABLE
at java.lang.Object.hashCode(Native Method)
at java.util.HashMap.hash(HashMap.java:362)
at java.util.HashMap.getEntry(HashMap.java:462)
at java.util.HashMap.containsKey(HashMap.java:449)
at com.project.order.odc.util.XmlSerializableTool.deSerializeXML(XMLSerializableTool.java:100)
at com.project.plugin.service.message.resolver.impl.OrderFinishMessageResolver.parseMessage(OrderFinishMessageResolver.java:55)
at com.project.plugin.service.message.resolver.impl.OrderFinishMessageResolver.parseMessage(OrderFinishMessageResolver.java:21)
at com.project.plugin.service.message.resolver.impl.AbstractResolver.resolve(AbstractResolver.java:28)
at com.project.plugin.service.jmq.AbstractListener.onMessage(AbstractListener.java:44)
Теперь обнаружил проблему в этом журнале: метод, используемый для десериализации объекта сообщения MQ, вызвал скачок использования ЦП.
адрес блога:www.liangsonghua.com
Обратите внимание на общедоступную учетную запись WeChat: отчет о консервированных яйцах Songhua Preserved Egg на доске, становитесь более захватывающим!
Введение в общедоступную учетную запись: делитесь техническими знаниями о работе на JD.com, а также технологиями JAVA и лучшими отраслевыми практиками, большинство из которых являются прагматичными, понятными и воспроизводимыми.