1

数日後、私たちの 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にも問題が見つかりました。

結論として、すべてがこのコードにあるようですが、問題を再現できませんでした。

4

0 に答える 0