I am writing this guide to save my progress and let others contribute to increasing linux performance even further; after all, many are better than one. You can use all of them or just a few of them. Read a topic fully before starting.
I am currently on Nobara, so some steps may vary from distro to distro.
NOTE: This guide is not for beginners who are new to Linux but a few of them can be used safely by them.
By now, everyone agrees that compiling your kernel is one of the best options to get the fastest possible speed.
You might want to google How to make custom kernel in <distro>
to get the packages required to compile the kernel.
Download the latest kernel or whatever you like. Extract it; I am going to assume a
generic name from now on linux-x.x.x
.
config
file. Most of the time, you can run:
cp -v /boot/config-$(uname -r) .config
From inside linux-x.x.x
, which should give an output like:
'/boot/config-y.y.y-generic' -> '.config'
if it fails, you can find config in /proc/config.gz
or simple run make listnewconfig
OR make oldconfig
(it
usually starts a long process; try finding your config in your distro source code too).
Edit Makefile
and change EXTRAVERSION
to add something. For example, âEXTRAVERSION = <yourname>â.
make xconfig
. Now a lot of optimizations are
possible
Here, many dead codes and modules can be removed and enabled. Letâs go the safe road for now.
Generic-x86-64
by default. dmesg --level=err
dmesg --level=warn
To see if you can enable some extra flags for extra features. For
example, psmouse serio1: elantech: The touchpad can support a better bus than the old PS/2 protocol. Make sure MOUSE_PS2_ELANTECH_SMBUS and MOUSE_ELAN_I2C_SMBUS are enabled to get a better touchpad experience.
can be solved by enabling both of them.
# sed -ri '/CONFIG_SYSTEM_TRUSTED_KEYS/s/=.+/=""/g' .config
make -j N CFLAGS='-march=native -O3 -flto -pipe' CXXFLAGS='-march=native -O3 -flto -pipe'
make -j N CFLAGS='-march=native -O3 -flto -pipe' CXXFLAGS='-march=native -O3 -flto -pipe' modules
sudo make modules_install
sudo make install
Where N
is the number of cores
you have, alternatively use $(getconf _NPROCESSORS_ONLN)
.
If any steps fail, run make clean
and start again.
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo grubby --set-default /boot/vmlinuz-x.x.x-x
You can find yours vmlinuz-x.x.x-x
in /boot/
Now restart and run uname -r
to see your kernel.
There are several patches that you can use to increase performance or to make life simpler.
There are a lot of patches available, and you will have to find those that suit you best. I will be using graysky2 kernel patch here. Download the whole repo or just the file you need. In my case, I have GCC 10 and the latest kernel, so I will be using this .
Copy the desired patch file into the root of the extracted linux dictionary; same place as .config
.
patch -p1 < enable_additional_cpu_optimizations_for_gcc_v10.1+_kernel_v5.8+.patch
You should see an output like this:
patching file arch/x86/Kconfig.cpu
patching file arch/x86/Makefile
patching file arch/x86/Makefile_32.cpu
patching file arch/x86/include/asm/vermagic.h
Now, you can start from step 4 in the previous setup and will see: ```markdown
There are other patches such as scheduling related that you can apply to. Again, try finding your patches that suits your system.
Try to keep the last working kernel, i.e., have a minimum of two kernels (the one you are using and the previous one).
NOTE: Removing the currently running kernel (determined by uname -r
) will render your system
non-bootable.
/boot/vmlinuz-x.x.x-x
/boot/initrd-x.x.x-x
/boot/System-map-x.x.x-x
/boot/config-x.x.x-x
/lib/modules/x.x.x-x/
/var/lib/initramfs/x.x.x-x/
/boot/loader/entries/*x.x.x-x
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
or sudo update-grub2
sudo gedit /etc/fstab
, change it to look something like this (this is on fedora, yours might vary):
UUID=<do-not-change> / btrfs subvol=root,x-systemd.device-timeout=0,ssd,noatime,space_cache,commit=120,compress=zstd,discard=async,lazytime 0 0
UUID=<do-not-change> /boot ext4 defaults 1 2
UUID=<do-not-change> /boot/efi vfat umask=0077,shortname=winnt 0 2
UUID=<do-not-change> /home btrfs subvol=home,x-systemd.device-timeout=0,ssd,noatime,space_cache,commit=120,compress=zstd,discard=async,lazytime 0 0
Optional :
nobarrier
nobarrier
option is safe as long you didnât expect sudden powerloss happens or has battery-backed.
On a device with a volatile battery-backed write-back cache, the nobarrier option will not lead to filesystem corruption as the pending blocks are supposed to make it to the permanent storage. man 5 btrfs
sudo systemctl daemon-reload
sudo systemctl enable fstrim.timer
Important: I usually like disabling mitigations
, but then again, I am on AMD
based CPU and do not
have Meltdown
only Spectre
, I do not run an unknown script, and even if I have to, I use containers and firefox with noscript
and
a
few other security add-ons. Nonetheless, if you understand the security concerns, you can disable it and see a
substantial
boost in performance.
sudo grubby --args "mitigations=off nowatchdog processor.ignore_ppc=1 amdgpu.ppfeaturemask=0xffffffff ec_sys.write_support=1 split_lock_detect=off" --update-kernel=ALL
OR
sudo gedit /etc/default/grub
GRUB_CMDLINE_LINUX=" ... rhgb quiet
change it to (...
signifies other parameters):
GRUB_CMDLINE_LINUX="... rhgb quiet mitigations=off nowatchdog processor.ignore_ppc=1 split_lock_detect=off"
Also, edit GRUB_TIMEOUT=5
to GRUB_TIMEOUT=1.
sudo grub2-mkconfig -o /etc/grub2-efi.cfg
OR
sudo grub2-mkconfig -o /etc/grub2.cfg
After rebooting, you can run cat /proc/cmdline
to see your boot options.
Our last tweak kinda improved it, but letâs try something more.
Remove startup applications; I use gnome-tweaks
for a GUI-like experience.
Run the following to find what service is taking the longest:
systemd-analyze
systemd-analyze blame
systemd-analyze critical-chain
These might vary from system to system and distro to distro; in my case(fedora), I disabled dnf-makecache.service.
which took around 32s
. To do so:
sudo systemctl disable NetworkManager-wait-online.service
sudo systemctl disable dnf-makecache.service
sudo systemctl disable dnf-makecache.timer
sudo gsettings set org.gnome.software download-updates false
You might want to google every service that you think about disabling and what it does; in my case, it just updates dnf cache, which I usually like to do manually.
If you have 8GB or more ram, you might benefit from it; otherwise, leave it as it is.
To see current swappiness, enter cat /proc/sys/vm/swappiness
; it should print 60
; we want to make it 10.
sudo gedit /etc/sysctl.conf
Enter vm.swappiness=10
and reboot; now step 1 should print 10.
scaling_governor
to performance
Do not change it to performance
on Ryzen based CPUs as it might(I seem to get better performance on AC, but then
again, performance
does not seem to allow turbo boost in some cases) hurt their performance, using ondemand
.
or schedutil
is better (more leaning towards schedutil
as soon as it
gets fixed).
Run cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
to see your current governor.
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
This setting most likely will not persist during the next boot; I like to change it manually rather than making a systemd service (I am a laptop, and it gets hot). You might want to google how to make it persistent for your distro if you like OR:
echo 'GOVERNOR="performance"' | sudo tee /etc/default/cpufrequtils
sudo systemctl disable schedutil
The default is schedutil
; you can see
others here.
Note: You can also change the default during the kernel compilation.
You can find overclocking tools specific to your GPU(s), but to make sure your graphics card isnât being suppressed by the OS (especially AMD):
Checking whether it is auto
:
cat /sys/class/drm/card0/device/power_dpm_force_performance_level
cat /sys/class/drm/card1/device/power_dpm_force_performance_level
Check the parameters of GPU by:
sudo cat /sys/kernel/debug/dri/0/amdgpu_pm_info
sudo cat /sys/kernel/debug/dri/1/amdgpu_pm_info
Now set everything to high:
sudo su
echo high > /sys/class/drm/card0/device/power_dpm_force_performance_level
echo high > /sys/class/drm/card1/device/power_dpm_force_performance_level
You can change them back to auto
if your system overheats.
Disabling Cool'n'Quiet
or speedstep
or PowerNow!
from bios (will cause heat up on laptops, only enable it during
gaming)
Check other bios features, too; they vary from system to system but should have a significant boost in performance
Using X
instead of Wayland
(may vary game to game)
Using Opengl
backend in games instead of Vulkun
(may vary game to game)
Feel free to open an issue or editing the README yourself.
Licensed under either of these: