Heap management

Apostolos Manolitzas apostolix at gmail.com
Fri Jun 2 21:21:56 EEST 2006


Καλησπέρα σε όλους,

παρατηρώ το εξής φαινόμενο σε ένα σύστημα που τρέχει kernel 2.4.12
Έχω μια σερβερ εφαρμογή που δέχεται commands από sockets οπότε με τα
commands αυτά γίνονται αρκετά new() της τάξης των 10^6 αλλά με μεγέθη
των Objects αρκετά μικρά 10-100 bytes.
Στην συνέχεια έρχονται οι αντίστοιχες εντολές για την απομάκρυνση
αυτών των objects με τα αντίστοιχα delete. Έχω μετρήσει το πλήθος των
new και ειναι το ίδιο με αυτό των delete δηλαδή ξέρω σίγουρα οτι δεν
έχω Leak, ή αν έχω δεν το βρίσκω ή είναι πολύ μικρό.

Το πρόβλημα μου είναι το εξής στην αρχή το πρόγραμμα έχει μέγεθος 3Μ
όταν κάνω όλα τα new το μέγεθος εκτοξεύεται στα 27Μ που το θεωρώ
φυσιολογικό γιατί μετράω όλα τα new και είναι πάρα πολλά. Το μεγάλο
μου ερώτημα είναι γιατί όταν κάνω τα αντίστοιχα delete δεν πέφτει πάλι
στα 3Μ! ή έστω εκεί κοντά. Δηλαδή η μνήμη διατηρείται στα 25Μ και όταν
εφαρμόσω πάλι την ίδια ακολουθία εντολών (new - delete) η μνήμη
ανεβαίνει στα 30Μ.

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

Χρησιμοποιώ το top & ps για τα συμπεράσματα καθώς και την δομή
mallinfo()[1] για πιο ακριβή συμπεράσματα. Επίσης χρησιμοποίησα και το
nmap και είδα οτι όλη αυτή η μνήμη που δεσμεύεται είναι στο heap.

Ξέρεις κανείς πώς εξηγείται αυτό το φαινόμενο ή έστω που να κοιτάξω
για να το καταλάβω;

Ευχαριστώ,
-Απόστολος


[1]http://www.gnu.org/software/libc/manual/html_node/Statistics-of-Malloc.html




More information about the Linux-greek-users mailing list