2009-04-22 39 views
12

Tomcat.exe đang tiêu thụ 75% CPU. Có ai có bất kỳ ý tưởng nào tại sao điều đó xảy ra và làm cách nào có thể giảm?Tomcat tiêu thụ CPU cao

Tôi đang sử dụng Tomcat5.5 & J2SDK v 1.4.2_12

+0

Khi tôi khởi động lại máy chủ Tomcat, nó nằm ở 10 - 15%, tôi bắt đầu sử dụng ứng dụng 'A', khi nó được sử dụng nhiều gấp 5-6 lần CPU dừng ở mức 60 - 70% và không bao giờ hạ thấp xuống. Tôi yêu cầu khởi động lại máy chủ sau đó. Các ứng dụng tương tự đang chạy trên hộp sản xuất và nó không tạo ra một vấn đề, nhưng trên hộp UAT nó là ... – Miral

Trả lời

0

này rất có thể gây ra bởi các ứng dụng (s) mà bạn đang chạy trên đầu trang của tomcat. Tất nhiên nếu bạn có lưu lượng truy cập rất cao trên các ứng dụng của bạn, điều này cũng có thể là lý do.

9

Nếu bạn đang sử dụng 75% CPU và không hiểu lý do tại sao, tôi đề nghị bạn phát hành kill -3 cho quá trình tomcat (ctrl-break nếu bạn có bàn điều khiển) để có được kết xuất chuỗi (khi tải cao !). Theo kinh nghiệm của tôi, hầu hết các chủ đề nên ở chế độ chờ hoặc chờ. Tìm kiếm bất kỳ chi nhánh mã nào đã lặp lại lần xuất hiện trong dấu vết ngăn xếp và đó là khả năng của bạn thủ phạm (không phải chờ đợi!). Đây là "hồ sơ của người nghèo", đó là cách tốt nhất và hiệu quả nhất để giải quyết những vấn đề này.

+0

Nếu bạn muốn lưu đầu ra trên tập tin bạn có thể sử dụng lệnh jstack: jstack > tên tệp .PS jstack là trong bản phân phối jdf – Frizz1977

+0

Cảm ơn @ Frizz1977 :) – cig0

1

Tất cả các câu trả lời đều đề cập đến cách chẩn đoán chính xác, ngoài ra tôi sẽ thêm vào đó, từ trải nghiệm của tôi, vòng lặp vô hạn trong một trong các ứng dụng của bạn có thể là thủ phạm.

Như J-16 SDiZ cho biết, đặt cược tốt nhất của bạn là chạy trình thu thập thông tin để thu hẹp sự cố xuống một ứng dụng.

4

Lambda Probe là một công cụ rất tiện dụng để theo dõi Tomcat.

Bạn đang sử dụng hệ thống quad CPU? Có lẽ Tomcat đang chạy 100% trong 3 người trong số họ. Trước tiên tôi sẽ thử nghiệm cho một vòng lặp vô hạn hoặc một cái gì đó như thế trong một ứng dụng.

3

Trước hết (điều này áp dụng cho tất cả các ứng dụng java), bạn phải ghim chuỗi nào đang sử dụng CPU. Điều này là có thể trong JDK 1.6. Nó được thực hiện bằng cách sử dụng java.lang.management.ManagementFactory.getThreadMXBean(). Dưới đây là ví dụ sử dụng (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)); 
} 
%> 

Sau đó bạn có thể có được một bãi chứa thread và phân tích các mã trong chủ đề này để sửa chữa sử dụng CPU quá mức.

4

Nhật ký của tôi chứa đầy nhật ký Tomcat. Tôi đã xóa tất cả chúng và việc sử dụng CPU đã giảm đáng kể.

Các vấn đề liên quan