none
Problem s asp.net aplikaci na IIS6 server 2003 SP2

    Dotaz

  •  

    Dobry den,

    Vyvyjim mapovou aplikaci princip je jednoduchy data mam rozrezany do malych dlazdicek (obrazky 256*256 px). Dat je celkem hodne radove 600 giga. Data jsou rozdeleny do adresaru takze maximalne mam v jednom adresari 16000 podadreasru a v kazdem 16000 souboru.

    v prohlizeci je javascriptovy klient ktery podava requesty na asp handler a ten vraci obrazky pomoci funkce transmitfile.
    Requestu je velmi hodne kazda zoom operacy vyvola cca 50 requestu na server ...

    Aplikace je psana v .net 2.0 aplikace bezi na www.katastralnimapa.cz

    Aplikace bezi relativne dobre jenze server zlobi zkusim popsat co se presne deje.

    obcas (ted casteji nez predtim) se stano to ze server me nepusti na vzdalenou plochu (chovani ji fakt divne), pri pokus se pripojit mi logovaci dialog jen problikne a nic se nedeje zadnou chybu nevypise (urcite neni vycerpana kapacita moznych pripojeni) zaroven server prestane poskytovat urcite obrazky (proste obrazky jsou zamknute jako by je mela otevrena nejaka palikace) dokonce jsem se setkal ze me server nepustil do adresare (jako bych na neho nemel prava pritom jsem byl prihlasen jako administrator).

    Pokud jsem se dival event logu tak vsechny app pooly obcas v sekci system vypisou tenhle warning ...

    Proces obsluhující fond aplikací katastralnimapa překročil časové limity během vypnutí. ID procesu je 3120.


     

    Dalsi podezrely zaznam o kterym oc netusim co znamena

     

    Nelze nalézt popis ID události ( 54 ) ve zdroji ( HTTP ). Místní počítač možná nemá informace registru nebo soubory knihovny DLL se zprávami potřebné pro zobrazení zpráv ze vzdáleného počítače. K získání tohoto popisu můžete použít parametr /AUXSOURCE=flag. Další informace naleznete v nápovědě. Součástí události jsou následující informace: \Device\Http\AppPool.

     

    Pokud server startuje v logu se obejevi tyhle zaznamy

    Informace o konfiguraci knihovny výkonu C:\WINDOWS\system32\inetsrv\w3ctrs.dll pro službu W3SVC nesouhlasí s informacemi důvěryhodné knihovny výkonu uloženými v registru. Funkce v této knihovně nebudou považovány za důvěryhodné.


     

    Informace o konfiguraci knihovny výkonu C:\WINDOWS\system32\perfts.dll pro službu TermService nesouhlasí s informacemi důvěryhodné knihovny výkonu uloženými v registru. Funkce v této knihovně nebudou považovány za důvěryhodné.


     

    Informace o konfiguraci knihovny výkonu C:\WINDOWS\system32\aspperf.dll pro službu ASP nesouhlasí s informacemi důvěryhodné knihovny výkonu uloženými v registru. Funkce v této knihovně nebudou považovány za důvěryhodné.

      

    nejaka resim zda muze selhat funkce transmitfile funkci pouzivam takhle

    context.Response.ContentType = "image/gif";

    context.Response.TransmitFile("obrazy/dontExists.gif");


    Nemam jeste Respont ukoncit ? Myslim ze tohle ale nebude ten problem ...

    Muzete mi prosim poradit kde mam zacit v reseni problemu ? z udalosti v logu jsem nic nevycetl ... chystam se preinstalovat server ale nevim jestli mi to pomuze ...

    predem diky za jakoukoliv odpoved

    im

    úterý 28. srpna 2007 8:32

Odpovědi

  •  

    Dobrý den,

    pokud pracujete s GDI/GDI+, musíte si dát velký pozor na správu prostředků (resource management), zejména pak na správnou práci se všemi třídami implementujícími rozhraní IDisposable. GDI/GDI+ operace jsou resource-intensive a v takto zatížených aplikacích byste se je měl snažit redukovat (cachovat výsledky GDI operací na straně serveru, atp.)

     

    Rozhodně si zkontrolujte, jestli máte vždy korektně uvolněny prostědky voláním Dispose, např. image.Dispose.

    Správná konstrukce by měla vypadat nějak takto:

    Code Snippet

    using (Image image = getGeovapTileImage(...))

    {

      ...

    }

     

     

    Pokud potíž nenajdete takto, potom nezbývá než použít nějaký profiler, např. CLR Profiler od Microsoftu a v něm si najít, jaké prostředky docházejí, co zůstává kde neuzavřeno, atp.

     

    Robert Haken [MVP ASP/ASP.NET]

    HAVIT, s.r.o., www.havit.cz

    http://knowledge-base.havit.cz

     

    neděle 9. září 2007 23:52
    Moderátor

Všechny reakce

  • Dobrý den,

    z dostupných informací bohužel nevyplývá žádný konkrétní problém, který by se dal jednoznačně identifikovat.

     

    Všechny ty warning v logu souvisí s Performance Countery, resp. knihovnami, které countery obsluhují. Netroufal bych si však tvrdit, že to přímo souvisí s vypadávajícím provozem serveru.

     

    To vypadávání je divné, to jsou takové záhady mezi nebem a zemí, může to být memory-leak, ale taky cokoliv jiného, chyba v některém driveru, cokoliv.

     

    Zkuste směrovat svůj dotaz do TechNetích konferencí Windows Serveru, myslím, že Váš problém přímo nesouvisí s webem.

     

    Robert Haken [MVP ASP.NET]

    HAVIT, s.r.o., www.havit.cz

    http://knowledge-base.havit.cz

     

     

    středa 29. srpna 2007 15:04
    Moderátor
  •  

    Vazeny pan Mjartan.

     

    Mate pravdu. Response.end() nie je v tomto pripade potrebne. Vas problem vyzera byt na problem s pamatou aj ked podla mojho nazoru nebude priamo zapricineny kodom vzhladom na to ze response.transmitfile() pouziva kernel mode API a subory priamo streamuje na network a nie do pamate.

     

    Prosim napiste, ci Vas problem stale pretrvava a ci by ste boli ochotny zaslat mi na vyziadanie udaje pre spresnenie Vasho problemu.

     

    S pozdravom,

    Martin Bačík

    neděle 2. září 2007 21:01
  • Dobry den,

     

    Dekuji za opoved.

    Nejsem si jisty zda chyba je na serveru ci v me aplikaci tak zkusim dat co nejvic infa o aplikaci


    Upresinim jeste strukturu aplikace resp. aplikaci.

    Na serveru bezi tri aplikace kazda ma svuj appPool ...

    a) katastralni mapa (www.katastralnimapa.cz)

    b) klon teto aplikace pro testovani
    c) wms sluzba ktastralni mapa.


    wms sluzba dostane request na obrazek dejme tomu na nejakou mapovou vrstvu a rozmery pozadovaneho obrazku ...

    ja vypocitam uroven (adresar s predgenerovanymi soubory tak aby jich bylo maximalne 8*8) vytvorim prazdny graphics a do neho vykersluji obrazky jednotlive obrazky otviram takto

    public System.Drawing.Image getGeovapTileImage(ZoomLevel level, int x, int y)

    {

    System.Drawing.Image res = null;

    try

    {

    if (level.sourceLocal != "")

    {

    string file2 = level.sourceLocal +x.ToString()+"\\"+ "t_" + x.ToString() + "_" + y.ToString() + "." + level.image_type;

    if (System.IO.File.Exists(file2))

    {

    FileStream fs;

    fs = new FileStream(file2, FileMode.Open, FileAccess.Read, FileShare.Read);

    res = System.Drawing.Image.FromStream(fs);

    fs.Close();

    //res = System.Drawing.Image.FromFile(file2);

    }

    }

    }

    catch(Exception Ex)

    {

    this.writeToLog(Ex, "getGeovapTileImage", null);

    }

    return res;

    }


    Obrazky otviram do streamu abych nezamkl tento file pro ostatni procesy.

    V druhe aplikaci tedy katastralni mape jednolive obrazky v Handleru odesilam na klineta takto ...

    try

    {

    string file = context.Request["f"];

    string path = DecodePath(context.Request["p"]);

    string[] temAdrArr = file.Split('_');

    string temAdr = temAdrArr[1];

    string fn2 = path +temAdr+"\\"+file;

    System.IO.FileInfo fi2 = new System.IO.FileInfo(fn2);

    if (fi2.Exists)

    {

    switch (fi2.Extension.ToUpper())

    {

    case ".JPG": context.Response.ContentType = "image/jpeg"; break;

    case ".GIF": context.Response.ContentType = "image/gif"; break;

    case ".PNG": context.Response.ContentType = "image/png"; break;

    default:

    throw new Exception("Nelze předat jiný soubor než JPG, GIF, PNG!");

    }

    context.Response.Cache.SetExpires(DateTime.Now.AddDays(2));

    context.Response.Cache.SetCacheability(HttpCacheability.Public);

    context.Response.Cache.SetNoServerCaching();

    context.Response.Cache.VaryByParams["p"] = true;

    context.Response.Cache.VaryByParams["f"] = true;

    context.Response.Cache.VaryByParams["ver"] = true;

    context.Response.TransmitFile(fn2);

    }

    else

    {

    if (context.Request["v"] == "0")

    {

    context.Response.ContentType = "image/gif";

    context.Response.TransmitFile("obrazy/dontExists.gif");

    }

    else

    {

    context.Response.ContentType = "image/gif";

    context.Response.TransmitFile("obrazy/transparent.gif");

    }

    }

    }

    catch (Exception Ex)

    {

    if (context.Request["f"] != null)

    {

    writeError(Ex, "TransmitFile:" + context.Request["f"].ToString());

    }

    else

    {

    writeError(Ex, "TransmitFile:");

    }

    }

    }


    V logu aplikace WMS se mi objevili tyto vyjimky ...
    6.9.2007 20:56:01; getGeovapTileImage;();Message:K dokončení požadované služby není k dispozici dostatek prostředků.
    ;Source: mscorlib; StackTrace:   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
       at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
       at apiWMS.WMS.TileWMS.getGeovapTileImage(ZoomLevel level, Int32 x, Int32 y) in c:\Projects\dotNet2\GSWMS\apiWMS\TileWMS.cs:line 228

    v logu aplikace katastralni mapa tato

    coz je v podstate stejna jako v predesle aplikaci

    6.9.2007 20:50:34; GetImage.ashx:TransmitFile:t_5544_3812.png;();Message:K dokončení požadované služby není k dispozici dostatek prostředků.
    ;Source: mscorlib; StackTrace:   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
       at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
       at System.Web.HttpResponse.TransmitFile(String filename, Int64 offset, Int64 length)
       at System.Web.HttpResponse.TransmitFile(String filename)
       at Handler.ProcessRequest(HttpContext context) in c:\gstile\gstile\GetImage.ashx:line 86



    Nejsem si jisty co znamena "K dokončení požadované služby není k dispozici dostatek prostředků." Pokud uvazim ze requestu na obrazky je opravdu hodne. Ne ani tak v aplikaci WMS ale v aplikaci katastralni mapa

    Je to tak ze server proste nema kapacity pro dokonceni pozadavku ? Jsem ve stavu ze lovim duchy zkousim menit aplikaci

    Rad Vam zaslu jakekoliv informace ...

     

    Dekuji ivan mjartan  


    pátek 7. září 2007 8:42
  •  

    Dobrý den,

    pokud pracujete s GDI/GDI+, musíte si dát velký pozor na správu prostředků (resource management), zejména pak na správnou práci se všemi třídami implementujícími rozhraní IDisposable. GDI/GDI+ operace jsou resource-intensive a v takto zatížených aplikacích byste se je měl snažit redukovat (cachovat výsledky GDI operací na straně serveru, atp.)

     

    Rozhodně si zkontrolujte, jestli máte vždy korektně uvolněny prostědky voláním Dispose, např. image.Dispose.

    Správná konstrukce by měla vypadat nějak takto:

    Code Snippet

    using (Image image = getGeovapTileImage(...))

    {

      ...

    }

     

     

    Pokud potíž nenajdete takto, potom nezbývá než použít nějaký profiler, např. CLR Profiler od Microsoftu a v něm si najít, jaké prostředky docházejí, co zůstává kde neuzavřeno, atp.

     

    Robert Haken [MVP ASP/ASP.NET]

    HAVIT, s.r.o., www.havit.cz

    http://knowledge-base.havit.cz

     

    neděle 9. září 2007 23:52
    Moderátor