2010-01-22 33 views
11

Lưu ý: Tôi biết câu hỏi Memory management in memory intensive application, tuy nhiên câu hỏi đó dường như là về các ứng dụng phân bổ bộ nhớ thường xuyên, trong khi câu hỏi của tôi là về các ứng dụng được thiết kế cố ý để tiêu thụ càng nhiều bộ nhớ vật lý như là an toàn.Quản lý bộ nhớ cho các ứng dụng chuyên sâu bộ nhớ cố ý

Tôi có một ứng dụng máy chủ sử dụng lượng bộ nhớ lớn để thực hiện bộ nhớ đệm và các tối ưu hóa khác (nghĩ SQL Server). Ứng dụng chạy trên một máy chuyên dụng, và do đó có thể (và nên) tiêu thụ càng nhiều bộ nhớ như nó muốn/có thể tăng tốc và tăng thời gian phản hồi và đáp ứng mà không phải lo lắng tác động đến các ứng dụng khác trên hệ thống.

Vấn đề là nếu việc sử dụng bộ nhớ bị đánh giá thấp, hoặc nếu tải tăng khả năng kết thúc với các lỗi khó chịu do phân bổ bộ nhớ thất bại - trong tình huống này, điều tốt nhất cần làm là giải phóng bộ nhớ để ngăn chặn thất bại tại các chi phí của hiệu suất.

Một số giả thiết:

  • Các ứng dụng đang chạy trên một máy chuyên dụng
  • Các yêu cầu bộ nhớ của ứng dụng vượt quá bộ nhớ vật lý trên máy tính này (có nghĩa là, nếu bộ nhớ thêm đã có sẵn để ứng dụng nó sẽ luôn có thể sử dụng bộ nhớ đó theo cách nào đó để cải thiện thời gian phản hồi hoặc thông lượng)
  • Bộ nhớ được quản lý hiệu quả theo cách sao cho phân mảnh bộ nhớ không phải là vấn đề.
  • Ứng dụng này biết bộ nhớ nào có thể được giải phóng một cách an toàn và bộ nhớ nào cần được giải phóng trước tiên vì tác động hiệu suất ít nhất.
  • Ứng dụng chạy trên một máy tính Windows

Câu hỏi của tôi là - làm thế nào tôi nên xử lý cấp phát bộ nhớ trong một ứng dụng như vậy? Cụ thể:

  • Làm cách nào để dự đoán phân bổ bộ nhớ có bị lỗi hay không?
  • Tôi có nên để lại một lượng bộ nhớ nhất định để đảm bảo rằng các hoạt động của hệ điều hành lõi vẫn đáp ứng (và không theo cách đó ảnh hưởng xấu đến hiệu suất của ứng dụng), và làm cách nào để tìm ra dung lượng bộ nhớ?

Mục tiêu cốt lõi là để ngăn ngừa các lỗi như là kết quả của việc sử dụng quá nhiều bộ nhớ, trong khi cùng một lúc sử dụng lên càng nhiều bộ nhớ càng tốt.

Tôi là nhà phát triển C#, tuy nhiên, hy vọng của tôi là các khái niệm cơ bản cho bất kỳ ứng dụng nào như vậy đều giống nhau bất kể ngôn ngữ.

+0

Btw - Tôi đã cố tình mauge về thuật ngữ "bộ nhớ" vì sự phức tạp của bộ nhớ ảo vs vật lý. Đối với cùng một lý do tôi đã không đề cập đến 32 bit vs 64 bit. – Justin

Trả lời

1

Trong linux, tỷ lệ sử dụng bộ nhớ được chia thành các cấp sau.

0 - 30% - không hoán đổi 30 - 60% - trao đổi các trang bẩn chỉ 60 - 90% - trang sạch sẽ hoán đổi cũng dựa trên chính sách LRU.

90% - Gọi OOM (Hết bộ nhớ) kẻ giết người và giết quá trình tiêu thụ bộ nhớ tối đa.

việc kiểm tra này - http://linux-mm.org/OOM_Killer

Trong cửa sổ suy nghĩ có thể có chính sách tương tự, vì vậy bạn có thể kiểm tra số liệu thống kê bộ nhớ và chắc chắn rằng bạn không bao giờ có được đến ngưỡng tối đa.

Một cách để ngừng tiêu thụ nhiều bộ nhớ hơn là đi ngủ và dành nhiều thời gian hơn cho các chủ đề dọn dẹp bộ nhớ để chạy.

0

Đó là một câu hỏi rất hay, và bị ràng buộc là chủ quan, bởi vì bản chất cơ bản của C# là tất cả quản lý bộ nhớ được thực hiện bởi thời gian chạy, tức là Garbage Collector. Garbage Collector là một thực thể không xác định quản lý và quét bộ nhớ để lấy lại, tùy thuộc vào tần suất bộ nhớ bị phân mảnh, GC sẽ khởi động để biết trước là điều không dễ làm.

Để quản lý đúng cách bộ nhớ có vẻ buồn tẻ nhưng thông thường áp dụng, chẳng hạn như mệnh đề using để đảm bảo đối tượng bị xử lý. Bạn có thể đặt trong một trình xử lý duy nhất để bẫy OutOfMemory Exception nhưng đó là một cách vụng về, vì nếu chương trình đã hết bộ nhớ, chương trình có chiếm đoạt và ném bom hay nên kiên nhẫn chờ GC bắt đầu , một lần nữa xác định đó là khó khăn. Tải trọng của hệ thống có thể ảnh hưởng xấu đến công việc của GC, gần như đến một điểm từ chối dịch vụ, nơi mọi thứ chỉ bị dừng lại, một lần nữa, kể từ thông số kỹ thuật của máy, hoặc bản chất của nó là gì công việc của máy không xác định, tôi không thể trả lời đầy đủ, nhưng tôi cho rằng nó có rất nhiều RAM ..

Về bản chất, trong khi một câu hỏi hay, tôi nghĩ bạn không nên lo lắng về nó và để nó vào .NET. CLR để xử lý phân bổ bộ nhớ/phân mảnh vì nó dường như làm một công việc khá tốt.

Hy vọng điều này sẽ giúp, Trân trọng, Tom.

0

Câu hỏi của bạn nhắc tôi về một cuộc thảo luận cũ "So what's wrong with 1975 programming ?". Kiến trúc sư của varnish-cache lập luận rằng thay vì yêu cầu hệ điều hành thoát khỏi con đường và tự quản lý tất cả bộ nhớ, bạn nên hợp tác với hệ điều hành và để cho nó hiểu bạn định làm gì với bộ nhớ.

Ví dụ: thay vì chỉ đọc dữ liệu từ đĩa, bạn nên sử dụng memory-mapped files. Điều này cho phép hệ điều hành áp dụng thuật toán LRU của nó để ghi dữ liệu vào đĩa khi bộ nhớ trở nên khan hiếm. Đồng thời, miễn là có đủ bộ nhớ, dữ liệu của bạn sẽ nằm trong bộ nhớ. Vì vậy, ứng dụng của bạn có khả năng sử dụng tất cả bộ nhớ, mà không có nguy cơ bị giết.

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