Tomcat потребляет высокую процессор
котяра.exe потребляет 75% процессора. Кто-нибудь знает, почему это происходит и как это можно уменьшить?
Я использую Tomcat5.5 & J2SDK v 1.4.2_12
7 ответов
чтобы понять, что происходит, вы должны попробовать запустить под профайлером. Попробуйте YourKit (http://www.yourkit.com/) или Netbeans (http://profiler.netbeans.org/docs/help/5.5/profile_j2ee_profileproject.html).
YourKit имеет лучшую интеграцию с tomcat.
Если вы используете 75% CPU и не понимаете, почему, я предлагаю вам выпустить kill -3 для процесса tomcat (ctrl-break, если у вас есть консоль), чтобы получить дамп потока (когда нагрузка высока!). По моему опыту, большинство потоков должны быть либо бездействующими, либо в io-wait. Ищите любую одну ветвь кода, которая повторилась в трассировках стека, и это ваш вероятный виновник (не-io ждет!). Это "профилировщик Бедняков", который довольно часто является лучшим и наиболее эффективным способом их решения проблемы.
Лямбда-Зонд очень удобный инструмент для мониторинга Tomcat.
вы используете систему Quad CPU? Вероятно, Tomcat работает на 100% в 3 из них. Сначала я бы проверил бесконечный цикл или что-то в этом роде в приложении.
мои журналы были полны журналов Tomcat. Я удалил все из них, и использование процессора резко снизилось.
прежде всего (это относится ко всем приложениям java) вы должны определить, какой поток использует CPU. Это возможно в JDK 1.6. Это делается с помощью Java.ленг.управление.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));
}
%>
после этого вы можете получить дамп потока и проанализировать код в этом потоке, чтобы исправить чрезмерное использование ЦП.
все ответы охватывают, как сделать точный диагноз, кроме того, я бы добавил, что, по моему опыту, бесконечный цикл в одном из ваших приложений, вероятно, является виновником.
Как сказал J-16 SDiZ, лучше всего запустить профилировщик, чтобы сузить проблему до одного приложения.
Это, скорее всего, вызвано приложением(приложениями), которое вы используете поверх tomcat. Конечно, если у вас очень высокий трафик на ваших приложениях, это также может быть причиной.