Tomcat, потребляющий высокий процессор - PullRequest
13 голосов
/ 22 апреля 2009

Tomcat.exe потребляет 75% процессорного времени. У кого-нибудь есть идеи, почему это происходит и как это можно уменьшить?

Я использую Tomcat5.5 & J2SDK v 1.4.2_12

Ответы [ 9 ]

10 голосов
/ 22 апреля 2009

Если вы используете 75% ЦП и не понимаете почему, я предлагаю вам запустить kill -3 для процесса tomcat (ctrl-break, если у вас есть консоль), чтобы получить дамп потока (при высокой нагрузке! ). По моему опыту, большинство потоков должно быть либо в режиме ожидания, либо в режиме ожидания. Ищите любую отдельную ветвь кода, которая повторялась в следах стека, и это ваш вероятный виновник (не-io ждет!). Это «профиль бедняков», который зачастую является лучшим и наиболее эффективным способом решения этих проблем.

4 голосов
/ 02 ноября 2011

Мои журналы были полны журналов Tomcat. Я удалил их все, и загрузка ЦП резко снизилась.

4 голосов
/ 22 апреля 2009

Лямбда-зонд - очень удобный инструмент для мониторинга Tomcat.

Используете ли вы четырехъядерный процессор? Вероятно, Tomcat работает на 100% в 3 из них. Сначала я бы проверил наличие бесконечного цикла или чего-то подобного в приложении.

4 голосов
/ 22 апреля 2009

Чтобы понять, что происходит, вы должны попытаться запустить его под профилировщиком. Попробуйте YourKit (http://www.yourkit.com/) или Netbeans (http://profiler.netbeans.org/docs/help/5.5/profile_j2ee_profileproject.html).

)

YourKit one лучше интегрирован с tomcat.

3 голосов
/ 28 июня 2010

Прежде всего (это относится ко всем Java-приложениям), вы должны определить, какой поток использует ЦП. Это возможно в JDK 1.6. Это делается с помощью java.lang.management.ManagementFactory.getThreadMXBean (). Вот пример использования (JSP):

<%@ page import="java.lang.management.*, java.util.*" %>
<%!
    Map cpuTimes = new HashMap();
    Map cpuTimeFetch = new HashMap();
%><%
long cpus = Runtime.getRuntime().availableProcessors();
ThreadMXBean threads = ManagementFactory.getThreadMXBean();
long now = System.currentTimeMillis();
ThreadInfo[] t = threads.dumpAllThreads(false, false);
for (int i = 0; i < t.length; i++) {
    long id = t[i].getThreadId();
    Long idid = new Long(id);
    long current = 0;
    if (cpuTimes.get(idid) != null) {
        long prev = ((Long) cpuTimes.get(idid)).longValue();
        current = threads.getThreadCpuTime(t[i].getThreadId());
        long catchTime = ((Long) cpuTimeFetch.get(idid)).longValue();
        double percent = (current - prev) / ((now - catchTime) * cpus * 10000);
        if (percent > 0 && prev > 0) {
            out.println("<li>" + t[i].getThreadName() + " " + percent + " (" + prev + ", " + current + ")");    
        }
    }
    cpuTimes.put(idid, new Long(current));  
    cpuTimeFetch.put(idid, new Long(now));
}
%>

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

1 голос
/ 01 февраля 2019

В моем случае я только что установил Tomcat8 с настройками по умолчанию. Я должен был установить параметры памяти -Xms -Xmx. Как только я увеличил выделение памяти для JVM, загрузка ЦП резко снизилась.

1 голос
/ 04 декабря 2018

Мы только что решили проблему с нашим экземпляром tomcat, который работает с очень высокой загрузкой процессора, размахивая до 100% и более каждые несколько секунд, а затем на короткое время снова. Это происходило весь день и всю ночь, независимо от того, выполнял ли сервер какую-либо работу или нет. Мы работаем с Tomcat 8 с Java 8.

Мы не нашли нашего решения в веб-поиске, поэтому я публикую его здесь в надежде помочь кому-то еще.

Мы использовали параметр конфигурации в каталоге tomcat / conf / Catalina / localhost, в котором мы указали tomcat на другой каталог, отличный от его собственного каталога webapps. XML-файлы в этом каталоге выглядят так:

<?xml version='1.0'?>
<Context
docBase="/opt/dspace/amaddev/dspace-6.3/webapps/jspui"
reloadable="true"
cachingAllowed="false"/>

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

Чтобы проверить, мы удалили файлы xml из каталога conf / Catalina / localhost и перезапустили tomcat. Внезапно у нас снова появился нормальный, хорошо себя ведущий кот. Чтобы указать tomcat на этот другой каталог (где мы компилируем наш код dspace), мы просто использовали запись Host в conf / server.xml и изменили настройку appBase на наш каталог dspace:

<Host name="localhost"  appBase="/opt/dspace/amaddev/dspace-6.3/webapps"
        unpackWARs="true" autoDeploy="true">

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

1 голос
/ 22 апреля 2009

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

Как сказал J-16 SDiZ, лучше всего запустить профилировщик, чтобы сузить проблему до одного приложения.

0 голосов
/ 22 апреля 2009

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

...