2017-06-26 5 views
0

私は独自のアプリケーションプール(IIS 8)で実行しているWebサイトを持っています。プールの設定はデフォルトです(29時間ごとにリサイクル)。ASP.NET MVC WebサイトのWebサーバーで6GBのRAMを使用するIISワーカープロセス

私たちのWebサーバーは8GBのRAMしか持っていません。私はこのWebサイトのワーカープロセスが定期的に6GBのRAMに上昇し、サーバーをクロールするのに時間がかかることに気付きました。これは現在Webサーバー上にある唯一のサイトです。

また、SQL Express 2016もインストールされています。サイトはEFバージョン6.1.3を使用しています。

MVCサイトは非常に簡単です。これは、テーブルの行を見つけGETPDFコントローラを持って次のようにフィールドに格納されているPDF情報は、ブラウザにそれを提供しています: -

using (eBillingEntities db = new eBillingEntities()) 
{ 
try 
{ 
    string id = model.id; 
    string emailaddress = Server.HtmlEncode(model.EmailAddress).ToLower().Trim(); 

    eBillData ebill = db.eBillDatas.ToList<eBillData>().Where(e => e.PURL == id && e.EmailAddress.ToLower().Trim() == emailaddress).FirstOrDefault<eBillData>(); 

    if (ebill != null) 
    { 

     // update the 'Lastdownloaded' field. 
     ebill.LastDownloaded = DateTime.Now; 
     db.eBillDatas.Attach(ebill); 
     var entry = db.Entry(ebill); 
     entry.Property(en => en.LastDownloaded).IsModified = true; 
     db.SaveChanges(); 


     // Find out from the config record whether the bill is stored in the table or in the local pdf folder. 
     // 
     Config cfg = db.Configs.ToList<Config>().Where(c => c.Account == ebill.Account).FirstOrDefault<Config>(); 

     bool storePDFDataInEBillTable = true; 

     if (cfg != null) 
     { 
      storePDFDataInEBillTable = cfg.StorePDFDataInEBillDataTable; 
     } 
     // End of Modification 

     byte[] file; 

     if (storePDFDataInEBillTable) 
     { 

      file = ebill.PDFData; 
     } 
     else 
     { 

      string pathToFile = ""; 

      if (string.IsNullOrEmpty(cfg.LocalPDFDataFolder)) 
       pathToFile = cfg.LocalBackupFolder; 
      else 
       pathToFile = cfg.LocalPDFDataFolder; 

      if (!pathToFile.EndsWith(@"\")) 
       pathToFile += @"\"; 

      pathToFile += ebill.PDFFileName; 

      file = System.IO.File.ReadAllBytes(pathToFile); 

     } 

     MemoryStream output = new MemoryStream(); 

     output.Write(file, 0, file.Length); 
     output.Position = 0; 

     HttpContext.Response.AddHeader("content-disposition", "attachment; filename=ebill.pdf"); 

     return new FileStreamResult(output, "application/pdf"); 
    } 
    else 
     return View("PDFNotFound"); 

} 
catch 
{ 
    return View("PDFNotFound"); 

} 

は、ここでは任意のメモリリークはありますか?

ファイルバイト配列とメモリストリームが解放されますか?

また、エンティティフレームワークの参照をクリアするために何か必要なことはありますか?

コードが正常であれば、どこから探し始めるのがよいでしょうか?

よろしく

+0

usingステートメントでメモリストリームをラップすると、「クローズドストリームにアクセスできない」というエラーが表示されます。 (MemoryStream出力=新しいメモリストリーム()) output.Write(file、0、file.Length); output.Position = 0; HttpContext.Response.AddHeader( "content-disposition"、 "attachment; filename = ebill.pdf"); 新しいFileStreamResultを返します(出力、 "application/pdf"); }} –

答えて

0

は、任意のメモリリークがここにありますか?

ファイルのバイト配列とメモリストリームが解放され得るのだろうか?

最終的にはいです。しかし、これはあなたの過度のメモリ使用の原因になる可能性があります。

また、エンティティフレームワークの参照をクリアするために何か必要なことはありますか?

コードがOKに見える場合は、どこ見て開始するには良い場所でしょうか?

このコードはメモリを大量に使用する原因である場合は、ファイルをメモリにロードしているためです。そして、各ファイルの2つのコピーをメモリにロードしています.1回はバイト[]で、もう1つはMemoryStreamにコピーします。

これを行う必要はありません。

ファイルの2番目のコピーを削除するには、バイト[]から空のMemoryStreamにコピーする代わりにMemoryStream(byte[])コンストラクタを使用します。

メモリ内の最初のコピーを削除するには、FileStreamResultの対象となる一時ファイルにデータをストリーミングするか、ADO.NETストリームを使用してFileStreamResultを初期化します。あなたはDbContextストリーミングADO.NETに行けば

ではなく、どのような場合では良い習慣であるローカル変数、の、あなたのコントローラにスコープする必要があります、https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sqlclient-streaming-support

を参照してください。

+0

こんにちはDavid、ヒントをありがとう。また、SQLプロファイラを実行し、EFがebilldataテーブル(PDFデータを含むフィールドを含む)で完全な選択を行っていることに気づいた。これには時間がかかることがあります。私は自分のEFコードでselect *をやっているようには見えないので、どこから来ているのかわかりません。私はそれにアクセスするまでPDFデータフィールドの読み込みを停止する方法はありますか? –

+0

EFはプロパティを遅延ロードしません。ドキュメントを個別にロードするには、別のエンティティにドキュメントを配置する必要があります。別のテーブルを使用するか、EFテーブル分割を使用してEBillDataとEBillDocument(または何でも)を単一のテーブルにマップできます。例:https://visualstudiomagazine.com/articles/2014/09/01/splitting-tables.aspx –

0

ダビデの助言に加えて。私は、それゆえ私は、where句でそれを再び取り出し、データベースからすべてのデータを取得して、次の

**db.eBillDatas.ToList<eBillData>()** 

をしていたことに気づきました。

データベースがいっぱいになるまで、私はこの問題に気づいていませんでした。

私はその部分を削除しましたが、IISワーカーの処理は約100MBです。

関連する問題