Optimizing-linux
                                
                                 Optimizing-linux copied to clipboard
                                
                                    Optimizing-linux copied to clipboard
                            
                            
                            
                        A simple guide for optimizing linux π§ in detail
Optimizing Linux
I am writing this guide as to save my progress and let others contribute to increase the 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 full before starting.
I am currently on fedora 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.
Index
- Compiling your own kernel
- Applying patches
- Removing your own compiled kernel
 
- Btrfs filesystem optimizations
- Changing boot parameters
- Improving boot time
- Changing swappiness
- Changing scaling_governor to performance
- Improving graphic card performance
- Some other tweaks
Compiling your own kernel
I think by now everyone agrees that compiling your own kernel is one of the best options to get fastest possible speed.
You might wanna google How to make custom kernel in <distro> to get the packages required to compile the kernel.
- 
Download the latest kernel or whatever you might like. Extract it, I am gonna assume a generic name from now on linux-x.x.x.
- 
The next step is finding the configfile. Most of the time you can just run:cp -v /boot/config-$(uname -r) .configfrom inside linux-x.x.xwhich should give an output like:'/boot/config-y.y.y-generic' -> '.config'if it fails you can find config in /proc/config.gzor simple runmake listnewconfigORmake oldconfig(it usually starts a long process, try finding your config in your distro source code too).
- 
Edit Makefileand changeEXTRAVERSIONto add something. For example, "EXTRAVERSION = <yourname>".
- 
(You might wanna see next subtopic before doing this) Now run make xconfig. Now a lot of optimizations are possible here and a lot of dead code and modules can be removed and enabled. Let's go the safe road for now.- Now one of the best thing you can do is no longer build for a generic kernel. Select
 It should have been- Processor type and features - Processor family - [x] Core2/newer XeonGeneric-x86-64by default.
- There are a lot of other stuff you can do too but then you will have to yourself read them and see which suits best. A simple way might be to just copy clear linux config but it might disable certain features(see next Applying patches).
 
- Now one of the best thing you can do is no longer build for a generic kernel. Select
- 
Now you might wanna run: dmesg --level=err dmesg --level=warnto 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 too 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.
- 
Finally compiling the kernel: # 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 -j N CFLAGS='-march=native -O3 -flto -pipe' CXXFLAGS='-march=native -O3 -flto -pipe' modules_install sudo make -j N CFLAGS='-march=native -O3 -flto -pipe' CXXFLAGS='-march=native -O3 -flto -pipe' installWhere Nis the number ofcoresyou have, alternatively use$(getconf _NPROCESSORS_ONLN).If any of the step fails run make cleanand start again.
- 
Making it default in grub(I am using grub2, your process might vary): sudo grub2-mkconfig -o /boot/grub2/grub.cfg sudo grubby --set-default /boot/vmlinuz-x.x.x-xYou can find yours vmlinuz-x.x.x-xin/boot/
Now restart and run uname -r to see your own kernel.
Applying patches
There are a number of 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 suite you best. I will be using graysky2 kernel patch here. Download the whole repo or just the file that you need. In my case I have gcc 10 and 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+.patchYou 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: - Processor type and features - Processor family - [x] Native optimizations autodetected by GCC
There are other patches such as scheduling related that you can apply too. Again try finding your own patches that suits your system.
Removing your own compiled kernel
Try to keep the last working kernel i.e. have a minimum of 2 kernels (the one you are using and the previous one).
NOTE: Removing the currently running kernel (which can be determined by uname -r) will render your system non-bootable.
- 
These entries need to be removed: /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.cfgorsudo update-grub2
Btrfs filesystem optimizations
- 
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 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 0 0
- 
sudo systemctl daemon-reload
- 
sudo systemctl enable fstrim.timer
Changing boot parameters
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 unknown script and even if I have to I use containers and use firefox with noscript and a
few other security addons. Nonetheless if you understand the security concerns you can disable it and see a substantial
boost in performance.
- 
sudo gedit /etc/default/grub
- 
You will find a line GRUB_CMDLINE_LINUX=" ... rhgb quietchange it to (...signifies other parameters):GRUB_CMDLINE_LINUX="... rhgb quiet mitigations=off nowatchdog processor.ignore_ppc=1"
- 
Also edit GRUB_TIMEOUT=5toGRUB_TIMEOUT=1
- 
sudo grub2-mkconfig -o /etc/grub2-efi.cfgOR sudo grub2-mkconfig -o /etc/grub2.cfg
After rebooting you can run cat /proc/cmdline to see your boot options.
Improving boot time
Our last tweak kinda improved it but let's try something more.
- 
Remove startup applications, I use gnome-tweaksfor a GUI like experience.
- 
Run the following to find what service is taking the longest: systemd-analyze systemd-analyze blame systemd-analyze critical-chainThis might vary from system to system and distro to distro, in my case(fedora) I disabled dnf-makecache.servicewhich took around32s. To do so:systemctl disable dnf-makecache.service systemctl disable dnf-makecache.timer gsettings set org.gnome.software download-updates falseYou might wanna 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. 
Changing swappiness
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 print60, we wanna make it 10.
- 
sudo gedit /etc/sysctl.conf
- 
Enter vm.swappiness=10and reboot, now step 1 should print 10.
Changing 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_governorto see your current governor.
- 
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governorThis setting most likely will not persist during the next boot, I like to change it manually rather than making a systemd service(I am an laptop and it gets hot). You might wanna google how to make it persistent for your distro if you like OR: echo 'GOVERNOR="performance"' | sudo tee /etc/default/cpufrequtils sudo systemctl disable schedutilThe default is schedutil, you can see others here.
Note: You can also change the default during compilation of the kernel.
Improving graphic card performance
You can find overclocking tools specific to you 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_levelYou can change them back to autoif your system overheats.
Some other tweaks
- 
Disabling Cool'n'QuietorspeedsteporPowerNow!from bios (will cause heatup 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 Xinstead ofWayland(may vary game to game)
- 
Using Openglbackend in games instead ofVulkun(may vary game to game)
Contributing
Feel free to open an issue or editing the README yourself.
License
Licensed under either of these:
- Apache License, Version 2.0, (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT)