2011-09-17 47 views
6

Tôi đang tạo một dịch vụ Windows dựa trên C# sẽ chạy 24x7 cho các tháng kết thúc. Tôi muốn có thể theo dõi việc sử dụng bộ nhớ chung của dịch vụ của mình. Nó không cần phải chính xác xuống byte. Một số tiền chung được phân bổ sẽ đủ. Tôi sẽ theo dõi điều này cho các xu hướng tiêu thụ bộ nhớ. GC.GetTotalMemory() có phải là cách thích hợp để giám sát việc này không?C# - GC.GetTotalMemory() Câu hỏi

Tôi biết về Giám sát hiệu suất và việc sử dụng bộ đếm. Tuy nhiên, dịch vụ này sẽ chạy trên ít nhất 12 máy chủ khác nhau. Tôi không muốn theo dõi PM trên 12 máy chủ khác nhau. Dịch vụ sẽ duy trì tất cả thông tin về hiệu năng và sử dụng bộ nhớ, từ tất cả các trường hợp, đến một DB trung tâm để tránh điều này và để phân tích dễ dàng hơn.

Trả lời

5

Chỉ khi đó là ứng dụng bộ nhớ được quản lý hoàn toàn. Nếu bất kỳ của nó được gọi tắt để không được quản lý mã, bộ nhớ được phân bổ sẽ không bao giờ được đăng ký với các bộ thu rác (trừ khi ai đó nhớ để gọi GC.AddMemoryPressure).

+0

Cảm ơn. Nó là một ứng dụng được quản lý hoàn toàn. –

2

Sử dụng bộ đếm hiệu suất. Bạn có thể thiết lập chúng để đăng nhập vào tập tin.

Hoặc bạn có thể đọc bộ đếm hiệu suất trong mã của mình và lưu dữ liệu vào vị trí trung tâm.

+0

+1 cho Perf Counters, vì chúng cũng cho phép bạn giám sát hàng triệu thứ khác như CPU ​​và I/O sử dụng mà có thể trở thành một nút cổ chai theo thời gian. –

+0

@TheCodeKing - Thông thường tôi sẽ thực sự có. Tuy nhiên, dịch vụ này sẽ chạy trên ít nhất 12 máy chủ khác nhau. Tôi không thực sự muốn theo dõi PM trên 12 máy chủ khác nhau. Tôi kiên trì tất cả các thông tin về hiệu năng và sử dụng bộ nhớ, từ mọi trường hợp, đến một DB trung tâm để tránh điều này. –

+1

Bạn có thể kết nối với các bộ đếm hiệu suất trên các máy từ xa, do đó, trong ảnh hưởng đến bạn có thể tập trung quản trị, hãy hiểu nếu nó vẫn không thích hợp. Tất nhiên bạn cũng có thể đọc những mã này. – TheCodeKing

3

GC.GetTotalMemory truy xuất lượng bộ nhớ được cho là được phân bổ. Nó chỉ biết về bộ nhớ được phân bổ bởi các thành phần được quản lý, trừ khi bạn gọi GC.AddMemoryPressure để nói về bộ nhớ khác được cấp phát.

Bạn có thể có ý tưởng tốt hơn về số lượng bộ nhớ thực được phân bổ bằng cách đọc Process.WorkingSet64, Process.VirtualMemory64 và các thuộc tính khác của lớp Process. Chỉ cần gọi Process.GetCurrentProcess, và sau đó nhận được những gì bạn cần.

Điều đó nói rằng, bạn có thể nên sử dụng bộ đếm hiệu suất tốt hơn.

3

Đây không phải là câu trả lời trực tiếp cho câu hỏi của bạn, nhưng được nhắc bởi ý định của bạn để giữ cho dịch vụ của bạn chạy 24x7 trong nhiều tháng.

Tôi sẽ rất ý thức về phân mảnh heap. Xem this article để được giải thích

+0

Cảm ơn bạn. Bài viết đó có vẻ hữu ích. –

+0

Thậm chí còn quan trọng hơn đối với những người làm việc với sự thống nhất/ghi chú bên – Fawar