Ας συνεχίζουμε στο δεύτερο και τελευταίο μέρος τους SQLOS. To 1ο μέρος θα το βρείτε εδω.
Memory Management
Τα Windows στην x86 έκδοση τους δίνουν σε όλα τα processes 4GB Virtual Address Space (VAS), η οποία χωρίζεται σε δύο μέρη των 2GB το καθένα, το ένα είναι το user mode partition και το άλλο είναι το kerner mode partition όπως συνηθίζουμε να τα λέμε.
Εάν ένα application χρειάζεται περισσότερο από τα 2GB του user mode partition στο VAS μπορώ να προσθέσω τον διακόπτη /3GB στο boot.ini αρχείο του λειτουργικού συστήματος. Αυτό σημαίνει ότι θα περιοριστεί το μέγεθος του kerner mode partition του VAS σε 1GB, και το user mode partition θα γίνει 3GB τα οποία θα είναι διαθέσιμα στο application.
Στα Windows XP και στα Windows 2003 υπάρχει άκομα ένας διακόπτης ο /USERVA ο οποίος μπαίνει και αυτός στο boot.ini και ο οποίος δίνει καλύτερο έλεγχο μιας και μας επιστρέπει να ορίσουμε ακριβώς το μέγεθος που θα έχει user mode partition του VAS ή αν το πούμε αλλιώς το μέγεθος που θα χάσει το kerner mode partition του VAS
Ακόμα και όταν τα 3GB μνήμης στο user mode partition δεν είναι αρκετά μπορώ, εάν φυσικά χρησιμοποίω επεξεργαστή που είναι Pentium Pro και πάνω, να προσθέσω τον διακόπτη /PAE στο boot.ini, και να εκμεταλευτώ το the Address Windowing Extensions (AWE) που παρέχουν τα Windows ώστε να φτάσω τα 64GB φυσικής μνήμης.
Εδώ θα πρέπει αν επισημάνω ότι μειώνοντας το μέγεθος του kernel mode partition του VAS στο 1GB στην ουσία μειώνω το χώρο για τις εσωτερικές λειτουργίες και δομές του λειτουργικού.
Ο SQL Server χωρίζει την δικιά του VAS σε δυο περιοχές
Βuffer Pool
H περιοχή αυτή είναι γνωστή και σαν BPoll, και είναι η βασική περιοχή αποθήκευσης στην μνήμη του SQL Server. Χρησιμοποιήτε για τα data & index pages και για όλες τις ανάγκες αποθήκευσης στην μνήμη που είναι μικρότερες των 8KB. Το μέγεθος της ορίζεται από τις τιμές που δίνω στα server configuration options max server memory και min server memory. Η BPoll ποτέ δεν ξεπερνάει τα όρια τα οποία έχουμε ορίζει με τα options τα οποία ανέφερα παραπάνω. Μέσα στην BPoll υπάρχουν γνωστά objects όπως buffer cache, procedure cach, system-level structures, locks, log caches, connection contexts.
Reserved Address Space (RAS)
Την περιοχή αυτή αρκετοί την λένε MemToLeave, άλλοι όπως και εγω την λέμε Reserved Address Space. Εμείς οι άλλοι πιστεύουμε ότι η ονομασία MemToLeave είναι παντελώς λάθος αλλά δεν θα ασχοληθώ εδώ με αυτό. Η περιοχή αυτή χρησιμοποιείτε για internal SQL Server allocations τα οποία περνούν τα 8ΚΒ συνεχούς χώρου, αλλά και για allocations που γίνονται από external consumers όπως extended stored procedures, OLE DB providers, in-process COM objects, SQLCLR assemblies κ.λ.π. Το μέγεθος της ορίζεται από την forumla
RAS = 256 ΜΒ + ( max worker threads * 512 KB )
Αν ανατρέξουμε στην εικόνα που έχω δώσει στο πρώτο μέρος του θέματος αυτού θα δούμε ότι στον SQL Server 2005 η αρχιτεκτονική του memory management αποτελείτε από αρκετά components όπως memory nodes, memory clerks, caches, pools, και memory objects.
The memory node component
Αυτό είναι υπεύθυνο για το μέρος που θα δεσμευθεί (locality of allocations). Αποτελείτε από τις εξής σελίδες:
- single-page allocator,
- multi-page allocator,
- large page allocator,
- reserved page allocator,
- virtual allocator,
- shared memory allocator.
Memory clerks
Αυτοί είναι το κλειδί στο granular memory management στον SQL Server 2005. Επιτρέπουν στον SQLOS να παρακολουθεί και να ελέγχει το μέγεθος της μνήμης που δεσμεύεται από το κάθε component.
Η sys.dm_os_memory_clerks είναι αυτή η DMV την οποία μπορείτε να χρησιμοποιήσετε για να δείτε το memory distribution, όπως και την λίστα των ενεργών memory clerks καθώς επίσης και το μέγεθος των διαφορετικών ειδών μνήμης που έχουν δεσμευθεί από κάθε clerk.
Για παράδειγμα το παρακάτω query δείχνει πως με την χρήση της sys.dm_os_memory_clerks DMV μπορείτε να δείτε τον κάθε τύπο του memory clerk μαζί με το σύνολο των reserved virtual memory, committed virtual memory, single και multi-pages που έχει δεσμεύσει ο καθένας
SELECT [type],
SUM(virtual_memory_reserved_kb) AS TotalVirtualMemoryReservedΚΒ,
SUM(virtual_memory_committed_kb) AS TotalVirtualMemoryCommittedKB,
SUM(multi_pages_kb) AS TotalMultiPagesKB,
SUM(single_pages_kb) AS TotalSinglePagesKB
FROM sys.dm_os_memory_clerks
GROUP BY [type]
ORDER BY TotalVirtualMemoryCommittedKB DESC,
TotalVirtualMemoryReservedΚΒ DESC,
TotalMultiPagesKB DESC,
TotalSinglePagesKB DESC
Επίσης μπορείτε να κάνετε χρήση της sys.dm_os_virtual_address_dump DMV για να δείτε λεπτομερείς πληροφορίες για την VAS.