Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Εύρεση χρησιμοποιούμενης μνήμης συστήματος

Îåêßíçóå áðü ôï ìÝëïò pontifikas. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 21-08-2007, 12:30. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  20-08-2007, 09:15 34368

    Εύρεση χρησιμοποιούμενης μνήμης συστήματος

        Έχω κολλήσει προσπαθώντας να βγάλω μερικά διαγνωστικά στοιχεία για το πρόγραμμά μου. Ένα από αυτά είναι, πόση μνήμη, συνολικά, χρησιμοποιείται
    αυτή την στιγμή στον υπολογιστή μου.

    Για να το κάνω αυτό, αρχικά υπολογίζω την συνολική μνήμη του υπολογιστή μου :
    public static double TotalSystemMemory = 0.0;
    public
    static void GetTotalSystemMemory()
    {
        double totalCapacity = 0;
        ObjectQuery objectQuery = new ObjectQuery("select * from Win32_PhysicalMemory");
        ManagementObjectSearcher searcher = new
        ManagementObjectSearcher(objectQuery);
        ManagementObjectCollection vals = searcher.Get();

        foreach (ManagementObject val in vals)
        {
            totalCapacity += System.Convert.ToDouble(val.GetPropertyValue("Capacity"));
        }

        TotalSystemMemory = totalCapacity / 1024.0;
    }


    Ομολογώ ότι δεν έχω καταλάβει πώς δουλεύουν τα Management Objects αλλά αυτο μου επιστρέφει σωστό αποτέλεσμα.Stick out tongue

    Στην συνέχεια, επειδή δεν μπόρεσα να βρώ έναν τρόπο για να βρώ απευθείας την χρησιμοποιούμενη μνήμη, βρήκα ένα τρόπο να
    βρώ την ελεύθερη με Performance Counters, οπότε,αφαιρετικά, βρίσκω πόση μνήμη χρησιμοποιείται.

    PerformanceCounter ramCounter = new PerformanceCounter("Memory", "Available KBytes");
    private void MainTimer_Tick(object sender, EventArgs e)
    {
        TotalUsedMemorySize = (int)IRBrain.TotalSystemMemory - (int)ramCounter.NextValue(); 
    }


    Στα Vista όμως αυτό μου δίνει γύρω στα 5ΜΒ απόκλιση από αυτό που δείχνει ο TaskManager, ενώ στα XP έχω απόκληση περί τα 150MB!!!Tongue Tied

    Τί μπορεί κάνω λάθος?

    Ευχαριστώ.Smile


  •  20-08-2007, 14:58 34374 σε απάντηση της 34368

    Απ: Εύρεση χρησιμοποιούμενης μνήμης συστήματος

    Βασικά, το τί λέει ο Task Manager σε κάθε έκδοση του λειτουργικού δεν έχει μεγάλη σχέση με το ποιά είναι η "ελεύθερη μνήμη" και αλλάζει από λειτουργικό σε λειτουργικό. Άσε που το θέμα είναι τί εννοείς "Ελεύθερη μνήμη".

    Όσα ο Task Manager αναφέρει ως Free Memory ή System Memory είναι αναγκαστικά μία απλοποιημένη εικόνα του τί γίνεται πραγματικά με τη μνήμη. Τα Windows κρατάνε τη μνήμη σε σελίδες, η οποία μπορεί (χονδρικά) να είναι λευκή(δεν έγινε ποτέ allocated ή έχει καθαριστεί), σε χρήση (έχει δεδομένα αλλά είναι ίδια με το paging file), βρώμικη (η σελίδα διαφέρει από την αντίστοιχη στο paging file), παρατημένη (η σελίδα έγινε deallocated αλλά δεν καθαρίστηκε ακόμα). Οι παρατημένες δεν καθαρίζονται αμέσως, αφενός επειδή αυτό αργεί, αφετέρου γιατί μπορεί η εφαρμογή να την ζητήσει ξανά (αν π.χ. ήταν ο buffer ενός αρχείου). Επίσης, οι σελίδες μπορεί να είναι shared (φορτωμένα DLL ή το .NET Runtime) από πολλές εφαρμογές, ή private για μία εφαρμογή μόνο. Στο virtual size μίας εφαρμογής θα μετρήσουν όλες, αλλά αυτό δεν σημαίνει ότι π.χ. κάθε εφαρμογή .NET καταλαμβάνει και 30 MB για το Runtime!

    Και εδώ είναι το ενδιαφέρον:
    Οι παρατημένες σελίδες είναι ελεύθερες? Αν ναι, παίρνεις ένα ποσό ελεύθερης μνήμης. Αν όχι, παίρνεις ένα άλλο ποσό ελεύθερης μνήμης. Κάθε έκδοση του λειτουργικού μετράει διαφορετικά την ελεύθερη μνήμη, προσπαθώντας να δώσει ένα νούμερο που να έχει σημασία και για τον απλό χρήστη, αλλά και για τον administrator.

    Η παραπάνω περιγραφή είναι αναγκαστικά εξοργιστικά απλή. Για παρηγοριά, όλα τα σύγχρονα λειτουργικά έχουν το ίδιο περίπλοκη διαχείριση μνήμης. Για να καταλάβεις πάντως πραγματικά τί συμβαίνει με τη μνήμη θα πρέπει να διαβάσεις το Windows Internals του Mark Russinovich, όπου περιέχει ολόκληρο κεφάλαιο για Memory Management. Ευτυχώς, ο Russinovich έχει γράψει και κάποια σχετικά άρθρα στο Technet Magazine, ενώ έχει φτιάξει και ένα εργαλείο, το Process Explorer το οποίο είναι ΠΟΛΥ καλύτερο από τον Task Manager και δείχνει όλες τις λεπτομέρειες που θα ήθελες ποτέ για μνήμη, CPU, I/O κλπ.

    Και είναι και ο τύπος που έκανε τσακωτή την Sony όταν έβαλε rootkits στα CD της για λόγους ... copy protection!


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  20-08-2007, 16:22 34375 σε απάντηση της 34374

    Απ: Εύρεση χρησιμοποιούμενης μνήμης συστήματος

    Παναγιώτης Καναβός:

    Όσα ο Task Manager αναφέρει ως Free Memory ή System Memory είναι αναγκαστικά μία απλοποιημένη εικόνα του τί γίνεται πραγματικά με τη μνήμη. Τα Windows κρατάνε τη μνήμη σε σελίδες, η οποία μπορεί (χονδρικά) να είναι λευκή(δεν έγινε ποτέ allocated ή έχει καθαριστεί), σε χρήση (έχει δεδομένα αλλά είναι ίδια με το paging file), βρώμικη (η σελίδα διαφέρει από την αντίστοιχη στο paging file), παρατημένη (η σελίδα έγινε deallocated αλλά δεν καθαρίστηκε ακόμα). Οι παρατημένες δεν καθαρίζονται αμέσως, αφενός επειδή αυτό αργεί, αφετέρου γιατί μπορεί η εφαρμογή να την ζητήσει ξανά (αν π.χ. ήταν ο buffer ενός αρχείου). Επίσης, οι σελίδες μπορεί να είναι shared (φορτωμένα DLL ή το .NET Runtime) από πολλές εφαρμογές, ή private για μία εφαρμογή μόνο. Στο virtual size μίας εφαρμογής θα μετρήσουν όλες, αλλά αυτό δεν σημαίνει ότι π.χ. κάθε εφαρμογή .NET καταλαμβάνει και 30 MB για το Runtime!

    Και εδώ είναι το ενδιαφέρον:
    Οι παρατημένες σελίδες είναι ελεύθερες? Αν ναι, παίρνεις ένα ποσό ελεύθερης μνήμης. Αν όχι, παίρνεις ένα άλλο ποσό ελεύθερης μνήμης. Κάθε έκδοση του λειτουργικού μετράει διαφορετικά την ελεύθερη μνήμη, προσπαθώντας να δώσει ένα νούμερο που να έχει σημασία και για τον απλό χρήστη, αλλά και για τον administrator.



    Tongue TiedTongue TiedTongue TiedTongue Tied
    Με τσάκισες Stick out tongue

    Βασικά, έχω μια εφαρμογή η οποία, υπό συγκεκριμένες συνθήκες, μπορεί να καταναλώσει....τα πάντα. Οπότε θα ήθελα ο χρήστης να μπορεί να δεί τι μνήμη του απομένει σε σχέση με την
    συνολική. Πρόκειται για εφαρμογή 3D γραφικών. Θέλω να πιστεύω ότι ο χρήστης θα έχει μπόλικη μνήμη οπότε ζητάω μόνο μια τάξη μεγέθους.
    Φυσικά αν πάει κανείς να το τρέξει σε XP με τίποτα 512ΜΒ θα έχω γρήγορα πρόβλημα ή τουλάχιστον έτσι θα φαίνεται(αφού η απόκλιση στην οποία αναφέρθηκα είναι προς τα πάνω).

    Θα ψάξω πάντως για κάποια άλλη παράμετρο να επικαλεστώ σε επίπεδο συστήματος.
    Αλήθεια δεν υπάρχει αντίστοιχη κλάση με την Process που να δείχνει όλα τα είδη μνήμης που ανέφερες?

    Ευχαριστώ πάντως για την απάντηση Παναγιώτη. Ήταν και επιμορφωτική(εκτός από αποσβολωτική(μάλλον δεν είναι δόκιμο αλλά δεν βαριέσαι))
  •  21-08-2007, 12:30 34392 σε απάντηση της 34375

    Απ: Εύρεση χρησιμοποιούμενης μνήμης συστήματος

    Δεν υπάρχει λόγος πανικού. Όπως είπα, άλλο νούμερο ενδιαφέρει τον τελικό χρήστη, άλλο τον προγραμματιστή και άλλο τον admin. Στην δική σου περίπτωση, μπορείς να θεωρήσεις ελεύθερα όλα τα διάφορα είδη όχι-εντελώς-ελεύθερης μνήμης. Η εφαρμογή σου θα μπορέσει άνετα να τα χρησιμοποιήσει χωρίς να χρειαστεί paging.

    Μία καλή λύση θα είναι να δείχνεις την τιμή του Available Bytes performance counter (ή μάλλον την Available MBytes - αν η εφαρμογή έχει μόνο Bytes διαθέσιμα, μάλλον θα έχεις πρόβλημα). Η περιγραφή της (στο Performance Monitor) λέει:

    "Available MBytes is the amount of physical memory available to processes running on the computer, in Megabytes, rather than bytes as reported in Memory\\Available Bytes. It is calculated by adding the amount of space on the Zeroed, Free, and Stand by memory lists. Free memory is ready for use; Zeroed memory are pages of memory filled with zeros to prevent later processes from seeing data used by a previous process; Standby memory is memory removed from a process' working set (its physical memory) on route to disk, but is still available to be recalled.  This counter displays the last observed value only; it is not an average."

    Οι Zeroed και Free είναι ουσιαστικά διαθέσιμη μνήμη, η Standby είναι σχεδόν διαθέσιμη. Ρίξε μία ματιά στο PerformanceCounter component, νομίζω ότι θα κάνει αυτό που θέλεις.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems