2009-11-03 8 views
3

J'essaie de déterminer la taille d'un état de session particulier. Sur l'une de nos pages lourdes (beaucoup de données dans un tableau), il devient progressivement plus lent. Le problème est résolu en se déconnectant du système.Mémoire de profil Utilisation de l'état de session ASP.Net

J'ai profilé la page à la recherche de fuites de mémoire JavaScript, mais je n'ai rien trouvé. Mon prochain plan d'attaque est de regarder ViewState et l'état de la session. ViewState sera simple, mais l'état de session pose un défi.

Est-ce que quelqu'un connaît des astuces ou des outils qui pourraient aider à comprendre la taille de l'état de la session?

EDIT

L'état de session est InProc.

+0

Avez-vous dû le dénombrer à la fin? Quelle taille at-il obtenu? – UpTheCreek

Répondre

6

sa mesure:

int totalBytes; 
var formatter = new BinaryFormatter(); 
for(int i = 0; i < Session.Count; i++) 
{ 
    using (var stream = new MemoryStream()) 
    { 
     formatter.Serialize(stream, Session[i]); 
     stream.Flush(); 
     totalBytes += stream.Length; 
    } 
} 

Je crois aussi que si vous enable tracing il vous montrera quelques détails sur la session (pas sûr à ce sujet, n'a jamais essayé moi-même).

+0

+1 comme il semble que cela devrait fonctionner mais je continuerais certainement à chercher un meilleur moyen ... –

+0

Cela fonctionnerait si tout dans l'état de session était serializble. –

+0

Oups, je pensais que vous utilisiez des sessions proc. Avec InProc, cela ne fonctionnera pas si les objets ne sont pas sérialisables. –

1

Certains ont mentionné le traçage ASP.NET mais je n'ai pas eu beaucoup de chance avec moi-même. Je pouvais voir les informations de trace, mais la section de session n'a jamais été remplie.

Cependant, voici un article from CodeProject utile qui utilise les gestionnaires http pour afficher la session en cours (et le cache).

Il y a deux questions en ce qui concerne cette question:

  1. Il ne sera pas présente un espace de stockage lorsque l'état de session est InProc

    Lorsque l'état de session est en cours d'exécution InProc (en cours) les objets réels qui forment le contenu ne sont pas stockés dans la collection , mais seulement une référence aux objets . Les chiffres pour la taille pris par ces objets "dans" session état serait trompeur dans ces circonstances .

  2. Il utilise BinaryFormatter qui « ne donne qu'une approximation très grossière » de la taille des données de session. Il est seulement une approximation comme ASP.NET « utilise une formatter interne optimisée pour les types de base tels que int, string, bool, etc »

Cela dit, je l'ai trouvé utile et je pensais qu'il valait la peine de partage . Il peut être utile de pousser l'état de la session hors processus pour la taille du profil.