数日後、私たちの Web サイトは明らかにメモリ リーク (> 2Gb /pool) に悩まされています。それで、私はwindbgでいくつかのコマンドを実行し、最終的に何かを見つけました.たくさんありSystem.LocalDataStoreElement
ます. ソース コード (以下を参照) をすばやく検索したところ、非常に奇妙なクラスが見つかりました。
public class HomeController
{
public HomeController()
{
CultureInfoManager.SetCulture(MyCompany.Internal.Enumerations.Site.GbEn);
}
}
public class CultureInfoManager
{
[ThreadStaticAttribute]
private static Language _language;
public static void SetCulture(Site site)
{
if (site == Site.Undefined) return;
//strange ???
var localSlot = Thread.AllocateDataSlot();
Thread.SetData(localSlot, site.Code());
_language = site.GetLanguage();
var cultureInfo = CreateCultureInfo(site);
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
}
private static CultureInfo CreateCultureInfo(Site site)
{
if (site == Site.Undefined) site = Site.GbEn;
var languageCode = site.GetLanguage().Code();
switch (languageCode)
{
case "f2":
return new CultureInfo("fr-FR");
case "br":
return new CultureInfo("pt-BR");
case "s1":
return new CultureInfo("es-AR");
case "s2":
return new CultureInfo("es-CL");
case "e1":
return new CultureInfo("en-CA");
default:
return new CultureInfo(languageCode);
}
}
public static Language GetCurrentLanguage()
{
return _language;
}
}
だから、私の質問:
- ここで Thread.AllocateDataSlot を使用することは明らかに役に立ちませんが、メモリ リークを説明できますか? 完全な負荷テスト (400,000 リクエスト以上) の後では、リークを再現できないためです。
- Web アプリケーションに TLS/ThreaStatic を使用することは適切ですか? asp.net では、スレッドの寿命を制御できず、ワーカー スレッドが多くの要求を実行するためです。
MS KB hereにも問題が見つかりました。
結論として、すべてがこのコードにあるようですが、問題を再現できませんでした。