The following post describes different methods I used to do so.
<!-- more -->
Before carrying out these hacks, I suggest you benchmark your system.
Phoronix Test Suite is a good benchmarking tool.
Disk Block Alignment
Legacy hard disks used 512 byte sectors. Partitions and logical volumes could potentially start on any sector boundary. Newer disks typically have block sizes larger than 512 bytes. For example, Advanced Format drives have a 4096 byte block size. If the offset of a partition is inconsistent with the underlying disk performance can suffer dramatically.
Follow these steps to check if your disk is aligned:
# Replace sdX with your drive, for example: sda
if your partition is not aligned, you can follow this lifehacker guide to align your partitions.
Read more about disk alignment here.
TLP brings you the benefits of advanced power management for Linux without the need to understand every technical detail. TLP comes with a default configuration already optimized for battery life, so you may just install and forget it.
Installation instructions can be found here.
! PowerTOP doesn't monitor your system for changes, while TLP does. There's not need to use PowerTOP if you have TLP.
After you've installed PowerTOP, Edit
/etc/rc.local and add the following before
If your distribution uses systemd, use the following unit:
Memory & Paging
Moving data around means more writes. The more you write, the more you decrease the lifetime of your HDD. Here are a few hacks that can reduce disk I/O.
Optimize your swap
Swap is a paging mechanism which is used by linux and other OS's. Basically, it allows the operation system to consume more memory than is physically installed. It is a common misconception that a swap partition would somehow slow down your system. I suggest reading more about Swap before tweaking it.
Swappiness is a tunable that controls the relative weight given to swapping out runtime memory, as opposed to dropping pages from the system page cache. Swappiness can be set to values between 0 and 100 inclusive. A low value causes the kernel to avoid swapping, a higher value causes the kernel to try to use swap space. The default value in most distributions is 60 [read this to understand why]
if you have <span style="text-decoration:underline;">a lot of RAM</span>, I suggest using zswap or zram to reduce swapping to disk, and to tune swappiness to your needs. Another option is to turn off swap completely.
Follow these steps to change swappiness to
$ echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.d/10-swap.conf
Follow these steps to turn of swap:
$ sudo swapoff -a
Disable OOM Killer Full Scan on Out of Memory
Linux has a mechanism that protects the OS when both RAM and Swap are exhausted - called OOM Killer (Out Of Memory Killer).
OOM Killer is triggered when vm.panic_on_oom is set to
0. The default value for the vm.oom_kill_allocating_task flag is
0, which means the OOM Killer will perform a full memory scans to find the best task to kill.
This is costly, and in many cases the system doesn't have enough resources to perform a full scan - which means it won't do anything. if vm.oom_kill_allocating_task is set to
1, it will kill the task that caused out of memory. You can read more about these flags and others in the
/sys/proc/vm documentation page.
Follow these steps to change** OOM Killer **parameters:
# make sure the computer doesn't panic on out of memory
Taming the OOM killer
One of the problems associated with the OOM Killer is that it might kill a process that shouldn't be killed. For instance, you probably don't want the OOM Killer to kill you ssh daemon!
An article called Taming the OOM Killer explains how to hint the OOM Killer to avoid killing specific processes. For instance:
$ echo "-17" > /proc/`cat /var/run/sshd.pid`/oom_adj
Compressing paging candidates
A few interesting paging optimizations started appearing in the last few years. The most noticeable are zram and zswap. Both serve the same purpose - instead of paging data, they compress it and save it back to RAM. When the RAM is exhausted, the data is swapped to disk.
This is a VERY interesting concept that can drastically improve your systems performance, because decompressing data takes less time than loading data from disk.
If you have a swap partition, I'd pick zswap, otherwise - choose zram. The reason is that zswap performs better in choosing which pages to swap. Read this post to understand more.
Follow these steps to turn on zswap:
$ sudo vi /etc/default/grub
Follow these steps to turn on zram (on ubuntu):
$ sudo apt-get install zram-config
make sure you read the docs to configure zram correctly.
You can stress test your system to see paging in action -
Open one terminal and type:
# if 15% of ram is allocated zram, the following stress test checks that
Open a second terminal and type:
$ watch -n 1 free -m
Open a third terminal and type:
$ watch -n 1 cat /proc/swaps
Mounting directories on tmpfs
tmpfs is a memory-mapped filesystem. Once mounted, every file written to it is stored on RAM. When the partition overflows, the extra data is paged.
Mounting a directory on tmpfs has two big upsides:
- It removes redundant I/O from the HDD
- It boosts performance for file access
Follow these steps to mount
DIR on tmpfs:
$ echo "tmpfs DIR tmpfs rw,nosuid,nodev" | sudo tee -a /etc/fstab
/tmp on tmpfs
/tmp is a directory that applications use for temporary data, and it's considered a best practice to mount it on tmpfs.
You can read more about tmps and mounting
/tmp on it here.
! do not mistake
/var/tmp, the latter is used for persistent temporary storage and should not be mounted on tmpfs.
! you can consider adding the noexec flag to
/tmp to harden your systems security. read more here.
Mounting /var/log on tmpfs
/var/log is a directory that applications used to store logs. If you run a server, it would probably be a bad idea to mount it on tmpfs, because all the logs would get lost between reboots. But, for ordinary day-to-day usage, mounting
/var/log would reduce I/O for logs you don't use anyway.
/var/log on tmpfs, you'll need to add it to fstab, and create all necessary directories on boot. Some applications don't behave as expected (like CUPS) if their directories are missing from
/var/log on tmpfs is a problematic practice, because once a problem occurs and your system crashes, you can't trace back the problem.
/etc/rc.local (in debian) and add the following before exit 0:
# Restore tmpfs directories for logs.
you can read more about mounting
/var/log on it here.
Mount browser cache on tmpfs
Once you have /tmp mounted on tmpfs, you might consider moving your browser cache to /tmp. Browsers write many temporary files that aren't used once the browser shuts down, so moving these files to a volatile storage can boost performance and reduce HDD I/O.
Google Chrome has a command line argument called disk-cache-dir
You can use it to specify a directory to use as a cache.
Read more here.
Mozilla Firefox can be configured to change the disk cache through its configuration page - about:config.
- Open up Firefox and enter about:config in the address bar
- Type browser.cache.disk.enable and set it to true
- Type browser.cache.disk.parent_directory and set it to /tmp/firefox-cache
- Type browser.cache.memory.enable and set it to true
- Right click -> New -> String
- Enter browser.cache.memory.capacity as preference name
- Enter -1 as the value
Read more here.
Optimizing the filesystem table
/etc/fstab is a file that's in charge of partition mounting configuration.
There are several configurations that you should add to fstab that increase the HDD performance:
- noatime - Linux saves the last access time for each file and directory, which causes significant I/O. Turning it off can improve performance, but might have a negative impact on processes that rely on this timestamp. Read more here.
- nodiratime - a subset of noatime, only for directories. This is redundant if noatime is set.
- lazytime - atime is too expensive, noatime is probelmatic and relatime has its own drawbacks. lazytime tries to be the best of all worlds - it writes the last accessed timestamp, but only when there's a reason to do so. I HIGHLY RECOMMEND turning on lazytime instead of the previous flags.
- commit=N - Linux caches writes and flushes them to disk every x seconds. This means that if your computer crashes, the last N seconds of data is lost. You can change this number to reduce I/O. read more here.
- discard - A flag to turn on continuous [TRIM](https://en.wikipedia.org/wiki/Trim_(computing%29). while continuous TRIM is not recommended, periodic TRIM is. read more here.
- barrier=0 - Most file systems send write barriers to disk after fsync or during transaction commits. Write barriers enforce proper ordering of writes, making volatile disk write caches safe to use (at some performance penalty). If your <span style="text-decoration:underline;">disks are battery-backed</span> in one way or another (UPS and Laptops don't battery back the HDD), disabling barriers may safely improve performance. otherwise, <span style="text-decoration:underline;">do not use this option!</span> barrier=0 mount option is compatible with ext3, ext4, and reiserfs. Further reading about write barriers in the ArchWiki, and StackExchange.
Switching IO Schedulers
The default I/O scheduler queues data to minimize seeks on HDDs, which is not necessary for SSDs. Thus, use the deadline scheduler that just ensures bulk transactions won't slow down small transactions.
The dumb noop scheduler may be a little faster in benchmarks that max out the throughput, but this scheduler causes noticeable delays for other tasks while large file transfers are in progress.
anyhow, picking a scheduler is a hot topic, and if you don't understand the implications of choosing one scheduler over another, I'd choose deadline. mainly because that's what debian recommends.
/etc/rc.local and add the following lines before exit 0:
# X is the drive you use (sda, sdb€¦)
Hardware Video Acceleration
You'll need to install VA-API and VDPAU drivers for your GPU, then enable it on your favorite video player.
VideoLAN media player
VLC supports VA-API and VDPAU out of the box.
You'll need to configure it, read more here.
- Open Google Chrome and type chrome://flags in the address: - Override software rendering list - Enable
- GPU rasterization - Enabled
- GPU rasterization MSAA sample count - 2
- Zero-copy rasterizer - Enable
- Number of raster threads - run nproc in your shell and set the output number
- Display list 2D canvas - Enabled
- LCD text antialiasing - Enabled
- Fast tab/window close - Enabled
--enable-native-gpu-memory-buffersto the chrome shortcut at
- Install h264ify chrome extension. follow these instructions.
! if you're using chromium, you might want to use customizations.