14

Tôi đang cố gắng giải quyết các vấn đề về hiệu năng với một ứng dụng web tomcat java lớn và phức tạp. Vấn đề lớn nhất hiện tại là, theo thời gian, việc sử dụng bộ nhớ tăng đột biến và ứng dụng trở nên không phản hồi. Tôi đã sửa tất cả mọi thứ tôi có thể sửa với profilers đăng nhập và phân tích Bayesian của các tệp nhật ký. Tôi đang xem xét chạy một profiler trên máy chủ tomcat sản xuất.Chi phí hiệu suất của việc lập hồ sơ ứng dụng web trong sản xuất

Lưu ý đến Reader với Gentle Nhạy cảm:

Tôi hiểu rằng một số có thể tìm thấy những khái niệm rất của profiling một cuộc tấn công ứng dụng sản xuất. Hãy yên tâm rằng tôi đã cạn kiệt hầu hết các tùy chọn khác. Lý do tôi xem xét điều này là tôi không có tài nguyên để sao chép hoàn toàn thiết lập sản xuất của mình trên máy chủ thử nghiệm của mình và tôi không thể gây ra lỗi không quan tâm trên máy chủ thử nghiệm của mình.

Câu hỏi:

Tôi đang tìm kiếm câu trả lời mà làm việc, hoặc cho một ứng dụng java web chạy trên tomcat, hoặc trả lời câu hỏi này một cách thuyết bất khả tri ngôn ngữ.

  • Chi phí hiệu suất của lược tả là gì?
  • Bất kỳ lý do nào khác khiến bạn kết nối từ xa và cấu hình ứng dụng web trong sản xuất (chế độ lỗi không đúng, vấn đề bảo mật, v.v)?
  • Hiệu ứng hồ sơ ảnh hưởng đến việc in chân bộ nhớ bao nhiêu?
  • Cụ thể là có các công cụ lược tả java có chi phí hiệu năng rất thấp?
  • Bất kỳ công cụ lược tả java nào được thiết kế để lập hồ sơ ứng dụng web?
  • Có ai có điểm chuẩn về chi phí hiệu suất của lược tả bằng visualVM không?
  • Các ứng dụng và bộ dữ liệu kích thước nào có thể trực quan hóa quy mô lớn?
+0

Bạn có muốn có Apache FOP trong ứng dụng web của mình không? –

+0

Tôi không tin như vậy, tại sao điều đó gây ra vấn đề về bộ nhớ? –

+0

FOP hiển thị các tài liệu dựa trên XML sang PDF và các định dạng tương tự khác. Phiên bản hiện hành trong '09 bộ nhớ được sử dụng tỷ lệ thuận với kích thước của tài liệu trong khi xử lý gây ra các triệu chứng giống như những gì bạn mô tả. –

Trả lời

13

OProfile và tổ tiên của nó DPCI được phát triển để lập hồ sơ hệ thống sản xuất. Chi phí cho chúng rất thấp và chúng cấu hình hệ thống đầy đủ của bạn, bao gồm hạt nhân, do đó bạn có thể tìm thấy các sự cố về hiệu suất trong máy ảo trong hạt nhân và thư viện.

Để trả lời câu hỏi của bạn:

  1. Overhead: Đây là những mẫu profilers, có nghĩa là, họ tạo timer hoặc performance counter ngắt tại một số khoảng thời gian thường xuyên, và họ có một cái nhìn vào những gì đang hiện đang thực thi.Họ sử dụng để xây dựng một biểu đồ của nơi bạn dành thời gian của bạn, và chi phí rất thấp (1-8% là những gì they claim) cho khoảng thời gian lấy mẫu hợp lý.

    Hãy xem this graph tần suất lấy mẫu so với chi phí cho OProfile. Bạn có thể điều chỉnh tần số lấy mẫu cho chi phí thấp hơn nếu các giá trị mặc định không theo ý thích của bạn.

  2. Cách sử dụng trong sản xuất: Chỉ báo trước khi sử dụng OProfile là bạn sẽ cần cài đặt nó trên máy sản xuất của mình. Tôi tin rằng có hỗ trợ hạt nhân trong Red Hat kể từ RHEL3, và tôi khá chắc chắn rằng các bản phân phối khác hỗ trợ nó.

  3. Bộ nhớ: Tôi không chắc dấu chân bộ nhớ chính xác của OProfile là gì, nhưng tôi tin rằng nó giữ bộ đệm tương đối nhỏ xung quanh và đổ chúng để ghi tệp đôi khi.

  4. Java: OProfile bao gồm các tác nhân định hình hỗ trợ Java và biết mã chạy trong JIT. Vì vậy, bạn sẽ có thể xem các cuộc gọi Java, không chỉ các cuộc gọi C trong trình thông dịch và JIT.

  5. Ứng dụng web: OProfile là trình thu thập thông tin ở cấp hệ thống, do đó, nó không biết những thứ như phiên, giao dịch, v.v.

    Điều đó nói rằng đó là toàn diện hệ thống profiler, vì vậy nếu vấn đề hiệu suất của bạn là do tương tác xấu giữa hệ điều hành và JIT hoặc nếu nó nằm trong thư viện của bên thứ ba, bạn sẽ có thể thấy rằng, bởi vì OProfile cấu hình hạt nhân và thư viện. Đây là một lợi thế cho các hệ thống sản xuất, vì bạn có thể nắm bắt được các vấn đề do cấu hình sai hoặc các đặc điểm của môi trường sản xuất có thể không tồn tại trong môi trường thử nghiệm của bạn.

  6. VisualVM: Không chắc về việc này, như tôi không có kinh nghiệm với VisualVM

Dưới đây là a tutorial về việc sử dụng oprofile để tìm nghẽn cổ chai.

3

Tôi đã sử dụng YourKit để ứng dụng hồ sơ trong môi trường sản xuất có tải trọng cao và trong khi chắc chắn có tác động, nó dễ dàng là một sự chấp nhận. Yourkit makes a big deal của việc có thể thực hiện điều này một cách không xâm lấn, chẳng hạn như chọn lọc tắt một số tính năng định hình đắt hơn (đó là thang trượt thực sự).

Khía cạnh yêu thích của tôi là bạn có thể chạy VM với tác nhân YourKit đang chạy và tác vụ này không có tác động hiệu suất. chỉ khi bạn kết nối GUI và bắt đầu lược tả rằng nó có hiệu lực.

1

Không có gì sai trong việc lập hồ sơ ứng dụng sản xuất. Nếu bạn làm việc trên các ứng dụng phân tán, có những lúc một ngoại lệ outofmemory xảy ra trong một kịch bản xác suất rất duy nhất rất khó để tái tạo trong môi trường dev/stage/uat. Bạn có thể thử sử dụng profilers tùy chỉnh nhưng nếu bạn đang vội vàng và cắm/thiết lập hồ sơ lên ​​trên một hộp sản xuất sẽ mất thời gian, bạn cũng có thể sử dụng jvm để lấy một kết xuất bộ nhớ (jvms memory dump cũng mang lại cho bạn chủ đề bãi)

  1. Bạn có thể kích hoạt tự động tạo ra trên dòng lệnh JVM, bằng cách sử dụng các tùy chọn sau đây: -XX: + HeapDumpOnOutOfMemoryError

  2. ông Eclipse dự án Memory Analyzer có một tính năng rất mạnh mẽ được gọi là "Nhóm theo giá trị", điều này làm cho nó có thể xây dựng một đối tượng truy vấn và nhóm lại các cá thể bằng một giá trị trường. Điều này rất hữu ích trong trường hợp bạn có nhiều trường hợp chứa một tập hợp các giá trị có thể nhỏ hơn và bạn có thể xem giá trị nào đang được sử dụng nhiều nhất. Điều này đã thực sự giúp tôi hiểu một số bãi chứa bộ nhớ phức tạp vì vậy tôi khuyên bạn nên thử nó.

1

Bạn cũng có thể xem xét sử dụng một trong các máy ghi âm hiện đại của HotSpot JVM - Java Flight Recorder và Java Mission Control. Nó là một tập hợp các công cụ cho phép bạn thu thập thông tin thời gian chạy cấp thấp với CPU trên 5% (tôi không thể chứng minh tuyên bố cuối cùng dù sao, đây là tuyên bố của kỹ sư Oracle đã trình bày tính năng và bản trình diễn trực tiếp).

Bạn có thể sử dụng công cụ này miễn là ứng dụng của bạn đang chạy 1_7u40 JVM hoặc cao hơn. Để bật bộ sưu tập thông tin thời gian chạy, bạn cần bắt đầu JVM với các cờ cụ thể:

Theo mặc định, JFR bị tắt trong JVM. Để kích hoạt JFR, bạn phải khởi chạy ứng dụng Java của bạn với tùy chọn -XX: + FlightRecorder. Vì JFR là một tính năng thương mại, chỉ có sẵn trong các gói thương mại dựa trên Nền tảng Java, Phiên bản Chuẩn (Oracle Java SE Nâng cao và Oracle Java SE Suite), bạn cũng phải bật các tính năng thương mại bằng cách sử dụng các tùy chọn -XX: + UnlockCommercialFeatures.

(Quoted http://docs.oracle.com/javase/8/docs/technotes/guides/jfr/about.html#sthref7)

tôi thêm câu trả lời này vì đây là lựa chọn khả thi cho hồ sơ trong sản xuất IMO.

Ngoài ra còn có Eclipse plugin hỗ trợ JFR và JMC và có khả năng hiển thị thông tin thân thiện với người dùng.

+0

Chi phí với mẫu mặc định là khoảng 1%. –

+0

@KireHaglin Thậm chí ít hơn tôi nghĩ :) –

+0

Lưu ý rằng đây là những tính năng thương mại yêu cầu bạn phải trả tiền oracle nếu được sử dụng trong sản xuất, như trái ngược với JDK truyền thống được tự do sử dụng. –

0

Các công cụ đã được cải thiện đáng kể qua nhiều năm. Những ngày này, hầu hết những người có nhu cầu như thế này sử dụng một công cụ móc vào API thiết bị của Java thay vì API lược tả. Chắc chắn có nhiều ví dụ hơn, nhưng hãy nhớ đến NewRelicAppDynamics. Các giải pháp dựa trên thiết bị đo đạc thường chạy như một tác nhân trong JVM và liên tục thu thập dữ liệu. Họ báo cáo dữ liệu ở cấp cao hơn (giao dịch kinh doanh, giao dịch web, giao dịch cơ sở dữ liệu) so với cách tiếp cận hồ sơ cũ và cho phép bạn đào sâu hơn (xuống phương pháp hoặc đường) nếu cần. Bạn thậm chí có thể thiết lập theo dõi và cảnh báo, để bạn có thể theo dõi/cảnh báo về số liệu như thời gian tải trang và hiệu suất so với SLA. Với những công cụ tuyệt vời này, bạn thực sự không nên có lý do để chạy một hồ sơ trong sản xuất nữa. Chi phí chạy chúng là không đáng kể.