2009-04-22 3 views
12

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

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

+0

Когда я перезапускаю сервер Tomcat, лежа на 10-15%, я начинаю использовать приложение «А», после того, как он будет использоваться более чем в 5-6 раз, остановится на 60 - 70% и никогда не опустится. Затем мне нужно перезапустить сервер. То же самое приложение работает поверх коробки Production и не создает проблемы, но в поле UAT это ... – Miral

ответ

0

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

9

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

+0

Если вы хотите сохранить вывод в файле, вы можете использовать команду jstack: jstack > filename .PS jstack находится в jdf-распределения – Frizz1977

+0

Спасибо @ Frizz1977 :) – cig0

1

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

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

4

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

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

3

Прежде всего (это относится ко всем приложениям 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)); 
} 
%> 

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

4

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

Смежные вопросы