3 votes

PeakWorkingSet64, ne me donne pas le bon résultat

J'utilise System.Diagnostics.Process. PeakWorkingSet64 pour obtenir l'utilisation actuelle de la mémoire d'un processus. Ce processus peut atteindre 8, 10 et même 12 Go (ne demandez pas). Mon problème est que lorsque j'interroge le processus PeakWorkingSet64, il fonctionne bien jusqu'à ce qu'il s'arrête à 4096mb.

Mon code est :

p.Refresh();

int m = (int)(p.PeakWorkingSet64 /(float) 1024 /(float) 1024);

Toute aide est la bienvenue

4voto

Tim Lloyd Points 23571

Tiré dans l'obscurité...

Vous avez un maximum de 4 Go, mais vous avez 24 Go de mémoire physique. 4 Go est la quantité maximale d'espace d'adressage utilisateur dont dispose un processus 32 bits sur un système d'exploitation Windows 64 bits. Essayez d'exécuter le programme en tant que processus 64 bits de manière explicite. Mon intuition me dit qu'il s'exécute en tant que processus 32 bits.

VS : Project Properties -> Build -> Platform target : x64

Mise à jour

Après avoir défini ma plate-forme en x64, le code suivant sur mon système dépasse un ensemble de travail de 4 Go. Il ne peut pas dépasser ce seuil car je teste sur un système avec 6 Go de mémoire, et il n'y a tout simplement pas assez de mémoire pour dépasser 4,2 Go. Je dispose d'un serveur avec 24 Go de mémoire, mais je suis réticent à l'utiliser pour ce test ! :)

Je suppose que dans votre commentaire, lorsque vous dites que votre système utilise 12 Go de RAM avec votre programme, il s'agit de la consommation totale. mémoire virtuelle l'utilisation, et non mémoire physique usage. PeakWorkingSet64 fait référence à la mémoire physique.

J'ai placé quelques bidouillages dans le code pour m'assurer que les données générées sont touchées de manière à ce qu'elles restent chaudes et dans la mémoire physique et non dans la mémoire paginée (la mémoire paginée n'est pas incluse dans les chiffres de l'ensemble de travail car elle se trouve dans le fichier de pagination et non dans la mémoire physique réelle). Windows met agressivement en page la mémoire sur le disque si elle n'est pas touchée.

        Console.WriteLine("Is64=" + (Marshal.SizeOf(IntPtr.Zero) == 8));

        Process p = Process.GetCurrentProcess();

        List<int[]> data = new List<int[]>();

        while (true)
        {
            int[] buffer = new int[1024 * 1024 * 128]; //<- 0.5GB

            data.Add(buffer);

            int touch = 0;

            foreach (var b in data)
            {
                for (int i = 0; i < b.Length; i++)
                {
                    touch += b[i];
                }
            }

            p.Refresh();

            int mb = (int)(p.PeakWorkingSet64 / (float)1024 / 1024);

            Console.WriteLine("ignore" + touch);

            Console.WriteLine(mb + "MB");

            Thread.Sleep(1 * 1000);
        }

Sortie :

ignorer0
524MB
ignorer0
1055MB
ignorer0
1560MB
ignorer0
2074MB
ignorer0
2587MB
ignorer0
3101MB
ignorer0
3615MB
ignorer0
4132MB
ignorer0
4188MB

Note importante

Assurez-vous que le processus qui utilise le PeekWorkingSet64 est un processus 64 bits. À ma grande surprise, un processus 32 bits qui essaie d'obtenir le PeekWorkingSet64 d'un autre processus 64 bits, n'obtiendra que 4096 Mo comme utilisation maximale de la mémoire, même si le processus surveillé est 64 bits et possède plus de mémoire physique que cela.

0voto

Le Working set est la quantité de mémoire physique réellement visible par l'application. Windows vole en permanence des pages à tous les processus en cours. Il les garde pendant un certain temps et si vous essayez d'y accéder, vous les récupérez (c'est ce qu'on appelle une faille logicielle).

Si d'autres personnes ont besoin de la mémoire, vos pages sont écrites dans le fichier d'échange, mises à zéro et réutilisées.

Ainsi, la mémoire physique utilisée par votre application peut être plus grande que l'ensemble de travail. Les pages "empruntées" par Windows ne sont pas comptabilisées.

Windows a une limite par processus sur un ensemble de travail. Pour les applications 32 bits, cette limite était de 1,3 Go. Vous pouvez le demander dans l'explorateur de processus. Peut-être que pour 64 bits, cette valeur est de 4 Go, je ne sais pas. Pour le processus que vous décrivez, il pourrait être intéressant d'augmenter cette limite afin que Windows cesse d'essayer de réduire l'empreinte mémoire de votre processus.

Si vous voulez contrôler votre utilisation de la mémoire, vous devez regarder la mémoire virtuelle totale utilisée par votre processus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X