There are several articles around the
web to improve the performance of Ubuntu Linux. I have jotted down
some common tweaks that I too have tried on my system and due to
which I have found quite a significant change in the performance of
my system. It has been possible only because Linux kernel and Ubuntu are flexible enough to let you make the modifications as you want on
the fly. I would love to share some performance boosting techniques
with you.
Dropping caches
The kernel 2.6.16 and later provide a
mechanism to drop the cache and free up a lot of memory. The
/proc/sys/vm directory contains files that help in tuning the virtual
memory of the system. The drop_caches file causes the kernel to drop
clean caches by freeing up pagecaches, dentries and inodes causing
the memory to become free.
Dropping cache is a good practice
untill it is really needed. Actually dropping caches has more
negative effects and less positive ones. By dropping your cache you
are actually degrading the performance of your system. When the cache
is gone the CPU load and RAM utilization increases. There will be a
glitch in system performance.
People go for dropping caches when they
need to do some benchmarking on a file system or disk or when they
hate it when their RAM goes unused. Otherwise, caches are meant to be
cached.
To use drop_caches, echo the number to
the file.
To free pagecache:
$ sync;sudo echo 1 >
/proc/sys/vm/drop_caches
To free dentries and inodes:
$ sync;sudo echo 2 >
/proc/sys/vm/drop_caches
To free pagecache, dentries and inodes
$ sync;sudo echo 3 >
/proc/sys/vm/drop_caches
Note: Sync command is necessary to be
executed before running the command to drop cache because it flushes
any cached data to the disk so that the data that is required isn't lost.
Decrease swappiness
As we all know that disks are much
slower than RAM, hence swap disk is slower than physical memory. This
normally leads to slower response for both applications and system.
The swappiness parameter controls the nature of the kernel to move
out processes from physical memory to allocated swap memory on disk.
The swappiness value can be between 1 to 100, where 0 and 100 being
the least and maximum value of moved out processes respectively. One
can find this parameter in /proc/sys/vm/swappiness file
default_swappiness.jpg
The default swappiness
parameter is set to 60 by the kernel. You can reduce this value to
10. To set the parameter permanently, edit the file /etc/sysctl.conf
and add the below mentioned line at the end of the file.
vm.swappiness=10
Now just save the file, reboot and feel
the change.
Zram
Zram is an experimental module of Linux
kernel. Zram was previously called “compcache”. Enabling Zram
kernel module helps in increasing the performance by using physical
memory for paging instead of using swap space on hard-disk. Zram
creates a virtual compressed swap file on the physical memory itself
so that the RAM can hold more programs and their data, allowing very
fast I/O.
To install Zram in Ubuntu 12.04 type
the below command in a terminal.
$ sudo apt-get install zram-config
Though zram helps in increasing
performance but still zram on machines with lower configuration and
memory will face little cpu utilization due to continuous compression
and decompression that will take place all the time.
To check if zram is installed and
working, check the file /proc/swaps. If zram partition is listed and
active, we are done.
One can check the zram size from two
files /proc/swaps and /sys/block/zram0/disksize.
Preload
Preload daemon runs in the background
and analyzes the user activity. It increases the startup time of the
applications by fetching and loading the binaries and dependencies of
the application that the user might run next. The following command
will install preload.
$ sudo apt-get install preload
There have been no side-effects of this
program. There seems to be bit improvement in the performance. Its
“install and forget” kind of application.
Enable DMA (Direct Memory Access)
for non-SCSI disks' I/O performance
Use the below command to test the disk
speed
$ sudo hdparm -t /dev/xxx
Enable DMA (Direct
Memory Access)
$ sudo hdparm -d1 /dev/xxx
Now check the speed again using the
previously executed command. If your system has not been DMA enabled,
then you might get an improved transfer rate. Though there are also
few considerations to be kept in mind before executing this command.
One can check with “man hdparm” command.
In order to make this change persist
across reboots one need to change /etc/init.d/rc.local file or any
startup script that is being called.
Disk I/O Tweaks
The read performance of the disk can be
improved by tweaking the parameter “read_ahead”. It defines the
maximum number of kilobytes to read-ahead for filesystems on a
particular device. The read ahead function is based upon two values: current window and ahead window. As the kernel when reading a file, always tries to take advantage of sequential disk access, hence it quickly turns the ahead window as the current window after the application has finished reading from the current window. One can view the current window size by issuing the below command.
$ cat /sys/block/sda/queue/read_ahead_kb
By default my Ubuntu 12.04 system has 256 as read_ahead value that means only 128KB of data is read in advance from the cache memory before the application needs it. You can use the below mentioned commands to get the “read ahead” default value in your system.
$ cat /sys/block/sda/queue/read_ahead_kb
By default my Ubuntu 12.04 system has 256 as read_ahead value that means only 128KB of data is read in advance from the cache memory before the application needs it. You can use the below mentioned commands to get the “read ahead” default value in your system.
$ sudo blockdev --getra /dev/sda
To list all block devices
$ sudo blockdev –report
To set the value of read_ahead to 1024KB execute any one of the
below commands
$ sudo echo 512 >
/etc/block/sda/queue/read_ahead_kb
or
$ sudo blockdev --setra 1024 /dev/sda
$ sudo blockdev --setra 1024 /dev/sda
The next parameter that we would look
into is “nr_requests”.
Generally, every computer's task is to either read a block of data from the disk and move it to RAM or write a new block of data from the RAM to the disk. These tasks are called as the read/write requests or the I/O requests.
Linux has four different I/O schedulers namely noop, deadline, anticipatory and cfq, whereas Ubuntu 12.04 includes all except anticipatory scheduler. These schedulers sort the incoming I/O requests in a queue for optimizing the load. So, the /sys/block/sda/queue/nr_requests parameter defines the queue size or queue length. The default value assigned to this parameter is 128 which can be changed to 1024 using the below mentioned command.
Generally, every computer's task is to either read a block of data from the disk and move it to RAM or write a new block of data from the RAM to the disk. These tasks are called as the read/write requests or the I/O requests.
Linux has four different I/O schedulers namely noop, deadline, anticipatory and cfq, whereas Ubuntu 12.04 includes all except anticipatory scheduler. These schedulers sort the incoming I/O requests in a queue for optimizing the load. So, the /sys/block/sda/queue/nr_requests parameter defines the queue size or queue length. The default value assigned to this parameter is 128 which can be changed to 1024 using the below mentioned command.
$ sudo echo 256 >
/sys/block/sda/queue/nr_requests
And to make both the changes permanent,
edit the /etc/rc.local file and add the below mentioned lines before
“exit 0”.
echo 1024 >
/sys/block/sda/queue/read_ahead_kb
echo 256 >
/sys/block/sda/queue/nr_requests
Well these are few to-dos that came to
my mind. But again, if you have any suggestions, please feel free to
drop some comments. Also there's a possibility that there might not
be any performance improvement in your system, but they surely did
work for me.