Heap management

Apostolos Manolitzas apostolix at gmail.com
Thu Oct 26 11:49:54 EEST 2006


On 6/2/06, Apostolos Manolitzas <apostolix at gmail.com> 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 όση ελεύθερη έχει απομείνει ώστε να το
> στρεσάρω όσο μπορώ, μπας και την δώσει την άτιμη. Το αποτέλεσμα είναι
> οτι δεν την δίνει αυτή την μνήμη.
>
> Χρησιμοποιώ το top & ps για τα συμπεράσματα καθώς και την δομή
> mallinfo()[1] για πιο ακριβή συμπεράσματα. Επίσης χρησιμοποίησα και το
> nmap και είδα οτι όλη αυτή η μνήμη που δεσμεύεται είναι στο heap.
>
> Ξέρεις κανείς πώς εξηγείται αυτό το φαινόμενο ή έστω που να κοιτάξω
> για να το καταλάβω;
>
> Ευχαριστώ,
> -Απόστολος
>
>
> [1]http://www.gnu.org/software/libc/manual/html_node/Statistics-
> of-Malloc.html
>


Καλημέρα,

επανέρχομαι σε αυτό το θέμα γιατί δυστυχώς ακόμα υπάρχει και δεν έχω βγάλει
άκρη.
Απλά τώρα έχω επιβεβαιώσει οτι δεν υπάρχει καποιο Leak, έχω χρησιμοποιήσει
valgrind
και όλα τα δείχνει καλά.
Επίσης σας δείχνω κάποια στοιχεία σχετικά με το memusage():
Arena 0:
system bytes     =   26694288
in use bytes     =    1351624
Arena 1:
system bytes     =   25829376
in use bytes     =      15072
Total (incl. mmap):
system bytes     =   52794000
in use bytes     =    1637032
max mmap regions =          2
max mmap bytes   =     270336
 mem_usage_stats():
arena : 26694288
ordblks : 1657
smbblks : 97
hblks : 2
hblkhd : 270336
uordblks : 1351624
fordblks : 25342664
keepcost : 24024

Οπότε το πρόβλημα είναι γιατί δεν επιστρέφει την μνήμη, και μερικές φορές οι
μνήμη ανεβαίνει αντί να διατηρείται. Επίσης σε μετρήσεις που έκανα σχετικά
με τα μεγέθη των objects που γίνονται allocate έχω το εξής συμπέρασμα:
in use bytes 2119740 in use count 35903 mallocs 19889373 frees 19853470
fragments 12008 loops 391985952 loops/malloc 19 heap len 1 errors 0
allocations per size
      size       count
         1          50
         2       16834
         4       10144
         8     4064548
        16     5562686
        32     6306117
        64     2598808
       128      932319
       256      277678
       512       94975
      1024          17
      2048       25177
      4096           6
      8192           6
     16384           3
     32768           2
    131072           1
    262144           2

Έχει κανείς καμιά ιδέα σχετικά με το θέμα; Έπαιξα και με το mallopt αλλά δεν
είχα κάποια τύχη.
Το σύστημα είναι
Linux 2.4.20
g++ (GCC) 3.3.1

Ευχαριστώ,
Απόστολος
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.hellug.gr/pipermail/linux-greek-users/attachments/20061026/a8d5c8e0/attachment.htm>


More information about the Linux-greek-users mailing list