Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verstehen der Bedeutung der Speichereinstellung in SQL Server

Arbeitsspeicher ist eine der Ressourcen, die das Leistungsdreieck bilden – CPU und Speicher sind die anderen beiden. Wenn einer getroffen wird, übernehmen die anderen beiden die Last, um zu versuchen, die Leistung auf ein akzeptables Niveau zu bringen, aber es gibt immer einen Kompromiss. Alle Transaktionen, die nicht in den Speicher geschrieben werden können, werden von SQL Server an das Datenträgersubsystem weitergeleitet. Dies verursacht einen Leistungsengpass. Daher können die Wartestatistiken dabei helfen, Leistungsprobleme auf einem SQL Server zu identifizieren.

In diesem Artikel werden die folgenden Themen behandelt:

  1. Interna der Speichereinstellung und -konfiguration von SQL Server verstehen
  2. Der SQL Server-Speicher und seine Auswirkungen auf die Datenbank- und Anwendungsleistung
  3. Diskutieren Sie verschiedene SQL Server-Komponenten, die zur Speichernutzung beitragen
  4. Best Practices und Empfehlungen für die Speichergröße
  5. Speicherbericht für mehrere Server
  6. Und mehr...

Interna der Speicherverwaltung

SQL Server verfügt über eine Memory Management Unit, die basierend auf der Arbeitslast des Systems eine automatisierte dynamische Speicherverwaltung durchführt. Dieser Speicher ist der flüchtige Speicherplatz, der für die heutigen Business-Tech-Anforderungen von entscheidender Bedeutung ist, dessen richtige Dimensionierung für die optimale Leistung der Anwendungen von entscheidender Bedeutung ist.

Wir alle wissen jedoch, dass beim Einrichten des Servers die Größe einige Standardwerte enthält. In einigen Fällen stellen wir schnell fest, dass SQL Server fast den gesamten Speicher auf dem Server verwendet, obwohl keine sichtbaren Aktivitäten auf den Datenbanken stattfinden, was die Fragen aufwirft:Sind die Standardwerte falsch? Wenn ja, was sollte die richtige Größe sein?

Die Speicherverwaltung auf SQL Server arbeitet mit dem Fill-and-Flush-Algorithmus. Die Standardwerte schränken das Anwachsen des Speicherverbrauchs nicht ein, es sei denn, es gibt eine Anforderung vom Betriebssystem.

Die Dimensionierung hängt von verschiedenen Komponenten des Systems ab – in vielen Fällen ist eine Einstellung zwischen 70 % und 80 % ein guter Ausgangspunkt. Dann sollten Sie es auch überwachen, um zu sehen, was Ihnen sonst noch fehlt und ob Sie die Einstellung optimieren sollten. Wenn Sie andere Dienste auf dem SQL Server haben (das sollten Sie wirklich nicht), müssen Sie möglicherweise mehr zurücklassen, insbesondere wenn diese Dienste Speicherfresser sind. Erwägen Sie, die Speichereinstellung der SQL-Instanz in einem der folgenden Szenarios erneut zu überprüfen:

  • Nichtreaktion des Betriebssystems
  • Anwendung erschöpft
  • Sicherungsvorgänge, die große Speicherpuffer erfordern
  • In-Memory-optimierte Objekte
  • Column Store-Indizes, da sie große Mengen an Arbeitsspeicher benötigen, um Indexwartungen durchzuführen.

Die Speichereinstellung auf SQL Server ist ziemlich einfach. Sie können den Wert mit sp_configure ändern oder SSMS-GUI. Dies ist eine Online-Option, aber denken Sie daran, dass das Setzen oder Zurücksetzen dieser Werte dazu führen kann, dass einige der internen Cache-Objekte neu gemischt werden, wodurch das System etwas langsamer läuft.

sp_configure 'maximaler Serverspeicher (MB)',

In diesem Fall bedeutet die Zahl „2147483647“, dass SQL Server keine Obergrenze hat und den gesamten Speicher auf dem Server verwendet.

Min. Serverspeicher:Min. Serverspeicher als Mindestwert; SQL Server schreibt Arbeitsspeicher für seine eigene Verwendung fest, bis die Einstellung für den minimalen Serverarbeitsspeicher erreicht ist. Danach wird mindestens diese Menge an nutzbarem Speicher beibehalten.

Maximaler Serverspeicher:So wie der minimale Serverspeicher eine Untergrenze darstellt, stellt der maximale Serverspeicher eine Obergrenze dar.

Die minimalen und maximalen Speicherebenen sind die untere und obere Grenze der Speichermenge, die für die Verwendung durch den Pufferpool zulässig ist. Der Pufferpool ist der größte Speicherblock, der von SQL Server verbraucht wird. Im Folgenden sind die SQL Server-Komponenten innerhalb der SQL-Instanz aufgeführt, die Speicher aus dem Pufferpool verwenden

  • Datenbankseiten-Cache
  • Interne Log-Caches
  • Prozedur-Cache oder Abfrageplan-Cache
  • Arbeitslastbereich abfragen
  • Sperren (Speicherzuweisungen)
  • Verbindungskontext
  • Suchanfragen optimieren
  • Datenstrukturen auf Systemebene

Die Werte der wichtigen Metriken wie Available Mbytes, Pages/Sec, Buffer Cache Hit Ratio, PLE etc. bestimmen die SQL Server Performance.

Die Buffer Cache Hit Ratio ist für jede Anwendung spezifisch. 90 % werden normalerweise als wünschenswert angesehen. Das bedeutet, dass über 90 % der Anfragen vom Cache bedient wurden, was eine gute Sache ist. Wenn der Wert niedriger ist, fügen Sie mehr Speicher hinzu, bis er konstant höher als 90 % ist.

Verfügbare Bytes sind nichts anderes als ein Hinweis darauf, wie viel Speicher zur Verwendung verfügbar ist. Der Seiten/Sek.-Zähler zeigt an, wie viele Seiten von der Festplatte abgerufen oder auf die Festplatte geschrieben wurden, beides aufgrund von Hardpage-Fehlern.

PLE steht für Page Life Expectancy, was angibt, wie viele Sekunden die Seite im Pool bleibt.

Zum Beispiel

$server = 'hqdbt01'

$counters = @("\Memory\Available MBytes",
 "\Memory\Pages/sec",
 "\SQLServer:Buffer Manager\Buffer cache hit ratio",
 "\SQLServer:Buffer Manager\Lazy writes/sec",
 "\SQLServer:Buffer Manager\Page life expectancy" 

 ) 
 $collections = Get-Counter -ComputerName $server -Counter $counters -SampleInterval 10 -MaxSamples 1
 Write-Output $collections 
 foreach ($collection in $collections) 
 {$sampling = $collection.CounterSamples | Select-Object -Property TimeStamp, Path, Cookedvalue 
  $sampling | Format-Table -AutoSize
   }

Empfehlungen und Best Practices

Sehen wir uns nun kurz die Techniken zur Dimensionierung des Speichers an.

  1. 1 GB Speicher für das Betriebssystem reserviert
  2. jeweils 1 GB pro 4 GB RAM nach den anfänglichen 4 GB bis zu 16 GB RAM
  3. jeweils 1 GB pro 8 GB in mehr als 16 GB RAM

Wenn Sie beispielsweise einen 32-GB-RAM-Datenbankserver haben, wäre der dem Betriebssystem zuzuweisende Arbeitsspeicher

  1. 1 GB, die Mindestzuteilung
  2. + 3 GB, da 16 GB – 4 GB =12 GB; 12 GB geteilt durch 4 GB (je 4 GB ergeben 1 GB) sind 3 GB.
  3. + 2 GB, da 32 GB – 16 GB =16 GB; 16 geteilt durch 8 (jede 8 GB nach 16 GB ergeben 1 GB) sind 2 GB

Insgesamt werden also für einen Server mit 32 GB RAM 7 GB für das Betriebssystem reserviert. Dies ist der maximale Speicher, der SQL Server zugewiesen wird, sollte 25 GB betragen. Ebenso sollten für einen 64-GB-Server 10 GB für das Betriebssystem reserviert und 54 GB für SQL Server zugewiesen werden.

Wir alle haben irgendwann von Windows Management Instrumentation (WMI) gehört oder es verwendet. Es gibt mehrere Klassen in WMI, die es uns ermöglichen, Informationen über die Hardware, installierte Software, das Betriebssystem oder sogar die Registrierung zu extrahieren. Wir können sogar Einstellungen ändern und Aktionen zu diesen Aspekten durchführen.

Die Klasse win32_OperatingSystem ist eine WMI-Klasse, die alle notwendigen Informationen über active enthält Betriebssystem (falls Sie beispielsweise dual booten). Diese Klasse kann auch verwendet werden, um die dem Betriebssystem zugewiesene Speichermenge abzurufen. Hier sind einige der Objekte, die die Klasse zurückgeben kann und die uns helfen könnten (Speicher wird von dieser Klasse in Kilobyte gemessen):

  • TotalVisibleMemorySize :Dieses Feld zeigt den gesamten physischen Speicher an, auf den das Betriebssystem zugreifen kann. Unzugängliche Speicherblöcke können dazu führen, dass hier eine kleinere als die installierte Zahl angezeigt wird.
  • FreePhysicalMemory :Dies sagt uns, wie viel physikalischer Speicher frei ist.
  • TotalVirtualMemorySize :Dies ist der gesamte virtuelle Speicher, der für das Betriebssystem verfügbar ist. Dies umfasst den auf dem Computer installierten physischen Speicher sowie die Größe der Auslagerungsdatei.
  • FreeVirtualMemory :Ähnlich wie FreePhysicalMemory, enthält aber auch den freien Speicherplatz im Paging-Speicher.
$server='hqdbt01'
Get-WmiObject -Class Win32_OperatingSystem  -ComputerName $server | select  CSName,
@{name="TotalVirtualMemorySize";expression={($_.TotalVirtualMemorySize/1024).tostring("N0")}},
@{name="TotalVisibleMemorySize";expression={($_.TotalVisibleMemorySize/1024).tostring("N0")}},
@{name="FreePhysicalMemory";expression={($_.FreePhysicalMemory/1024).tostring("N0")}},
@{name="FreeVirtualMemory";expression={($_.FreeVirtualMemory/1024).tostring("N0")}},
@{name="FreeSpaceInPagingFiles";expression={($_.FreeSpaceInPagingFiles/1024).tostring("N0")}},
NumberofProcesses,
NumberOfUsers 

Wir können die Auslagerungsdateiinformationen mithilfe der WMI-Klasse Win32_PageFileSetting abrufen.

$server='hqdbt01'
Get-WMIObject Win32_PageFileSetting -Computer $server|  select @{name="ServerName";expression={$_.__Server}}, Name, InitialSize, MaximumSize 

Die folgende Abfrage gibt die allgemeinen Details zur Speichernutzung der SQL-Instanz an.

SELECT 
	physical_memory_in_use_kb/1024 Physical_memory_in_use_MB, 
    large_page_allocations_kb/1024 Large_page_allocations_MB, 
    locked_page_allocations_kb/1024 Locked_page_allocations_MB,
    virtual_address_space_reserved_kb/1024 VAS_reserved_MB, 
    virtual_address_space_committed_kb/1024 VAS_committed_MB, 
    virtual_address_space_available_kb/1024 VAS_available_MB,
    page_fault_count Page_fault_count,
    memory_utilization_percentage Memory_utilization_percentage, 
    process_physical_memory_low Process_physical_memory_low, 
    process_virtual_memory_low Process_virtual_memory_low
FROM sys.dm_os_process_memory;

Bereiten Sie das Skript vor

Lassen Sie uns die oben genannten drei Ausgaben in eine einzige Speicherausgabe integrieren:

  1. SQL Internal Memory-Strukturen mit Counter
  2. Verfügbarer virtueller und physischer Speicher mit WMI-Objekt
  3. Einstellung der Auslagerungsdatei mit WMI

Bei der Vorbereitung des HTML-Inhalts geht es darum, den Wert, der aus den verschiedenen Abschnitten des Skripts stammt, zwischen den richtigen Tags einzufügen.

Das Skript kann gültige HTML-Tags erstellen. Die folgenden Funktionen werden im Skript verwendet.

  1. writeHTMLHeader:Diese Funktion wird verwendet, um den Header zu generieren und den Stil für die HTML-Datei zu definieren.
  2. writetableFooter:definiert die schließenden HTML-Tags.
  3. writeTableHeader:definiert die dreizehnspaltige Ausgabeüberschrift für die HTML-Datei
  4. writeMemoryInfo:Dies ist die Funktion, die das Zusammenführen der beiden WMI-Klassenausgaben durchführt. Die Ausgabe von Win32_PageFileSetting, Win32_OperatingSystem und SMO SQL wird als Argumente für diese Funktion übergeben. Die Werte können in diesem Abschnitt auch weiter transformiert oder manipuliert werden.
  5. E-Mail-Bereich

[expand title="Code"]

# First, let’s create a text file, where we will later save memory details


$MailServer='mail01.example.com'

$MemoryFileName = "f:\PowerSQL\Memory.htm"
New-Item -ItemType file $MemoryFileName -Force
# Function to write the HTML Header to the file
Function writeHtmlHeader
{
param($fileName)
$date = ( get-date ).ToString('yyyy/MM/dd')
Add-Content $fileName "<html>"
Add-Content $fileName "<head>"
Add-Content $fileName "<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>"
Add-Content $fileName '<title>SQLShack Memory Usage Report </title>'
add-content $fileName '<STYLE TYPE="text/css">'
add-content $fileName  "<!--"
add-content $fileName  "td {"
add-content $fileName  "font-family: Tahoma;"
add-content $fileName  "font-size: 11px;"
add-content $fileName  "border-top: 1px solid #999999;"
add-content $fileName  "border-right: 1px solid #999999;"
add-content $fileName  "border-bottom: 1px solid #999999;"
add-content $fileName  "border-left: 1px solid #999999;"
add-content $fileName  "padding-top: 0px;"
add-content $fileName  "padding-right: 0px;"
add-content $fileName  "padding-bottom: 0px;"
add-content $fileName  "padding-left: 0px;"
add-content $fileName  "}"
add-content $fileName  "body {"
add-content $fileName  "margin-left: 5px;"
add-content $fileName  "margin-top: 5px;"
add-content $fileName  "margin-right: 0px;"
add-content $fileName  "margin-bottom: 10px;"
add-content $fileName  ""
add-content $fileName  "table {"
add-content $fileName  "border: thin solid #000000;"
add-content $fileName  "}"
add-content $fileName  "-->"
add-content $fileName  "</style>"
Add-Content $fileName "</head>"
Add-Content $fileName "<body>"

add-content $fileName  "<table width='100%'>"
add-content $fileName  "<tr bgcolor='#CCCCCC'>"
add-content $fileName  "<td colspan='13' height='25' align='center'>"
add-content $fileName  "<font face='tahoma' color='#003399' size='4'><strong>SQLShack Memory Usage Report - $date</strong></font>"
add-content $fileName  "</td>"
add-content $fileName  "</tr>"
add-content $fileName  "</table>"

}

# Function to write the HTML Header to the file
Function writeTableHeader
{
param($fileName)

Add-Content $fileName "<tr bgcolor=#CCCCCC>"
Add-Content $fileName "<td width='10%' align='center'>ServerName</td>"
Add-Content $fileName "<td width='10%' align='center'>TotalVirtualMemorySize</td>"
Add-Content $fileName "<td width='10%' align='center'>TotalVisibleMemorySize</td>"
Add-Content $fileName "<td width='10%' align='center'>FreePhysicalMemory</td>"
Add-Content $fileName "<td width='10%' align='center'>FreeVirtualMemory</td>"
Add-Content $fileName "<td width='10%' align='center'>FreeSpaceInPagingFiles</td>"
Add-Content $fileName "<td width='10%' align='center'>NumberofProcesses</td>"
Add-Content $fileName "<td width='10%' align='center'>NumberOfUsers</td>"
Add-Content $fileName "<td width='10%' align='center'>PageFile</td>"
Add-Content $fileName "<td width='10%' align='center'>Page-InitialSize</td>"
Add-Content $fileName "<td width='10%' align='center'>Page-MaxSize</td>"
Add-Content $fileName "<td width='10%' align='center'>SQLMaxMemory</td>"
Add-Content $fileName "<td width='10%' align='center'>SQLMinMemory</td>"
Add-Content $fileName "<td width='10%' align='center'>Memory Available MBytes</td>"
Add-Content $fileName "<td width='10%' align='center'>Buffer Cache Hit Ratio</td>"
Add-Content $fileName "<td width='10%' align='center'>PLE</td>"
Add-Content $fileName "</tr>"
}

Function writeHtmlFooter
{
param($fileName)

Add-Content $fileName "</body>"
Add-Content $fileName "</html>"
}

Function writeMemoryInfo
{
param($filename,$csname,$TotalVirtualMemorySize,$TotalVisibleMemorySize,$FreePhysicalMemory,$FreeVirtualMemory,$FreeSpaceInPagingFiles,$NumberofProcesses,$NumberOfUsers,$PageFile,$initialSize,$MaxSize,$SQLMaxMemory, $SQLMinMemory ,$mAvailableMBytes, $Buffercachehitratio, $PLE )
 Add-Content $fileName "<tr>"
 Add-Content $fileName "<td>$csname </td>"
 Add-Content $fileName "<td>$TotalVirtualMemorySize </td>"
 Add-Content $fileName "<td>$TotalVisibleMemorySize</td>"
 Add-Content $fileName "<td>$FreePhysicalMemory </td>"
 Add-Content $fileName "<td>$FreeVirtualMemory </td>"
 Add-Content $fileName "<td>$FreeSpaceInPagingFiles </td>"
 Add-Content $fileName "<td>$NumberofProcesses </td>"
 Add-Content $fileName "<td>$NumberOfUsers</td>"
 Add-Content $fileName "<td>$PageFile</td>"
 Add-Content $fileName "<td>$initialSize</td>"
 Add-Content $fileName "<td>$MaxSize</td>"
 Add-Content $fileName "<td>$SQLMaxMemory</td>"
 Add-Content $fileName "<td>$SQLMinMemory</td>"
 Add-Content $fileName "<td>$mAvailableMBytes</td>"
 Add-Content $fileName "<td>$Buffercachehitratio</td>"
 Add-Content $fileName "<td>$PLE</td>"
 
 Add-Content $fileName "</tr>"
}

Function sendEmail  

 { 
param($from,$to,$subject,$smtphost,$htmlFileName)  

$body = Get-Content $htmlFileName 
$body = New-Object System.Net.Mail.MailMessage $from, $to, $subject, $body 
$body.isBodyhtml = $true
$smtpServer = $MailServer
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($body)

    

 }  


writeHtmlHeader $MemoryFileName
 Add-Content $MemoryFileName "<table width='100%'><tbody>"
 Add-Content $MemoryFileName "<tr bgcolor='#CCCCCC'>"
 Add-Content $MemoryFileName "<td width='100%' align='center' colSpan=16><font face='tahoma' color='#003399' size='2'><strong> Memory Usage Details</strong></font></td>"
 Add-Content $MemoryFileName "</tr>"

 writeTableHeader $MemoryFileName

foreach ($svr in get-content "\\hqdbsp18\f$\PowerSQL\Server.txt"){

$page=Get-WMIObject Win32_PageFileSetting -Computer $svr|  select __Server, Name, InitialSize, MaximumSize
$dp = Get-WmiObject -Class Win32_OperatingSystem  -ComputerName $svr | select  CSName,
@{name="TotalVirtualMemorySize";expression={($_.TotalVirtualMemorySize/1024).tostring("N0")}},
@{name="TotalVisibleMemorySize";expression={($_.TotalVisibleMemorySize/1024).tostring("N0")}},
@{name="FreePhysicalMemory";expression={($_.FreePhysicalMemory/1024).tostring("N0")}},
@{name="FreeVirtualMemory";expression={($_.FreeVirtualMemory/1024).tostring("N0")}},
@{name="FreeSpaceInPagingFiles";expression={($_.FreeSpaceInPagingFiles/1024).tostring("N0")}},
NumberofProcesses,
NumberOfUsers

$srv = new-object ('Microsoft.SqlServer.Management.Smo.Server') ($svr)
write-host $srv.Configuration.MaxServerMemory.RunValue 
write-host $srv.Configuration.MinServerMemory.RunValue 


$counters = @("\Memory\Available MBytes",
 "\Memory\Pages/sec",
 "\SQLServer:Buffer Manager\Buffer cache hit ratio",
 "\SQLServer:Buffer Manager\Lazy writes/sec",
 "\SQLServer:Buffer Manager\Page life expectancy"
  ) 
 $collections = Get-Counter -ComputerName $svr -Counter $counters -SampleInterval 5 -MaxSamples 1
 Write-Output $collections 
 foreach ($collection in $collections) 
    {
     $sampling = $collection.CounterSamples | Select-Object -Property TimeStamp, Path, Cookedvalue 
     foreach($sam in $sampling)
        {
            if ($sam.Path -like "*\Memory\Available MBytes*") {
                $mAvailableMBytes=$sam.CookedValue
                }
            elseif ($sam.Path -like "*Buffer Manager\Buffer cache hit ratio*") {
                $Buffercachehitratio=$sam.CookedValue
            }
            elseif ($sam.Path -like "*Page life expectancy*") {
                $PLE=$sam.CookedValue}
        }
    }
write-host $mAvailableMBytes $Buffercachehitratio $PLE


Write-Host  $dp.csname $dp.TotalVirtualMemorySize $dp.TotalVisibleMemorySize $dp.FreePhysicalMemory $dp.FreeVirtualMemory $dp.FreeSpaceInPagingFiles $dp.NumberofProcesses $dp.NumberOfUsers  $page.InitialSize $page.Name $page.MaximumSize $srv.Configuration.MaxServerMemory.RunValue $srv.Configuration.MinServerMemory.RunValue  $mAvailableMBytes $Buffercachehitratio $PLE
writeMemoryInfo $MemoryFileName $dp.csname $dp.TotalVirtualMemorySize $dp.TotalVisibleMemorySize $dp.FreePhysicalMemory $dp.FreeVirtualMemory $dp.FreeSpaceInPagingFiles $dp.NumberofProcesses $dp.NumberOfUsers  $page.Name $page.InitialSize $page.MaximumSize $srv.Configuration.MaxServerMemory.RunValue $srv.Configuration.MinServerMemory.RunValue $mAvailableMBytes $Buffercachehitratio $PLE

 }


  Add-Content $MemoryFileName "</table>" 

writeHtmlFooter $MemoryFileName 
$date = ( get-date ).ToString('yyyy/MM/dd')
sendEmail [email protected] [email protected] "Memory Usage Report - $Date" $MailServer $MemoryFileName
 

[/expandieren]

Ausgabe

Abschluss

Nachdem Sie nun einige neue Dinge über die SQL Server-Speicherverwaltung gelernt haben, werden Sie die SQL Server-Ressourcen besser verstehen.

Wenn auf dem Server ausreichend RAM vorhanden ist, können die Datenseiten eine längere Lebensdauer im Pufferpool haben, was folglich zu einer drastischen Reduzierung des I/O-Bedarfs führt.

Während sich Datenbankadministratoren in den meisten Fällen auf Standardspeichereinstellungen verlassen, müssen wir verstehen, dass die Interna der Speicheranforderungen von der Arbeitslast der Instanz abhängen.

Dieser Artikel ist eine allgemeine exemplarische Vorgehensweise des SQL Server-Speichers und seiner Interna. Außerdem werden die verschiedenen Gründe für die Leistungsengpässe behandelt, die dadurch verursacht werden, dass der maximale Speicher nicht eingestellt wird.

Ich habe Schritt-für-Schritt-Anleitungen zum Einrichten und Konfigurieren eines Speicherberichts beigefügt. Die Schritte zum Festlegen des SQL-Speichers sind ebenfalls enthalten. Außerdem haben wir verschiedene SQL-Komponenten besprochen, die zur Nutzung des verfügbaren Speichers in der SQL Server-Umgebung beitragen.

Ein zu beachtender Punkt ist, dass die Zuweisung und Freigabe von Speicher den Start verlangsamt. Wenn mehrere Anwendungen auf demselben Server beendet und gestartet werden, kann dies daher die Leistung beeinträchtigen. Wenn mehrere andere Anwendungen auf demselben Server ausgeführt werden, ist es ebenfalls wichtiger, den minimalen Serverspeicher und den maximalen Serverspeicher festzulegen, um eine optimale Leistung sicherzustellen.

Das war's für jetzt...

Referenzen

  1. Speichernutzung überwachen
  2. Die Wichtigkeit der Einstellung des maximalen Serverspeichers in SQL Server und wie man ihn einstellt
  3. Server-Speicher-Server-Konfigurationsoptionen