2015-03-04 15 views
8

Một số sự kiện: Chúng tôi đã phát triển dịch vụ wcf hoạt động như một lớp giữa khách hàng và cơ sở dữ liệu. Tự động lưu trữ và chạy dưới dạng dịch vụ cửa sổ..NET Garbagecollector gặp rắc rối. Chặn 15-40 phút

Dịch vụ này lưu giữ một số bộ nhớ cache, trong đó bộ nhớ cache lớn nhất khoảng 1-2GB. Tổng dung lượng bộ nhớ thường khoảng 5-8gb. Kết nối song công và sử dụng giao thức tcp và tuần tự hóa được thực hiện với protobuf-net. Số lượng khách hàng được kết nối của chúng tôi thường dao động từ 1000-1500. Máy chủ là bộ vi xử lý 8 lõi của mô hình mới với bộ nhớ 64 GB và không còn hoạt động nào nữa sau đó là dịch vụ.

Vấn đề: Sau khoảng thời gian x, nó đã ở khắp mọi nơi từ một ngày đến một tuần dịch vụ cực kỳ chậm. Yêu cầu mất 0,5 giây có thể mất hơn một phút. Hành vi này diễn ra trong 15-40 phút hoặc đến khi khởi động lại dịch vụ.

Chúng tôi đã thực hiện: Chúng tôi đã kiểm tra kết nối mạng và mạng với máy chủ và không có vấn đề gì. Việc sử dụng CPU tăng lên đôi chút trong thời gian này từ f.eks. 30% trung bình đến 40-50% trung bình. Chúng tôi đã thực hiện các bãi chứa bộ nhớ và không có khóa logic nào trong mã chặn người dùng và không hoạt động nhiều. Dẫn mới nhất của chúng tôi là bộ thu gom rác. Trong perfmon, chúng ta có thể thấy rằng "% time in gc" liên tục trên 90%, (90-97%) và số lượng bộ sưu tập tăng lên. Cả GC0 và GC1. Chúng tôi nghi ngờ có một GC2 chặn chạy cũng nhưng chúng tôi đã phải khởi động lại dịch vụ vì đây là trong sản xuất vì vậy nó không tính trong thời gian 5min chúng tôi chạy perfmon. Dung lượng bộ nhớ là 7,6 Gb. Lưu ý: Các cuộc gọi xuất sắc tăng để các cuộc gọi đến đó nhưng dịch vụ không xử lý chúng.

Câu hỏi của tôi là, Người thu gom rác có thể ở trạng thái hoạt động và chặn liên tục trong hơn 15 phút không? hoặc là vấn đề có thể liên quan đến một số vấn đề khác?

Dịch vụ của chúng tôi chạy GC ở chế độ trạm làm việc và mã thời gian: Interactive Bây giờ chúng tôi đã thay đổi điều này thành Server và SustainedLowLatency và hy vọng điều này sẽ giúp phần nào. Chúng tôi có thể làm gì khác nếu máy thu gom rác của nó không?

Chỉnh sửa: Mức sử dụng bộ nhớ lớn là do thiết kế, dữ liệu trong bộ nhớ cache lớn và có nhiều bộ nhớ hơn.

+0

Đề xuất tìm ra nguyên nhân gốc rễ của việc sử dụng bộ nhớ cao ... ví dụ: hãy thử thêm "sử dụng" khối vào bộ nhớ miễn phí khi hoàn thành bằng cách sử dụng đối tượng đó – User2012384

+0

Chỉ vì tò mò, bạn có bao nhiêu chủ đề? Kiểm tra trong Trình quản lý tác vụ. Ít nhất một vài năm trước đây đã có một vấn đề mà các chủ đề bạn đã có (thậm chí nhàn rỗi), chậm hơn GC – xanatos

+2

"Có thể các nhà sưu tập rác có được trong một tiểu bang nơi nó chạy và khối liên tục trong hơn 15 phút"? Hoàn toàn, nếu nó liên tục cần phải giải phóng bộ nhớ nhưng không thể vì bạn tiếp tục giữ nó. Như Raymond Chen đã nói, "một bộ nhớ đệm với một chính sách xấu là một tên khác cho một rò rỉ bộ nhớ". –

Trả lời

4

Thu gom rác quá mức thường do các vấn đề về mã gây ra. Bạn có thể tạo quá nhiều đối tượng trong một thời gian ngắn hoặc bạn tiếp tục phân bổ bộ nhớ mà không cần giải phóng nó.

Thực tế là extensive checklist available on MSDN sẽ giúp bạn chẩn đoán sự cố.

GC2 rất lớn có nghĩa là các đối tượng trong đó tồn tại nhiều bộ sưu tập rác, có nghĩa là chúng được lưu trong bộ nhớ trong một khoảng thời gian dài hơn. Đó có thể là nguyên nhân gốc rễ của vấn đề của bạn. Có thể có một cơ chế bộ nhớ đệm có thể sử dụng một số chính sách điều chỉnh/lưu giữ (loại bỏ dữ liệu không được sử dụng trong một thời gian dài).

+0

Bộ nhớ cache lớn nhất của chúng tôi là nhiều hơn hoặc ít hơn một bộ sưu tập không thay đổi, nó thêm dữ liệu khi được yêu cầu và nó bị thiếu. Các mặt hàng sau đó có 4 giờ ttl nếu nó không được truy cập một lần nữa sau đó truy cập được thiết lập lại. Vì vậy, nó khá đơn giản. Một kịch bản phổ biến là nó phát triển đến 1-1,5 gb sớm trong ngày. sau đó thêm 0,5 GB dữ liệu mới và loại bỏ 0,5 gb và vào ban đêm nó hoàn toàn bị xóa. Nếu bộ nhớ cache của nó là vấn đề tôi muốn có thể nói với gc để không chạm vào nó ở tất cả các ban ngày và quét nó vào ban đêm. Tôi sẽ nhận được hành vi này nếu tôi đặt Sustainedlowlatency và sau đó buộc một gc.collect vào ban đêm? –

+0

Johan: nếu bạn đặt nó GC sẽ vẫn đến thường xuyên hơn một lần một ngày. GC là một quá trình tiếp tục. Lưu ý phần nhận xét trên ['GCLatencyMode'] (https://msdn.microsoft.com/en-us/library/system.runtime.gclatencymode%28v=vs.110%29.aspx): "Bộ sưu tập chặn đầy đủ vẫn có thể xảy ra nếu hệ thống bị áp lực bộ nhớ." –

+0

Nếu tôi muốn có một bộ nhớ cache lớn liên tục trong .net. Làm thế nào sau đó tôi sẽ thực hiện nó theo cách mà GC sẽ không hủy hoại hiệu suất của tôi? Tôi muốn nói khi nào nên kiểm tra? CLR lưu trữ với lưu giữ hoặc một cái gì đó? –

0

Tôi có tình huống tương tự. Bộ nhớ cache dữ liệu cơ sở dữ liệu lớn trong một dịch vụ sử dụng protobuf với WCF để liên lạc với máy khách. Bộ nhớ cache không hoàn toàn chỉ dành cho khách hàng, lớp nghiệp vụ sử dụng bộ nhớ cache để thực hiện các thao tác. Dung lượng bộ nhớ của dịch vụ có thể ở bất kỳ đâu trong khoảng từ 2 đến 10 GB. Tôi phát hành một phân đoạn của bộ nhớ cache sau 8 giờ không hoạt động. Máy có 8 lõi ảo và 32 GB bộ nhớ. Tôi đang sử dụng .Net 4.5.1.

GC sẽ tiêu thụ 98% CPU trong một giờ ngay sau khi tôi tải bộ nhớ cache từ cơ sở dữ liệu. Điểm thú vị ở đây trong cả hai trường hợp của chúng tôi không có áp lực bộ nhớ nào cho đến giờ.

Tôi nghĩ rằng GC được thực hiện bất kể vì một cái gì đó đã được thay đổi nơi GC cố gắng giữ bộ nhớ có sẵn cho tất cả các chủ đề. Vì một luồng được cấp phát một lượng lớn bộ nhớ khi tải bộ nhớ cache, GC khởi động. Tôi phải thực hiện một số việc để sửa lỗi.

1) Đã xóa Tuples khỏi bộ nhớ cache. Tôi đã sử dụng chúng như là các khóa từ điển và việc thực hiện StructuralEquality của chúng là khủng khiếp. Nó so sánh tất cả các thuộc tính như các đối tượng, do đó, có rất nhiều boxing đang diễn ra cho các thuộc tính có giá trị và những thứ này sẽ phải là rác được thu thập tại một số điểm.

2) Khi thay thế Tuples được sử dụng làm khóa, tôi không thể thay thế chúng bằng cấu trúc mà không triển khai Equals khi so sánh giá trị sử dụng sự phản chiếu và nó quá đắt nên tôi đã kết thúc tạo cấu trúc Chung cặp. Tôi quyết định sử dụng các cấu trúc để loại bỏ số lượng đối tượng khi chúng ở trong mảng.

3) Để xóa các bộ dữ liệu, tôi phải tạo cấu trúc Pair của riêng mình so sánh các thuộc tính bằng cách sử dụng giá trị mặc định bằng các loại thuộc tính. Eseentially cùng một điều mà PowerCollections tạo ra.

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