Μέσα από το SQLschool.gr έχω αρκετές φορές επισημάνει το πώς πρέπει να ορίζουμε την μνήμη ενός instance. Αυτό που μέχρι τώρα δεν είχα κάνει είναι να αναφερθώ στο πως ορίζουμε την μνήμη ενός Analysis services instance.
Πρόσφατα χρειάστηκε πάνω σε ένα sql box με πολλά instance να στήσω και ένα Analysis service instance (multi-dimensional). Φυσικά δεν πρέπει να επισημάνω ότι δεν θα το άφηνα να αλωνίζει στην μνήμη του συστήματος και όπως έχω περιορίσει τα database instances έτσι και αυτό θα έχει τους περιορισμούς του.
Memory Usage in Analysis Services
Επειδή τα όσα έχω πει και μπορείτε να διαβάσετε στο SQLschool.gr σχετικά με την μνήμη του database engine δεν έχουν καμία σχέση με την μνήμη των analysis services θα ξεκινήσω με μια μικρή παρουσίαση αυτής.
Τα Analysis Services (AS) έχω διάφορα data structures που καταναλώνουν μνήμη. Σε αυτό το σημείο θα πρέπει να επισημάνω ότι η 32bit έκδοση δεν μπορεί να δει πάνω από 2GB μνήμη καθώς ακόμα και αν ενεργοποιήσω το AWE αυτό δεν το καταλαβαίνουν τα AS. Αν λοιπόν θέλετε περισσότερη μνήμη τότε τα 64bit είναι μονόδρομος.
Η μνήμη στα AS χωρίζεται σε δύο κατηγορίες Shrinkable Memory, Non-shrinkable Memory και οι οποίες περιέχουν τα εξής:
- Shrinkable Memory
- Data Cache
- Calculation Cache
- Paged in dimension data
- Non-shrinkable Memory
- Metadata
- Active Sessions
- Query memory
- Process memory
Από τα ονόματα είναι εύκολο να καταλάβουμε ότι η μία μπορεί να γίνει μικρότερη και επιστρέψει αυτό που δεν χρειάζεται στο OS ενώ η άλλη δεν επιστρέφει τίποτα.
Η διαδικασία επιστροφή της μνήμης στο OS γίνεται αυτόματα από τα AS καθώς αυτά περιέχουν έναν αλγόριθμο που ελευθερώνει ότι έχει αρκετό χρόνο να προσπελασθεί σε αυτή την μνήμη.
Setting memory in Analysis Services
To να ορίσεις την μνήμη που ένα AS instance θα έχει μπορείς να το κάνεις μέσα από τον SSMS εφόσον έχεις συνδεθεί στο instance αυτό και πάνω στον Object Explorer στο όνομα του instance κάνει δεξί κλικ properties. Με αυτό θα σου ανοίξει το γνωστό παράθυρο και στη επιλογή General έχει διαθέσιμες τις βασικές επιλογές.
Παρόλα αυτά όμως θα πρέπει να πατήσεις το check box Show Advanced (All) Properties για να έχεις περισσότερες επιλογές. Όμως ακόμα και αυτό να κάνεις δυστυχώς δεν τις έχεις όλες.
Βέβαια για να πούμε το σωστό έχεις αυτές που χρειάζονται στο 99% των περιπτώσεων. Αν τώρα είσαι στο άλλο 1% τότε ξεχνάμε το γραφικό περιβάλλον και πάμε στο directory που έχουν εγκατασταθεί τα AS και που συνήθως είναι το C:\Program Files\Microsoft SQL Server\MSAS….\OLAP\Config.
Μέσα σε αυτό υπάρχει ένα ini file με το όνομα msmdsrv.ini. Αυτό για να το ανοίξετε θα πρέπει να ξεκινήσετε ένα notepad με run as administrator αλλιώς ούτε ανοίγει ούτε θα σωθεί μετά από τις αλλαγές σας.
Αν και ini ανοίγοντας το θα δείτε ότι έχει την μορφή XML και σε αυτό ψάχνουμε μέχρι να βρούμε το section για την μνήμη που θα πρέπει να είναι όπως παρακάτω:
<Memory>
<MemoryHeapType>2</MemoryHeapType>
<HeapTypeForObjects>0</HeapTypeForObjects>
<HardMemoryLimit>0</HardMemoryLimit>
<TotalMemoryLimit>81</TotalMemoryLimit>
<LowMemoryLimit>66</LowMemoryLimit>
<VertiPaqMemoryLimit>60</VertiPaqMemoryLimit>
<MidMemoryPrice>10</MidMemoryPrice>
<HighMemoryPrice>1000</HighMemoryPrice>
<VirtualMemoryLimit>80</VirtualMemoryLimit>
<SessionMemoryLimit>50</SessionMemoryLimit>
<MinimumAllocatedMemory>25</MinimumAllocatedMemory>
<WaitCountIfHighMemory>10</WaitCountIfHighMemory>
<DefaultPagesCountToReuse>2</DefaultPagesCountToReuse>
<HandleIA64AlignmentFaults>0</HandleIA64AlignmentFaults>
<PreAllocate>0</PreAllocate>
<VertiPaqPagingPolicy>1</VertiPaqPagingPolicy>
<PagePoolRestrictNumaNode>0</PagePoolRestrictNumaNode>
</Memory>
Στο σημείο αυτό θα πρέπει να επισημάνω μια αρκετά σημαντική ιδιαιτερότητα που υπάρχει.
Οι τιμές που είναι από 1 – 100 είναι ποσοστό στην Total Physical Memory της μηχανής δηλαδή για παράδειγμα το TotalMemoryLimit όπως είναι παραπάνω έχει την τιμή 81 που σημαίνει 81% της φυσικής μνήμης της μηχανής.
Οι τιμές που είναι πάνω από 100 είναι σε bytes και φυσικά ορίζουν την μνήμη. Για παράδειγμα αν στο TotalMemoryLimit θέλω να είναι 8GB θα πρέπει να ορίσω την τιμή 8589934592.
Memory Properties explanation
Το τι είναι τώρα το κάθε ένα από αυτά μπορείτε να το βρείτε στα BOL, παρόλα για την ευκολία στο διάβασμα κάνω αντιγραφή από αυτά.
LowMemoryLimit
Specifies the amount of memory allocated by Analysis Services at start up. When this limit is reached, the instance will start to slowly clear memory out of caches by closing expired sessions and unloading unused calculations. The server will not release memory below this limit. The default value is 65; which indicates the low memory limit is 65% of physical memory or the virtual address space, whichever is less.
TotalMemoryLimit
Defines a threshold that when reached, causes the server to deallocate memory more aggressively. The default value 80% of physical memory or the virtual address space, whichever is less. Note that TotalMemoryLimit must always be less than HardMemoryLimit
HardMemoryLimit
Specifies a memory threshold after which the instance aggressively terminates active user sessions to reduce memory usage. All terminated sessions will receive an error about being cancelled by memory pressure. The default value, zero (0), means the HardMemoryLimit will be set to a midway value between TotalMemoryLimit and the total physical memory of the system; if the physical memory of the system is larger than the virtual address space of the process, then virtual address space will be used instead to calculate HardMemoryLimit.
VirtualMemoryLimit
An advanced property that you should not change, except under the guidance of Microsoft support.
VertiPaqPagingPolicy
Specifies the paging behavior in the event the server runs low on memory. Valid values are as follows: Zero (0) disables paging. If memory is insufficient, processing fails with an out-of-memory error. If you disable paging, you must grant Windows privileges to the service account. See Configure Service Accounts (Analysis Services) for instructions. 1 is the default. This property enables paging to disk using the operating system page file (pagefile.sys). When VertiPaqPagingPolicy is set to 1, processing is less likely to fail due to memory constraints because the server will try to page to disk using the method that you specified. Setting the VertiPaqPagingPolicy property does not guarantee that memory errors will never happen.
Out of memory errors can still occur under the following conditions:
- There is not enough memory for all dictionaries. During processing, Analysis Services locks the dictionaries for each column in memory, and all of these together cannot be more than the value specified for VertiPaqMemoryLimit.
- There is insufficient virtual address space to accommodate the process.
To resolve persistent out of memory errors, you can either try to redesign the model to reduce the amount of data that needs processing, or you can add more physical memory to the computer. Applies to tabular server mode only.
VertiPaqMemoryLimit
If paging to disk is allowed, this property specifies the level of memory consumption (as a percentage of total memory) at which paging starts. The default is 60. If memory consumption is less than 60 percent, the server will not page to disk. This property depends on the VertiPaqPagingPolicyProperty, which must be set to 1 in order for paging to occur. Applies to tabular server mode only.
HighMemoryPrice
An advanced property that you should not change, except under the guidance of Microsoft support.
MemoryHeapType
An advanced property that you should not change, except under the guidance of Microsoft support. Applies to multidimensional server mode only.
HeapTypeForObjects
An advanced property that you should not change, except under the guidance of Microsoft support. Applies to multidimensional server mode only.
DefaultPagesCountToReuse
An advanced property that you should not change, except under the guidance of Microsoft support.
HandleIA64AlignmentFaults
An advanced property that you should not change, except under the guidance of Microsoft support.
MidMemoryPrice
An advanced property that you should not change, except under the guidance of Microsoft support.
MinimumAllocatedMemory
An advanced property that you should not change, except under the guidance of Microsoft support.
PreAllocate
An advanced property that you should not change, except under the guidance of Microsoft support.
SessionMemoryLimit
An advanced property that you should not change, except under the guidance of Microsoft support.
WaitCountIfHighMemory
An advanced property that you should not change, except under the guidance of Microsoft support.
PreAllocate Memory
Θα σταθώ σε αυτό το setting καθώς θεωρώ ότι είναι αρκετά σημαντικό στις περιπτώσεις που έχω ένα SQL Box που έχει και άλλα instances εκτός από αυτό των AS.
Με αυτό μπορώ να κάνω pre-allocate την μνήμη που θέλω με το που ξεκινάει το services των AS και έτσι με αυτό τον τρόπο μπορώ να έχω καλύτερο system throughput και stable memory configuration. H τιμή που θα πρέπει να ορίζω σε αυτό πρέπει να είναι μικρότερη ή ίση με την τιμή που έχω ορίσει στο LowMemoryLimit.
Επίσης θα πρέπει να επισημάνω ότι αν το account που ξεκινάει το service των AS έχει το user right στο local security policy Lock pages in Memory τότε τα AS θα κάνουν large memory pages allocation, πράγμα που είναι αρκετά χρήσιμο αλλά παίρνει λίγο χρόνο παραπάνω για να γίνει. Επίσης για όσους θα διαβάσουν το άρθρο αυτό και είναι σε Window Server 2008 και πίσω καλό θα είναι υποψιασμένοι καθώς η συγκεκριμένη ρύθμιση έχει επιπτώσεις στην απόδοση του OS.
Aggregation Memory
Τα AS σύνθετο εργαλείο και κάνει αρκετή δουλειά στο παρασκήνιο έτσι υπάρχουν και επιμέρους ρυθμίσεις που καλό θα είναι να γνωρίζουμε όπως τα
- OLAP\Process\AggregationMemoryLimitMin
- OLAP\Process\AggregationMemoryLimitMax
Με αυτά ορίζουμε το πόσο μνήμη θα χρησιμοποιείται για την δημιουργία των aggregations και των indexes για κάθε partition. Tα AS όταν ξεκινάνε εργασίες όπως partition processing που γίνονται παράλληλα, αυτός ο παραλληλισμός βασίζεται σε ότι έχω ορίζει σε αυτά.
Buffer memory
Με τα παρακάτω memory properties ορίζουμε το μέγεθος των fact data buffers που θα χρησιμοποιηθούν κατά το partition data processing.
- OLAP\Process\BufferMemoryLimit
- OLAP\Process\BufferMemoryLimit
Αν και με τα defaults κάνουμε την δουλειά μας εντούτοις υπάρχουν περιπτώσεις που θα χρειαστεί να τα πειράξουμε. Μια τέτοια περίπτωση είναι όταν το granularity των measure groups που έχουμε είναι περισσότερο summarized από ότι στα relational data του fact table θα χρειαστεί να μεγαλώσουμε το μέγεθος των buffers για να μπορεί να γίνει το data grouping.
MemoryHeapType & HeapTypeForObjects
Στις παλαιότερες εκδόσεις των AS (2008 R2) και τα δύο είχαν την τιμή 1. Επειδή όμως αυτό δεν ήταν ιδανικό πλέον οι τιμές είναι 2 και 0. Η χρησιμότητα αυτών είναι κατά το query execution όπου τα AS διαβάσουν μεγάλο όγκο δεδομένων και αναγκαστικά κάνουν πολλά memory allocations με πολλούς χρήστες. Για αυτό το λόγο και οι τιμές έχουν αλλάξει σαν default πλέον στις εκδόσεις από 2012 και πάνω και δεν βλέπω σε αυτές το λόγο για τις πειράξει κάποιος.
Επίλογος
Ελπίζω να σας έδωσα μια εικόνα για τη μνήμη στα AS. Η δυσκολία στον σωστό ορισμός της είναι κάτι που έχετε καταλάβει ήδη και δεν υπάρχουν best practices. Αυτό που πρέπει κάποιος να κάνει είναι να κάνει monitoring με τους performance counter για την μνήμη των AS ώστε να είναι σε θέση να ορίζει κοντά στην πραγματικότητα του τις τιμές για αυτή.
/*antonch*/