簡體   English   中英

IIS App Pool,內存管理

[英]IIS App Pool, memory management

我在IIS 7.5上托管了RESTful WCF服務。 當調用某些操作時,它幾乎立即返回,但是啟動一個復雜的任務,處理組合並在內存中打開大文件。 在幾次請求之后,盡管任務已完成,但應用程序池正在使用大約50%的內存。 IIS池何時回收內存? 我試着調用GC.Collect() ,但什么都沒發生。 有沒有什么辦法可以像這樣分析應用程序? 我嘗試了幾個探查器,但是它們僅顯示.NET類,IIS使用這些類來處理請求本身。

工作進程本身不會自行向操作系統釋放內存。 您可以將進程設置為按計划進行回收 - 這會重新啟動進程釋放內存而不會干擾正在運行的請求。

你可能不應該這樣做 - 基本上.net持有內存以避免為以后的請求重新分配它。 內存可在WCF進程中重用,如果未使用內存,操作系統會將其分頁並允許在其他進程需要時重用它。 有關更多詳細信息請參見由.NET進程分配的內存何時答復,並釋放回Windows

長時間運行的任務通常不適合Web應用程序,因為它們會超時/掛起網站/ API的響應時間
是否可以將后台任務配置為與IIS站點異步運行? 因此,您可以將這些緩慢的任務推送到隊列中並在后台處理它們

我認為這個過程中的內存使用情況是一個問題,但並不能說明整個故事,到目前為止你設法分析了什么? 您有未關閉的連接嗎? 您是否正在創建多個未被有效處理的類的實例? 我希望對調用執行計划進行更多的分析,而不是對內存使用情況進行分析,因為它可能會導致您對剩余項目有更多的調用

當您說50%的內存時,我們實際上在mb中討論的是多少? 當它不需要放棄RAM時,IIS可能有點貪婪/懶惰

我幾乎遇到了類似的問題,我通過使用Castle.Windsor作為IoC容器解決了此問題,將svc客戶端類添加到了具有Transient Scope的容器中,最后,我用以下方法裝飾了svc類:[ServiceBehavior(InstanceContextMode = InstanceContextMode。 PerCall)。

所有其他依賴綁定都添加了Transient Livestyle,從而使它們依賴於它們的實例化器。 考慮到您使用的是大文件,我不確定這是否對您有幫助,但是如果其他所有事情都失敗了,請嘗試在大多數內存消耗者類上實現IDisposable,並檢查是否應該在適當的時候調用Dispose。

希望有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM