Den Kernel (stark) optimiert bauen
g(18072838)a(1760378))
Erstmal die Grundlage schaffen, mit Hilfe eines
#emerge =gentoo-sources-2.6.28-r1
Der 2.6.29-er Kernel macht leider Aerger mit CS, man hat extrem schwankende FPS, ich kam noch nicht dazu die Ursache rauszufinden.
Nein, wir werden jetzt kein tolles Kernelpatchset drueberjagen, den rt-patch oder so. Wir brauchen ihn nicht, alles was wir brauchen schlummert im Kernel.
Fühlt euch frei dennoch einen Kernel zu benutzen, der eine rt-patch-Version unterstuetzt und diese auch mit einzukompilieren.
Ich zaehle hier die wichtigsten Dinge auf, ich gehe ja eh davon aus euer Kernel ist so schlank wie moeglich:
# cd /usr/src/linux
# zcat /proc/config.gz >> .config
# make oldconfig
# make menuconfig
General setup --->
[ ] Control Group support
[ ] Fair group CPU scheduler
[ ] Create deprecated sysfs files
[ ] Optimize for size
Processor type and features --->
[ ] Tickless System (Dynamic Ticks)
[ ] High Resolution Timer Support
Subarchitecture Type (PC-compatible)
Processor family (Intel P4 / older Netburst based Xeon) // bei AMD natuerlich auch hier den Athlon-XP waehlen
(4) Maximum number of CPUs (2-255) // nicht mehr als die aktuelle CPUzahl
[ ] SMT (Hyperthreading) scheduler support
[*] Multi-core scheduler support
Preemption Mode (Preemptible Kernel (Low-Latency Desktop))
[ ] Enable kernel irq balancing << boese
Timer frequency (1000 HZ)
Power management options --->
[ ] Power Management support // solltet ihr nach dem booten nur noch 1 CPU haben, lasst dass hier und den Unterpunkt "ACPI" aktiviert.
[ ] CPU Frequency scaling
[ ] CPU idle PM support
Bus options (PCI etc.)
[ ] Enable deprecated pci_find_* API
[ ] Interrupts on hypertransport devices
Networking --->
Networking options --->
[*] Packet socket: mmapped IO
[*] Large Receive Offload (ipv4/tcp)
[ ] QoS and/or fair queueing --->
Device Drivers --->
Network device support --->
[*] Use Rx Polling (NAPI) // bei eurer Netzwerkkarte
Device Drivers --->
Character devices --->
[*] Enhanced Real Time Clock Support
[ ] Real Time Clock Histogram Support
Device Drivers --->
[*] Real Time Clock --->
[*] RTC UIE emulation on dev interface
Device Drivers --->
[*] DMA Engine support --->
[*] Intel I/OAT DMA support
[*] Network: TCP receive copy offload
Kernel hacking --->
Alles aus !
Das wars. Beenden und speichern.
Nein, noch nicht fertig.
# nano
Makefile
HOSTCFLAGS = -Wall -Wstrict-prototypes -O2
aendern wir auf
HOSTCFLAGS = -Wall -Wstrict-prototypes -O3 -march=prescott -pipe -fomit-frame-pointer -ffast-math -mfpmath=sse -msse -DNDEBUG
speichern. Nein, noch nicht fertig.
# nano arch/x86/include/asm/param.h
# define HZ CONFIG_HZ /* Internal kernel timer frequency */
# define USER_HZ 100 /* some user interfaces are */
# define CLOCKS_PER_SEC (USER_HZ) /* in "ticks" like times() */
aendern wir auf
# define HZ 2100 /* Internal kernel timer frequency */
# define USER_HZ 1 /* some user interfaces are */
# define CLOCKS_PER_SEC 1 /* in "ticks" like times() */
Ich weiss, es geht durchs Internet man soll USER_HZ auf 1000 oder 1500 stellen.
Ich mach mich seit dem ersten Tag immernoch drueber lustig.
Absoluter Bullmist !
Kompilier mal nen Kernel mit 1000 und danach den mit 1.
Man, sind deine FPS ploetzlich konstant.
Nein, noch nicht fertig. Danach:
# nano include/linux/jiffies.h
aendere
#elif HZ >= 1536 && HZ < 3072
# define SHIFT_HZ 11
auf
#elif HZ >= 1536 && HZ < 3072
# define SHIFT_HZ 1
und ein bisschen weiter unten:
#define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ) /* For divider */
zu
#define LATCH ((CLOCK_TICK_RATE + 2200/2) / 2200) /* For divider */
Dies ist ein sehr wichtiger Schritt, es holt uns 10 unnoetig verlorene jiffies wieder zurueck.
Jetzt nurnoch:
# nano kernel timeconst.pl
und
diese drei Zeilen:
print "#if HZ != $hz\n";
print "#error \"kernel/timeconst.h has the wrong HZ value!\"\n";
print "#endif\n";
auskommentieren, also so:
# print "#if HZ != $hz\n";
# print "#error \"kernel/timeconst.h has the wrong HZ value!\"\n";
# print "#endif\n";
Ja, jetzt fertig.
# make clean && kernel/timeconst.pl 2100 > kernel/timeconst.h &&
make -j6
#
cp arch/x86/boot/bzImage /boot/deinkernel
Oh man, fast vergessen.
ABSOLUT WAHNSINNIG WICHTIG IST ES:
in eurer menu.lst
# nano /boot/grub/menu.lst
hinter dem
kernel /boot/deinkernel root=/dev/sda2
ein
clocksource="tsc"
zu setzen.
Sieht so aus:
kernel /boot/deinkernel root=/dev/sda2 clocksource="tsc"
Der tsc ist speziell fuer Intel gedacht, wenn ihr AMD habt probiert mal ob ihr bessere Performance mit hpet anstatt tsc bekommt.
So, boote bitte in deinen neuen Kernel.