<br><br><div><span class="gmail_quote">On 6/2/06, <b class="gmail_sendername">Apostolos Manolitzas</b> <<a href="mailto:apostolix@gmail.com">apostolix@gmail.com</a>> wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Καλησπέρα σε όλους,<br><br>παρατηρώ το εξής φαινόμενο σε ένα σύστημα που τρέχει kernel 2.4.12<br>Έχω μια σερβερ εφαρμογή που δέχεται commands από sockets οπότε με τα<br>commands αυτά γίνονται αρκετά new() της τάξης των 10^6 αλλά με μεγέθη
<br>των Objects αρκετά μικρά 10-100 bytes.<br>Στην συνέχεια έρχονται οι αντίστοιχες εντολές για την απομάκρυνση<br>αυτών των objects με τα αντίστοιχα delete. Έχω μετρήσει το πλήθος των<br>new και ειναι το ίδιο με αυτό των delete δηλαδή ξέρω σίγουρα οτι δεν
<br>έχω Leak, ή αν έχω δεν το βρίσκω ή είναι πολύ μικρό.<br><br>Το πρόβλημα μου είναι το εξής στην αρχή το πρόγραμμα έχει μέγεθος 3Μ<br>όταν κάνω όλα τα new το μέγεθος εκτοξεύεται στα 27Μ που το θεωρώ<br>φυσιολογικό γιατί μετράω όλα τα new και είναι πάρα πολλά. Το μεγάλο
<br>μου ερώτημα είναι γιατί όταν κάνω τα αντίστοιχα delete δεν πέφτει πάλι<br>στα 3Μ! ή έστω εκεί κοντά. Δηλαδή η μνήμη διατηρείται στα 25Μ και όταν<br>εφαρμόσω πάλι την ίδια ακολουθία εντολών (new - delete) η μνήμη<br>ανεβαίνει στα 30Μ.
<br><br>Διάβασα για πιθανόν caching που κάνει η μνήμη, οπότε φτιάχνω ένα<br>προγραμματάκι που κάνει malloc όση ελεύθερη έχει απομείνει ώστε να το<br>στρεσάρω όσο μπορώ, μπας και την δώσει την άτιμη. Το αποτέλεσμα είναι<br>
οτι δεν την δίνει αυτή την μνήμη.<br><br>Χρησιμοποιώ το top & ps για τα συμπεράσματα καθώς και την δομή<br>mallinfo()[1] για πιο ακριβή συμπεράσματα. Επίσης χρησιμοποίησα και το<br>nmap και είδα οτι όλη αυτή η μνήμη που δεσμεύεται είναι στο heap.
<br><br>Ξέρεις κανείς πώς εξηγείται αυτό το φαινόμενο ή έστω που να κοιτάξω<br>για να το καταλάβω;<br><br>Ευχαριστώ,<br>-Απόστολος<br><br><br>[1]http://www.gnu.org/software/libc/manual/html_node/Statistics-of-Malloc.html<br>
</blockquote></div><br><br clear="all">Καλημέρα,<br>
<br>
επανέρχομαι σε αυτό το θέμα γιατί δυστυχώς ακόμα υπάρχει και δεν έχω βγάλει άκρη.<br>
Απλά τώρα έχω επιβεβαιώσει οτι δεν υπάρχει καποιο Leak, έχω χρησιμοποιήσει valgrind<br>
και όλα τα δείχνει καλά. <br>
Επίσης σας δείχνω κάποια στοιχεία σχετικά με το memusage():<br>Arena 0:<br>system bytes = 26694288<br>in use bytes = 1351624<br>Arena 1:<br>system bytes = 25829376<br>in use bytes = 15072<br>Total (incl. mmap):
<br>system bytes = 52794000<br>in use bytes = 1637032<br>max mmap regions = 2<br>max mmap bytes = 270336<br> mem_usage_stats(): <br>arena : 26694288 <br>ordblks : 1657 <br>smbblks : 97 <br>hblks : 2
<br>hblkhd : 270336 <br>uordblks : 1351624 <br>fordblks : 25342664 <br>keepcost : 24024 <br><br>Οπότε το πρόβλημα είναι γιατί δεν επιστρέφει την μνήμη, και μερικές φορές οι μνήμη ανεβαίνει αντί να διατηρείται. Επίσης σε μετρήσεις που έκανα σχετικά με τα μεγέθη των objects που γίνονται allocate έχω το εξής συμπέρασμα:
<br><font face="Courier New, Courier, monospace">
in use bytes 2119740 in use count 35903 mallocs 19889373 frees 19853470
fragments 12008 loops 391985952 loops/malloc 19 heap len 1 errors 0<br>
allocations per size<br>
size count<br>
1 50<br>
2 16834<br>
4 10144<br>
8 4064548<br>
16 5562686<br>
32 6306117<br>
64 2598808<br>
128 932319<br>
256 277678<br>
512 94975<br>
1024 17<br>
2048 25177<br>
4096 6<br>
8192 6<br>
16384 3<br>
32768 2<br>
131072 1<br>
262144 2<br><br>Έχει κανείς καμιά ιδέα σχετικά με το θέμα; Έπαιξα και με το mallopt αλλά δεν είχα κάποια τύχη.<br>Το σύστημα είναι <br>Linux 2.4.20<br>g++ (GCC) 3.3.1<br><br>Ευχαριστώ,<br>Απόστολος<br><br><br>
</font>