2013-04-29 33 views
8

Đối với ngữ cảnh của một hệ thống thời gian thực không được tạm dừng trong hơn 200 mili giây, chúng tôi đang tìm cách có cảnh báo trước trước khi có toàn bộ GC. Chúng tôi nhận ra rằng chúng tôi có thể không thể tránh được nó, nhưng chúng tôi muốn chuyển sang một nút khác trước khi hệ thống quầy hàng.Nhận cảnh báo trước khi đầy đủ GC

Chúng tôi đã có thể đưa ra một kế hoạch sẽ cung cấp cho chúng tôi cảnh báo trước, trước đầy đủ GC có thể khiến hệ thống ngừng trong vài giây (mà chúng tôi cần tránh).

Những gì chúng tôi có thể đưa ra dựa trên thống kê danh sách miễn phí CMS: -XX:PrintFLSStatistics=1. Điều này sẽ in số liệu thống kê danh sách miễn phí vào nhật ký GC sau mỗi chu kỳ GC, bao gồm GC trẻ, vì vậy thông tin có sẵn trong khoảng thời gian ngắn và sẽ xuất hiện thường xuyên hơn trong các khoảng thời gian phân bổ bộ nhớ cao. Nó có thể chi phí một chút về hiệu suất, nhưng giả định làm việc của chúng tôi là chúng ta có thể đủ khả năng đó.

Sản lượng vào nhật ký trông giống như vậy:

Statistics for BinaryTreeDictionary: 
------------------------------------ 
Total Free Space: 382153298 
Max Chunk Size: 382064598 
Number of Blocks: 28 
Av. Block Size: 13648332 
Tree  Height: 8 

Đặc biệt, kích thước đoạn miễn phí tối đa là 382.064.598 lời. Với các từ 64 bit, số tiền này chỉ có thể dưới 2915MB. Con số này đã giảm rất chậm, với tốc độ khoảng 1MB mỗi giờ. Đó là sự hiểu biết của chúng tôi rằng miễn là kích thước chunk miễn phí tối đa lớn hơn thế hệ trẻ (giả sử không có phân bổ đối tượng humungous), mọi xúc tiến đối tượng nên thành công.

Gần đây, chúng tôi đã chạy thử nghiệm căng thẳng kéo dài vài ngày và đã thấy CMS có thể duy trì kích thước tối đa lên tới 94% tổng không gian vùng cũ. Kích thước tối đa miễn phí dường như giảm ở tốc độ dưới 1MB/giờ, điều này sẽ ổn - theo điều này, chúng tôi sẽ sớm không gặp GC đầy đủ và các máy chủ có thể sẽ ngừng hoạt động để bảo trì thêm thường xuyên hơn GC đầy đủ có thể xảy ra.

Trong thử nghiệm trước, tại thời điểm hệ thống kém hiệu quả bộ nhớ, chúng tôi có thể chạy hệ thống trong 10 giờ tốt. Trong giờ đầu tiên, kích thước chunk miễn phí tối đa đã giảm xuống còn 100MB, nơi nó ở lại trong hơn 8 giờ. Trong 40 phút cuối cùng của đợt chạy, kích thước đoạn tối đa miễn phí đã giảm ở tốc độ ổn định về 0, khi một GC đầy đủ xảy ra - điều này rất đáng khích lệ, vì khối lượng công việc đó dường như có thể nhận được 40 phút trước cảnh báo (khi kích thước đoạn bắt đầu giảm dần về 0).

Câu hỏi của tôi cho bạn: giả sử tất cả điều này phản ánh khối lượng công việc cao điểm kéo dài (khối lượng công việc tại bất kỳ điểm nào trong thời gian sản xuất sẽ chỉ thấp hơn), âm thanh này có giống như một phương pháp hợp lệ không? Bạn tin tưởng vào mức độ tin cậy nào mà chúng ta có thể đếm được trên số liệu thống kê kích thước đoạn miễn phí tối đa từ nhật ký GC?

Chúng tôi chắc chắn mở cho các đề xuất, nhưng yêu cầu chúng được giới hạn trong các giải pháp có sẵn trên HotSpot (Không có Azul cho chúng tôi, ít nhất là bây giờ). Ngoài ra, G1 không phải là giải pháp trừ khi chúng tôi có thể đưa ra một chỉ số tương tự sẽ cung cấp cho chúng tôi cảnh báo trước Full GC hoặc bất kỳ GC nào vượt quá SLA của chúng tôi (và đôi khi có thể xảy ra).

+0

Có khả thi cho bạn để kiểm tra JRockit GC xác định không? http://docs.oracle.com/cd/E15289_01/doc.40/e15071/intro.htm#i1010645 – fglez

+0

Chúng tôi biết về nó, cũng như các dịch vụ thời gian thực khác của IBM và Oracle. Điều quan trọng là chúng tôi phải có một số đảm bảo yếu hơn (hoặc thậm chí chỉ là chẩn đoán) cho phép chúng tôi triển khai trên HotSpot. – nadavwr

+2

Bạn có cân nhắc việc buộc các GC đầy đủ định kỳ trên các nút xen kẽ không? Điều này sẽ cho phép hành vi dự đoán được nhiều hơn. CMS không thể dự đoán được trong dài hạn khi phân mảnh phát triển. – fglez

Trả lời

2

Tôi đăng ở đây trích đoạn có liên quan từ một câu trả lời rất tích cực và đáng khích lệ của Jon Masamitsu từ Oracle, mà tôi nhận được từ danh sách gửi thư của HotSpot GC ([email protected]) - anh ấy làm việc trên HotSpot , vì vậy đây thực sự là một tin tốt.

Ở bất kỳ mức nào, câu hỏi vẫn mở ngay bây giờ (Tôi không thể tự ghi có để trích dẫn một email :-)), vì vậy vui lòng thêm đề xuất của bạn!

Định dạng: các trích dẫn từ bài đăng gốc được thụt lề nhiều hơn so với câu trả lời của Jon.

Đó là sự hiểu biết của chúng tôi rằng chừng nào kích thước đoạn miễn phí tối đa là lớn hơn so với thế hệ trẻ (giả sử không humungous phân bổ đối tượng ), mỗi chương trình khuyến mãi đối tượng nên thành công.

Ở một mức độ rất lớn này là đúng. Có những trường hợp dưới một đối tượng được quảng bá từ thế hệ trẻ vào thế hệ CMS sẽ yêu cầu thêm không gian hơn trong thế hệ CMS so với thế hệ trẻ. Tôi không nghĩ điều này xảy ra ở một mức độ đáng kể.

Điều trên là rất đáng khích lệ vì chúng tôi có thể dành một số bộ nhớ rảnh để bảo vệ chống lại những trường hợp hiếm hoi mà anh mô tả, và có vẻ như chúng tôi đang làm tốt.

< --snip ->

Câu hỏi của tôi để bạn: giả sử tất cả điều này phản ánh một thời gian dài đỉnh khối lượng công việc (khối lượng công việc tại bất kỳ thời điểm nào trong sản xuất sẽ chỉ có thấp hơn), âm thanh này có giống như một cách tiếp cận hợp lệ không? Ở mức độ nào của độ tin cậy bạn có nghĩ rằng chúng tôi có thể đếm số liệu thống kê kích thước miễn phí tối đa từ nhật ký GC không?

Kích thước đoạn miễn phí tối đa là chính xác vào thời điểm GC in nó, nhưng nó có thể cũ bởi thời gian bạn đọc nó và đưa ra quyết định của bạn.

Đối với khối lượng công việc của chúng tôi, số liệu này là trên một rất chậm xoắn ốc đi xuống, do đó, một staleness chút sẽ không làm tổn thương chúng ta.

< --snip ->

Chúng tôi chắc chắn mở cho các đề xuất, nhưng yêu cầu họ được giới hạn với các giải pháp có sẵn trên HotSpot (Không Azul cho chúng ta, ít nhất bây giờ). Ngoài ra, G1 không phải là giải pháp trừ khi chúng tôi có thể đưa ra một số liệu tương tự sẽ cung cấp cho chúng tôi cảnh báo trước Full GC hoặc bất kỳ GC nào vượt quá SLA của chúng tôi (và đôi khi có thể xảy ra ).

Tôi nghĩ rằng việc sử dụng kích thước đoạn miễn phí tối đa là thước đo của bạn là một lựa chọn tốt. Nó rất bảo thủ (có vẻ giống như những gì bạn muốn) và không phụ thuộc vào hỗn hợp lẻ của kích thước đối tượng.

Đối với G1 tôi nghĩ bạn có thể sử dụng số vùng hoàn toàn miễn phí. Tôi không biết liệu nó có được in trong bất kỳ nhật ký nào hiện tại hay không là có thể là số liệu chúng tôi duy trì (hoặc có thể dễ dàng). Nếu số lượng hoàn toàn miễn phí khu vực giảm theo thời gian, nó có thể báo hiệu rằng một GC đầy đủ đang đến.

Jon

Cảm ơn bạn Jon!

0

Chia và chinh phục!

Hệ thống của bạn sử dụng nhiều bộ nhớ và cần đáp ứng cao. Vì vậy, thiết kế lại kiến ​​trúc của hệ thống của bạn, để đạt được gian hàng.

Xác định tác vụ thời gian thực quan trọng và với quy tắc kinh doanh của họ để tạo quy trình java cho nó.Và sử dụng bất kỳ thực hành lập trình không thông thường trên nó, ý tưởng là không phụ thuộc vào GC để giữ sạch bộ nhớ. Hãy suy nghĩ về nó, và sáng tạo.

Bây giờ, hãy tạo các lớp và quy trình khác, để xử lý phần còn lại và xây dựng mã ống để kết nối mọi thứ.

Và thậm chí bạn có thể lên lịch cuộc sống của quy trình thời gian thực, hoặc kiểm tra thời gian phản hồi của họ, để giết nó và tạo ra một tươi mới. Nhưng tôi có thể hy vọng rằng bạn sẽ không cần phải giết nó, để giữ cho nó đáp ứng cao.

Chúc may mắn!