{"id":314,"date":"2017-08-29T13:08:07","date_gmt":"2017-08-29T12:08:07","guid":{"rendered":"http:\/\/eppesuigoccas.homedns.org\/wordpress\/?p=314"},"modified":"2017-08-29T13:08:07","modified_gmt":"2017-08-29T12:08:07","slug":"sql-server-e-la-gestione-automatica-della-memoria","status":"publish","type":"post","link":"https:\/\/blog.sguazz.it\/index.php\/archives\/314","title":{"rendered":"SQL Server e la gestione automatica della memoria"},"content":{"rendered":"<p>Ogni istanza di SQL Server ha due parametri che indicano la quantit\u00e0 minima e massima di memoria RAM da utilizzare. Se questi valori sono diversi, SQL Server allocher\u00e0 il minimo all&#8217;attivazione dell&#8217;istanza, e allocher\u00e0 altra memoria secondo le necessit\u00e0, arrivando eventualmente a raggiungere la soglia massima, ma senza superarla. Inoltre, l&#8217;istanza di SQL Server comunica al sistema operativo che, all&#8217;occorrenza, pu\u00f2 liberare spazio, cosicch\u00e9 quando il sistema non riesce a dare memoria ad altre applicazioni, chiede a SQL Server di liberarne un po&#8217;. In questo caso la quantit\u00e0 di memoria usata cala, rimanendo sempre sopra la soglia minima impostata.<\/p>\n<p>Fin qui tutto bene.<!--more--><\/p>\n<p>Ma che succede quando ci sono pi\u00f9 istanza di SQL server sulla stessa macchina? Supponiamo che nessuno abbia toccato le impostazioni sulla memoria, questa avranno i valori predefiniti, vale a dire che non c&#8217;\u00e8 limite superiore alla quantit\u00e0 di memoria da allocare. Allora, le istanze allocheranno memoria RAM finch\u00e9 ne hanno bisogno, arrivando a occuparla anche tutta. Quando una istanza avr\u00e0 ulteriore necessit\u00e0 di memoria, dovr\u00e0 svuotare una parte della sua <em>cache<\/em> e riutilizzarla, senza allocarne altra.<\/p>\n<p>Nel mio caso, una delle istanze \u00e8 collegata ad un applicativo molto utilizzato, e l&#8217;altra ad uno usato di rado. Durante il periodo estivo, la seconda applicazione non \u00e8 stata e la macchina riavviata. Quindi, dal riavvio, la prima ha allocato sempre pi\u00f9 memoria e la seconda \u00e8 rimasta al minimo. Poi, dopo la pausa estiva, gli utenti non sono riusciti ad usare la seconda applicazione: non vi erano messaggi d&#8217;errore se non qualche timeout dell&#8217;applicativo che si lamentava del database lento. La macchina per\u00f2 non era lenta: la CPU era poco utilizzata, il disco non era sovraccarico. La memoria era per\u00f2 tutta usata. Le <em>query<\/em> sulla seconda istanza erano in attesa di RESOURCE_SEMAPHORE, vale a dire che l&#8217;istanza non faceva neppure partire le <em>query<\/em> perch\u00e9 non aveva memoria sufficiente a preparare il piano d&#8217;esecuzione. Quelle sessioni era messe in attesa di allocare la memoria RAM, ma l&#8217;attesa non finiva mai perch\u00e9 la memoria era tutta usata dall&#8217;altra istanza.<\/p>\n<p>La soluzione \u00e8 stata di impostare il limite minimo di memoria per tutte le istanze, avendo cura che fosse sufficiente all&#8217;uso normale dell&#8217;applicativo. Per l&#8217;istanza principale, ho anche impostato il limite massimo, cos\u00ec da non utilizzare nuovamente 30Gb.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ogni istanza di SQL Server ha due parametri che indicano la quantit\u00e0 minima e massima di memoria RAM da utilizzare. Se questi valori sono diversi, SQL Server allocher\u00e0 il minimo all&#8217;attivazione dell&#8217;istanza, e allocher\u00e0 altra memoria secondo le necessit\u00e0, arrivando eventualmente a raggiungere la soglia massima, ma senza superarla. Inoltre, l&#8217;istanza di SQL Server comunica [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,3],"tags":[],"class_list":["post-314","post","type-post","status-publish","format-standard","hentry","category-sysadmin","category-computer"],"_links":{"self":[{"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/posts\/314","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/comments?post=314"}],"version-history":[{"count":1,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/posts\/314\/revisions"}],"predecessor-version":[{"id":315,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/posts\/314\/revisions\/315"}],"wp:attachment":[{"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/media?parent=314"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/categories?post=314"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.sguazz.it\/index.php\/wp-json\/wp\/v2\/tags?post=314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}