2013-04-20 16 views
20

Tôi có một máy chủ dịch vụ WCF. Yêu cầu của tôi từ wc cao. Máy chủ của tôi, sau một khoảng thời gian trưng bày một vấn đề về bộ nhớ đã đầy. Vấn đề này được lặp lại. Khi tôi mở trang trợ giúp Dịch vụ Web, lỗi này được hiển thị:Dịch vụ WCF có Lỗi bộ nhớ đầy đủ (Kiểm tra cổng bộ nhớ không thành công vì bộ nhớ trống) - Cách giải quyết

Kiểm tra cổng bộ nhớ không thành công vì bộ nhớ trống (1398493184 bytes) nhỏ hơn 5% tổng bộ nhớ. Do đó, dịch vụ sẽ không khả dụng cho các yêu cầu đến. Để giải quyết vấn đề này, hãy giảm tải trên máy hoặc điều chỉnh giá trị của minFreeMemoryPercentageToActivateService trên serviceHostingMã cấu hình môi trường.

web.config của tôi từ host WCF là như sau:

<system.serviceModel> 
<behaviors> 
<serviceBehaviors> 
<behavior name=""> 
    <serviceMetadata httpGetEnable="true"/> 
    <serviceDebug includeExceptionDetailInFaults="false"/> 
    <serviceHostingEnvironment minFreeMemoryPercentageToActivateService="1"/> 
</behavior> 
</serviceBehaviors> 

và web.config host là

<system.serviceModel> 
<bindings> 
<basicHttpBinding> 
<binding name="BasicHttpBinding_IPaperService" clouseTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisojnMode="StringWildcard" maxBufferSize="1000000000" maxBufferPoolSize="1000000000" maxReceivedMessageSize="100000000" messageEncoding="text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
<readerQuotas maxDepth="32" maxStringContentLength="1000000000" maxArrayLength="1000000000" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
    <security mode="None"> 
    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> 
    <message clientCredentialType="UserName" algorthmSuite="Default" /> 
    <security> 
</binding> 

Làm thế nào tôi có thể giải quyết vấn đề của tôi?

+2

Trong các bài đăng sau, vui lòng sao chép mã thay vì chèn nó làm ảnh chụp màn hình – Lemurr

+0

Chỉ cần lưu ý: Phần tử 'serviceHostingEnvironment' cần phải là con của 'system.serviceModel' not 'behavior' (ví dụ: thread @Andrea được cung cấp) – Radderz

Trả lời

34

Hãy thử thiết lập minFreeMemoryPercentageToActivateService 0 trong yourweb.config cho WCF Host, như đề xuất trong this answer

16

thay vì thay đổi giá trị cấu hình WCF, Cố gắng để biết được xử lý nhớ workingset cao, hãy thử thấy rằng nếu nó thực sự đòi hỏi

Powershellcommand>> get-process | Sort-Object WS -desc >c:\process.txt 

Cũng biết liệu mà ProcessID được trỏ đến IIS App hồ bơi

cmd.exe>> %systemroot%\system32\inetsrv\AppCmd.exe list wp 

Bằng cách cho phép zero trong cấu hình, điều này có thể kích hoạt có thể hỏng tình trạng dịch vụ cho bộ nhớ lý do không có sẵn - đó có thể là không quá thẳng về phía trước trong tự nhiên :(

My 2 cents ...

+2

+1 để đề xuất giải quyết nguyên nhân gốc rễ. Điều này có thể được giải quyết bằng cách giảm dấu chân bộ nhớ của một quá trình tốn kém (có thể do lỗi trong một số mã) hoặc bằng cách tăng nguồn lực sẵn có. –

+0

Theo phương thức 'get-process' powershell, bạn cũng có thể sử dụng câu lệnh sau để xác định thông tin quy trình chi tiết hơn (* tiêu đề cửa sổ, sử dụng tối đa, vv.)) ...' get-process -name myprocess | Select-Object *> c: \ processdetail.txt' – SliverNinja

+2

Đặt giá trị này về 0 sẽ không làm hỏng bất cứ thứ gì, nó đề cập đến% bộ nhớ vật lý có sẵn, không phải tập tin trang. Nó tương đối bình thường trong môi trường dày đặc để có bộ nhớ vật lý quá cam kết. nếu máy chủ của bạn đã hết bộ nhớ ảo (nghĩa là tệp trang đầy đủ) thì bạn sẽ có vấn đề lớn hơn chỉ dịch vụ không kích hoạt đúng cách. – Steven

2

Có các trường hợp khi thay đổi web.config không phải là một tùy chọn. Trong trường hợp của chúng tôi, chúng tôi đã giải quyết vấn đề này bằng cách tăng bộ nhớ của máy chủ từ 8GB lên 16GB.

1

tôi đã sử dụng Resource Monitor trên MS 2008 R2 Web Server của tôi để xác định rằng SQL Server đã được tiêu thụ trên 29 hợp đồng biểu diễn của tôi có sẵn 32.

Sau khi đọc những người khác ý kiến ​​về bao nhiêu bộ nhớ để cấp phát cho SQL tôi đặt bộ nhớ tối đa đến 24 hợp đồng biểu diễn. Giới hạn bộ nhớ máy chủ tối đa có thể được tìm thấy trên tab bộ nhớ của thuộc tính Máy chủ SQL của bạn.

1

Sự cố này xảy ra nếu RAM của hệ thống của bạn bị chiếm hơn 95%, dừng một số quy trình không mong muốn và thử gọi lại dịch vụ.

+0

Có. Tôi nhận thấy rằng việc sử dụng RAM của tôi là khoảng 94% của 16GB khi ngoại lệ này xảy ra. Trong trường hợp của tôi, ứng dụng của tôi đang bị rò rỉ bộ nhớ. –