Als ich noch Gameserver-Sponsor war, wurde mir sehr oft die Frage gestellt, was am Kernel optimiert werden muss damit z. B. ein 128-Tick Counter-Strike: Global Offensive Server problemlos läuft. Diese Frage konnte ich aber jeweils immer nur zum Teil beantworten oder für „Laien“ zu unverständlich.
Deshalb schreibe ich dieses Tutorial, welches die grundlegende Optimierung des Kernels beinhaltet. Jegliches Feintuning müsst ihr selbst für euer System, auf dem der Gameserver laufen soll, selbst erproben.
Dieses Tutorial ist auf 3 Betriebssysteme ausgelegt, nämlich Debian 8 (Jessie), Debian 9 (Stretch) und Debian 10 (Buster).
1. Die Vorbereitungen
Bevor wir überhaupt damit anfangen können den Kernel zu modifizieren, updaten wir unsere Paketlisten und das System mit:
$ apt-get update && apt-get upgrade |
Nachdem wir dies getan haben, installieren wir die zum kompilieren benötigten Pakete:
Für Debian 8:
$ apt-get install kernel-package libncurses-dev bzip2 make build-essential |
Für Debian 9 & 10:
$ apt-get install bc libncurses-dev bzip2 make build-essential libelf-dev libssl-dev bison flex |
Je nach Rechenleistung eures Servers, kann dies eine Weile dauern. Denn die Pakete, die wir installieren, haben viele Abhängigkeiten, welche mit installiert werden.
Als nächstes laden wir uns die Sourcefiles des zu diesem Zeitpunkt aktuellen Stable-Kernels von https://www.kernel.org/ herunter und entpacken diesen gleich.
An dieser Stelle möchte ich noch sagen, dass ihr diesen Punkt bitte nicht einfach nur kopiert. Nehmt den aktuellen Stable- oder Mainline-Kernel von der oben genannten Seite.
Aber nun zum eigentlichen Download:
$ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.6.tar.xz
$ tar -xvf linux-4.9.6.tar.xz |
Jetzt wechseln wir in das Verzeichnis mit den gerade entpackten Dateien:
$ cd linux-4.9.6 |
2. Das Modifizieren des Kernels
(UPDATE: Diese Punkte können bei neueren Kernel Versionen variieren oder sogar komplett fehlen!)
Ab diesem Punkt gibt es zwei Möglichkeiten mit dem Modifizieren zu beginnen. Die erste wäre mit dem Befehl $ make localmodconfig.
Dieser erstellt eine Konfiguration basierend auf der eures aktuellen Systems und der dort geladenen Module.
Variante 2 ist der Befehl $ make localyesconfig
. Hier wird ebenfalls eine Konfiguration basierend auf eurem System erstellt, nur hier werden die geladenen Module direkt in den Kernel eingebunden.
Für dieses Tutorial nutze ich den Befehl:
$ make localmodconfig |
Beim Ausführen dieses Befehls werden eine ganze Menge Fragen angezeigt, die man alle mit der „Enter“-Taste bestätigen kann.
Wenn der Grundaufbau steht, können wir nun die grafische Konfiguration des Kernels aufrufen.
$ make menuconfig |
Hier seht ihr ein recht einfach gehaltenes Menü, durch welches ihr mit den Pfeiltasten navigiert.
Als erstes nehmen wir uns das Timer subsystem vor. Dazu begebt ihr euch auf General setup ---> Timers subsystem --->
Hier angekommen ändern wir das Timer tick handling
auf Full dynticks system (tickless)
.
Setzt mit Hilfe der Leertaste überall ein Sternchen um die Funktionen zu aktivieren. So sollte es nun bei euch aussehen:
Über die Option Number of CPUs above which large-system approach is used
braucht ihr euch keine Gedanken machen.
Wir gehen dann wieder zurück in das Hauptmenü und widmen uns den IO Schedulers
.
In das Untermenü gelangt ihr so: [*] Enable the block layer ---> IO Schedulers --->
Dort angekommen ändert ihr den Default I/O scheduler
auf Deadline
.
Und wir begeben uns wieder einmal in das Hauptmenü und definieren jetzt den Prozessor Typ sowie die Tickrate des Kernels.
Dazu gehen wir in den Menüpunkt Processor type and features --->
Hier bewegen wir uns schrittweise in der Liste nach unten bis wir folgenden Punkt gefunden haben:
Wenn ihr diesen Punkt gefunden habt, ändert ihn entsprechend eurer CPU (Generic-x86-64 für AMD und Core 2/newer Xeon für Intel).
Und weiter geht es in der Liste. Wir setzen nun das Preemption Model
auf Preemptible Kernel (Low-Latency Desktop)
.
Wir wollen ja schließlich einen schnellen und genauen Kernel haben. Was uns dazu noch fehlt ist die Timer frequency
. Diese findet ihr weiter unten im selben Menü.
Wenn ihr den Punkt gefunden habt, setzt ihn auf 1000 Hz
.
Zum vorletzten mal (versprochen) begeben wir uns in das Hauptmenü und suchen nun den Menüpunkt CPU Frequency scaling
auf.
Finden tut ihr ihn hier: Power management and ACPI options ---> CPU Frequency scaling --->
In diesem Menü angekommen deaktiviert ihr das Modul mit der Leertaste und könnt direkt wieder zurück ins Hauptmenü.
In den späteren Kernel-Versionen kann man die Option „CPU Frequency Scaling„ nicht mehr deaktivieren! Stattdessen setzt ihr einfach den „Default CPUFreq governor„ auf „performance„. Diese Option befindet sich auf der selben Seite.
Und zu guter Letzt wollen wir ein paar Netzwerk-Optionen ändern.
Also begeben wir uns folgendermaßen dorthin: [*] Networking support ---> Networking options --->
Angekommen bewegt ihr euch nach unten bis zum Punkt Network packet filtering framework (Netfilter)
und aktiviert es. Sollte es schon aktiviert sein, dann müsst ihr nichts daran ändern.
Als letzte Veränderung aktivieren wir noch das QoS and/or fair queueing
. Wie eben kann dieser Punkt bereits aktiv sein. Sollte es nicht der Fall sein, muss er aktiviert werden.
Nachdem wir all diese Einstellungen vorgenommen haben, können wir das grafische Menü mit „Exit“ verlassen und uns dem Kompilieren widmen.
Wenn das Menü verlassen wird, fragt man euch, ob ihr die aktuelle Konfiguration speichern wollt. Beantwortet diese definitiv mit „Yes“, ansonsten könnt ihr alle Einstellungen erneut vornehmen.
3. Das Kompilieren und Installieren des Kernels
Ab hier ist es nicht mehr weit bis zu eurem eigenen Kernel.
Den Prozess starten wir unter Debian 8 mit dem Befehl:
$ make–kpkg clean && make–kpkg —initrd kernel_image kernel_headers
|
Im Fall von Debian 9 & 10 mit:
$ make -j8 deb-pkg LOCALVERSION=-basictut KDEB_PKGVERSION=1 |
Das Kompilieren des Kernels kann je nach Rechenleistung eine „Weile“ dauern. Also könnt ihr ruhig Kaffee und Kuchen zu euch nehmen.
Sobald wir fertig sind, verlassen wir den Ordner mit den Sourcefiles und sehen dort auch schon unsere .deb
Dateien die zum Installieren benötigt werden.
Diese beiden müssen wir nun nur noch mit dpkg
an unser System binden:
$ dpkg -i linux-headers-4.9.6_4.9.6-10.00.Custom_amd64.deb
$ dpkg -i linux-image-4.9.6_4.9.6-10.00.Custom_amd64.deb |
Nach der Installation starten wir das System neu:
$ reboot |
Und kontrollieren ob der Kernel auch wirklich installiert und aktiviert wurde:
$ uname -a |
Eure Ausgabe sollte dann ähnlich dieser hier sein:
Entnehmen könnt ihr dem ganzen die Kernel-Version, das Datum und die Uhrzeit wann der Kernel kompiliert wurde und welche Preemtion gewählt ist.
Zum Abschluss des Ganzen könnt ihr nun die Sourcefiles und die .deb
Dateien einfach löschen.
Am schnellsten geht es mit dem Befehl:
$ rm -r linux* |
Bedenkt jedoch bitte, dass dieser alles in dem Verzeichnis, in dem ihr euch befindet, löscht, was mit „linux-“ beginnt. Also schaut lieber noch einmal nach, denn ungewollter Datenverlust ist immer ärgerlich.
Ich hoffe dieses Tutorial ist einigen von euch hilfreich und falls ihr Fragen habt oder Fehler auftreten, stellt diese in den Kommentaren.