Heap management
P. Christeas
p_christ at hol.gr
Fri Jun 2 22:49:57 EEST 2006
On Friday 02 June 2006 9:21 pm, Apostolos Manolitzas wrote:
> παρατηρώ το εξής φαινόμενο σε ένα σύστημα που τρέχει 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 όση ελεύθερη έχει απομείνει ώστε να το
> στρεσάρω όσο μπορώ, μπας και την δώσει την άτιμη. Το αποτέλεσμα είναι
> οτι δεν την δίνει αυτή την μνήμη.
>
Προσωπικά, γιατί ακούει και ο Σαύρας..
Είναι λογικό αυτό. Όταν ασχολιόμουν κι εγώ με το θέμα, αν θυμάμαι καλά, είχα
διαβάσει αυτό:
το kernel όταν βλέπει οτι μία εφαρμογή θέλει μνήμη, της δίνει pages. Αυτά δεν
είναι όσο ζητάει η εφαρμογή, είναι παραπάνω. Δηλ. πιό 'χοντρά'. Μετά, το
malloc, κάνει δική του διαχείριση, μέσα στην εφαρμογή.
Το αποτέλεσμα είναι τα pages να ανεβαίνουν. Μπορεί να δείς μία εφαρμογή να
έχει 100Μ, αλλά η περιοχή 20-80 να είναι "free". Το malloc μπορεί, μετά, να
αποφασίσει να ξαναδώσει χώρο στην 20-80 π.χ..
Μπορεί κιόλας ο kernel να μήν έχει κάν χώρο για όλα τα pages. Γι' αυτό και
μπορεί να δείς σε ένα μηχάνημα με 256 ram + 512 swap συνολικά allocated 1G
pages.
Τα pages ελευθερώνονται αρκετά αργότερα.
Σκέψου μόνο οτι η διευθυνσιοδότηση της "μνήμης" της εφαρμογής είναι συνεχής.
Αυτά ξέρω.
More information about the Linux-greek-users
mailing list