ロングポーリングアクションを実行するようにAsyncController
セットアップしました。これはすべて正常に機能しますが、同僚は、新しい接続ごとに増加するように見えるサーバー上のメモリ リークに気付きました。
このページから何千回も要求する小さなアプリケーションを作成し、IIS プロセスのメモリ使用量を監視しています。接続ごとにメモリ使用量が増加しますが、クライアントが切断されたときに完全に低下することはありません。
さらに調査した結果、 my をこれ以外のことを行わないAsyncController
標準に置き換えても、これは引き続き発生することがわかりました。Controller
public class WaitController : Controller
{
public JsonResult Member(string oauth_token, int service_id, bool busy = false)
{
return Json(new
{
ready = false,
}, JsonRequestBehavior.AllowGet);
}
}
この場合、メモリ使用量はそれほど多くありませんが、動作はまったく同じように見えます。
メモリ プロファイラーを実行して、10,000 接続の違いを示しましたが、そこにはほとんど何もありません。ほとんどのメモリはExpiresEntry[]
fromSystem.Web.Caching
またはのインスタンスによって消費されますがSystem.Runtime.Caching
、IIS ワーカー プロセスで得られるメモリの増加と比較すると、これらの合計はゼロになります。
私の質問は、IIS はこれを意図的に行っているのでしょうか? おそらくこれは、後で必要になった場合に備えてぶらぶらしている接続スレッドに割り当てられていたのでしょうか? これは IIS、ASP.NET、または MVC 4 のバグですか?
これには、MVC 4 の WebAPI 機能を使用することに決めました。これは、柔軟性、保守性、将来性があり、AJAX 経由でアクセスできるようにするためです。また、MVC 4 で Web サイトを構築したため、開発の観点からも理にかなっているように見えました。
ただし、(将来) 何千ものクライアントを接続する必要があるため、同僚がこれをシステム アーキテクチャの重大な問題として提起しました。彼は、代わりに WCF を使用することを提案しています。おまけの質問ですが、WCF を使用するとこれらの問題は解決しますか?