2014-10-07 13 views
5

Tôi có một ứng dụng Java servlet trên Java 7 thường rất lành mạnh về mức tiêu thụ tài nguyên hệ thống. Thông thường việc sử dụng CPU trên máy chủ là dưới 50%. Tuy nhiên trong vài phút sau khi khởi động nó hoạt động rất khác nhau, đến mức mà CPU có thể trở thành pegged ở 100% trong vài phút nếu nó cố gắng để phục vụ rất nhiều lưu lượng truy cập trong thời gian đó. Kết quả là thời gian phản hồi chậm, thời gian chờ mạng, và thậm chí cả việc thu gom rác thải dài đôi khi tạm dừng.C2 Trình biên dịch bão hòa CPU lúc khởi động

Để chẩn đoán vấn đề, tôi mất một loạt các bãi chủ đề trong khi máy chủ đã được khởi động và tôi chạy -H đầu cùng một lúc. Bằng cách kết hợp từng chuỗi java với một pid, tôi có thể nhìn thấy một cách nhất quán C2 CompilerThread bằng cách sử dụng nhiều CPU nhất. Tôi đã thực hiện nghiên cứu về chủ đề này và tôi hiểu rằng nó là một mã tối ưu hóa trình biên dịch Java dựa trên thống kê thời gian chạy. Nhưng từ tất cả các bài đọc tôi đã làm, tôi không thể nói cách tiếp cận tốt nhất để làm cho tình hình tốt hơn. Các tùy chọn duy nhất mà tôi có thể thu thập bao gồm:

  1. Chuyển từ C2 đến TieredCompiler (nhưng sẽ kết quả này trong việc thực hiện tốt hơn trong vài phút đầu tiên sau khi khởi động?)
  2. Bật -XX: + PrintCompilation để xem những gì là được tối ưu hóa (nhưng tôi phải làm gì với thông tin này? Tôi có thể buộc nó phải được tối ưu hóa trước khi máy chủ chấp nhận lưu lượng truy cập bằng cách nào đó không?)

Cách tiếp cận tốt nhất là gì và có các tùy chọn khác để thử và giảm bớt Sử dụng CPU sau khi khởi động?

+2

Khi bạn tìm hiểu nơi mà tất cả các biên dịch mã đang diễn ra, hãy xem xét cách giảm nó. Điều này có nghĩa là xóa một thư viện đặc biệt đắt tiền. IMHO nó không phải là bình thường để có một số mã nhiều mà C2 đã dành nhiều thời gian biên dịch thời gian. –

+0

Cảm ơn bạn. Tôi đã thử điều đó nhưng tôi không chắc chắn những gì tôi đang tìm kiếm. Chỉ các phương pháp được biên dịch thường xuyên nhất? Hoặc các phương pháp có nhãn "zombie đã tạo" hoặc "không được tham gia"? Không có gì rõ ràng nhảy ra ngoài với tôi. – Cameron

+0

Gói nào biên dịch hầu hết các phương pháp I. E. Bình nào chết này đến từ đâu? –

Trả lời

0

Có một số đã thanh toán cho công nghệ JVM có sẵn để làm giảm bớt vấn đề của bạn, sử dụng trước-of-thời gian biên dịch. Tuy nhiên, nếu bạn muốn gắn bó với các JVM chuẩn, một thủ thuật mà mọi người sử dụng là sau khi khởi động, bạn gửi một vài yêu cầu giả để JVM được làm ấm trước khi bắt đầu hoạt động thực tế của bạn. Bằng cách đó, bạn có thể quyết định thời điểm bạn muốn thanh toán chi phí khởi động JVM trước khi phục vụ khách hàng của mình.

Bạn cũng có thể buộc các JVM để biên dịch tất cả các mã bởi các tùy chọn dòng lệnh -Xcomp cho hotspot, nhưng chúng tôi không khuyên nó vì nó sẽ làm chậm khởi động của ứng dụng của bạn bằng cách biên soạn seldomly mã được sử dụng.

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