2010-06-11 31 views
6

Tha thứ nếu điều này là nhiều serverfault so với stackoverflow. Nó có vẻ là trên biên giới.Làm thế nào tôi có thể vượt quá giới hạn bộ nhớ 60% của IIS7 trong ứng dụng ASP.NET Caching

Chúng tôi có một ứng dụng lưu trữ một lượng lớn dữ liệu sản phẩm cho một ứng dụng thương mại điện tử bằng cách sử dụng bộ nhớ đệm ASP.NET. Đây là một đối tượng từ điển với 65K yếu tố, và tính toán của chúng tôi đặt kích thước của đối tượng tại ~ 10GB.
Vấn đề:

  1. Lượng bộ nhớ các đối tượng tiêu thụ có vẻ là vượt xa tính toán 10GB của chúng tôi.

  2. QUAN TRỌNG LỚN NHẤT: Có vẻ như chúng tôi không thể sử dụng hơn 60% trong số 32 GB trong máy chủ.

gì chúng tôi đã cố gắng cho đến nay:

Trong Machine.config/system.web (sf không cho phép các thẻ, tha thứ các định dạng):

processModel autoConfig="true" memoryLimit="80" 

Trong web.config/system.web/caching/cache (sf không cho phép các thẻ, tha thứ định dạng):

privateBytesLimit = "20000000000" (and 0, the default of course) 
percentagePhysicalMemoryUsedLimit = "90" 

Môi trường: của Windows 2008R2 x64 32GB RAM IIS7

Không có gì dường như cho phép chúng ta vượt quá giá trị 60%. Xem ảnh chụp màn hình của tác vụ.

http://www.freeimagehosting.net/image.php?7a42144e03.jpg

+0

Dự đoán có giáo dục: Máy chủ đang điều chỉnh lại bộ nhớ để điều chỉnh tải công việc bạn đang ném vào, sử dụng nhiều tệp hoán đổi để bù đắp hoặc thu thập bộ nhớ nhanh hơn. Một cái gì đó như thế. Tab Hiệu suất trong Taskman trông như thế nào khi bạn tăng tải lên? Kích thước của tệp hoán đổi có tăng không? –

+0

@Robert: Swap vẫn khá phẳng (có ý nghĩa vì nó là bộ nhớ trong). Worth kiểm tra mặc dù. @all: Tôi tự hỏi nếu kích thước tuyệt đối của một đối tượng đơn lẻ là vấn đề. GC có yêu cầu một số lượng "không gian chùng" nhất định để dịch chuyển đối tượng xung quanh và đối tượng _one_ này vượt quá mức đó không? – evilknot

+0

Bạn có đang hoán đổi đồ vật vào và ra khỏi từ điển không? Nếu bạn đang có, đó có thể là gây áp lực lên GC, vì mỗi trao đổi sẽ giải phóng một đối tượng phải được xử lý tại một số điểm. GC có thể không đợi bạn hết bộ nhớ trước khi nó thực hiện một bộ sưu tập. Một số hồ sơ bộ nhớ có thể theo thứ tự. –

Trả lời

1

Bạn đã xem là sử dụng một chiến lược bộ nhớ đệm khác nhau? Việc xây dựng trong bộ nhớ đệm không phải là tất cả những tính năng phong phú và bạn sẽ đấu tranh để có được nó để làm nhiều hơn nữa (trừ khi một số guru IIS có một số công việc thông minh về).

Chúng tôi đã dành rất nhiều thời gian để làm việc này và đã từ bỏ. Chúng tôi thực sự sử dụng các đối tượng mỏng hơn để lưu trữ trong bộ nhớ cache và nhận được các đối tượng đầy đủ hơn nếu cần.

Khi chúng tôi cần thiết để chiêm ngưỡng điều này, chúng tôi đã nghiên cứu Memcached và Velocity nhưng đã rút lui khỏi việc triển khai chúng. Họ có nhiều tính năng phong phú mặc dù.

Ngoài ra, cách bạn lưu trữ các mục trong bộ nhớ cache thông qua mã? Bạn đang đặt chúng vào đó lúc bắt đầu ứng dụng hay sau yêu cầu đầu tiên cho mỗi? Lý do tôi hỏi là liệu các khóa bộ nhớ cache của bạn có hiệu quả không và thực tế bạn đang cư trú bộ nhớ cache hơn và hơn và không lấy bất cứ thứ gì (điều này có thể chỉ là trường hợp của một kiểu đối tượng). Chúng tôi quản lý để làm điều này một lần bằng cách nối thêm thời gian vào một khóa bộ nhớ cache cụ thể ngày ví dụ.

+0

Chúng tôi chắc chắn khám phá các bộ đệm khác. Chúng tôi chỉ lưu trữ bộ nhớ cache một lần, khi ứng dụng bắt đầu và nó không thay đổi. Chúng tôi đã xem xét ở trên, ngoài nCache. Cảm ơn! – evilknot

+1

+1, bộ đệm asp.net thực sự là sai ở đây - bạn có thể muốn cái gì khác và ra khỏi quá trình. –

2

Một chút trễ nhưng tôi gặp phải vấn đề tương tự. Vấn đề với thiết lập memoryLimit trên processModel là nó dường như không có hiệu lực mặc dù được ghi nhận như vậy.

percentagePhysicalMemoryUsedLimit tương tự như nó sẽ làm điều gì đó nhưng không có hiệu lực.

privateBytesLimit="20000000000"hiện hoạt động. Tôi đã đi và gỡ lỗi quá trình và tìm thấy đối tượng CacheMemorySizePressure và nó đã chọn thành công giá trị và đặt nó thành _memoryLimit. Tôi sẽ kiểm tra lại điều đó.

Một tùy chọn khác là thiết lập ngưỡng sử dụng bộ nhớ riêng sử dụng trên nhóm ứng dụng IIS. Điều đó cũng sẽ được chọn và ghi đè giới hạn 60% mặc định.

Tùy chọn thứ ba đang sử dụng lớp MemoryCache mới và đặt PhysicalMemoryLimit trên đó.

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