Difference between revisions of "Readahead"

From ArchWiki
Jump to: navigation, search
(Add systemd readahead link.)
m (link to the relevant section of the article)
 
(6 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[[Category:Daemons and system services]]
+
#REDIRECT [[Improve boot performance#Readahead]]
[[Category:Boot process]]
+
'''Readahead''' is a tool that can prefetch files into system memory before being needed. '''Readahead-list''' is a profiling tool that helps you build a list of applications while your system loads. This list can then be used by readahead to help you accelerate program loading.
+
 
+
This wiki page describes using Readahead in two parts:
+
1) Bootup - all the files/daemons, etc. that load during your system's boot process.
+
2) Desktop - all the files that get called when you log into your desktop (gdm, kdm, etc.).
+
{{Note|Systemd comes with its own readahead implementation. See [[Systemd#Readahead]].}}
+
== Credit Where Credit is Due ==
+
This entire wiki page is based on and uses content from Peterw’s blog wherein he has made an excellent guide for readahead on archlinux.  Find his original blog posting here:  [http://quasiyodel.wordpress.com/2008/12/27/install-readahead-list-on-archlinux/ Install readahead-list on ArchLinux]
+
 
+
In case his blog goes down, a copy of it has been included [[#Copy of Peterw's Blog Entry on Readahead|at the end of this wiki page]].
+
 
+
Note that you do not need to run Readahead in both modes if you do not want to do so.
+
 
+
== Using Readahead on Arch Linux ==
+
=== Installing Readahead ===
+
There is a nice package in the [[AUR]] based on Peterw's instructions - {{AUR|readahead-list}}.
+
 
+
=== Profiling Your System ===
+
==== The Boot Process ====
+
Following the instructions in Peterw's blog, first bang-out the display manager (DM) daemon in your daemons array (eg: gdm or kde or whatever you're using).  In my example, it is gdm:
+
DAEMONS=(preload syslog-ng network netfs @crond @alsa @hal @fam @powernowd cupsd '''!gdm''')
+
 
+
Now edit your {{ic|/etc/rc.sysinit}} adding the following lines to profile your system's boot process between the top and the part that starts with ". /etc/rc.conf" like this:
+
 
+
#!/bin/bash
+
#
+
# /etc/rc.sysinit
+
#
+
+
# uncomment the next three lines to profile the boot process
+
# be sure you disable gdm from starting before you reboot
+
# add a bang character to gdm in the daemons array in rc.conf
+
+
'''echo "starting readahead-watch..."'''
+
'''/usr/sbin/readahead-watch -o /etc/readahead/boot'''
+
'''echo "readahead is watching..."'''
+
+
. /etc/rc.conf
+
. /etc/rc.d/functions
+
 
+
Now reboot your machine and allow the boot profiling to take place.  It should take extra time (1-2 min is normal).  When the system does finally displays your text login screen (remember you disabled your DM), login as root and manually kill readahead {{ic|# pkill readahead}}.
+
 
+
This just generated your boot profile located in {{ic|/etc/readahead/boot}}
+
 
+
Now comment out the lines in your /etc/rc.sysinit to prevent the profiling again:
+
# echo "starting readahead-watch..."
+
# /usr/sbin/readahead-watch -o /etc/readahead/boot
+
# echo "readahead is watching..."
+
 
+
Remove the bang from your DM in your daemons array in {{ic|/etc/rc.conf}}
+
DAEMONS=(preload syslog-ng network netfs @crond @alsa @hal @fam @powernowd cupsd '''gdm''')
+
 
+
==== The Desktop Process ====
+
Just as you did profiling the boot process, you will now profile the desktop process.  First add the the daemon '''readahead-watch-desktop''' to your daemons array in {{ic|/etc/rc.conf}}.  Place it before your WM (gdm in my case) like this:
+
DAEMONS=(preload syslog-ng network netfs @crond @alsa @hal @fam @powernowd cupsd '''readahead-watch-desktop''' gdm)
+
 
+
Now reboot your system again and login via graphical login.  It is recommended that you launch whatever programs you want included in the profile such as your web browser, email program, whatever you use on a regular basis.  When you are ready to stop the profiling process, either open a shell (remember this action will also be included in the desktop profile) or if you do not want the shell getting profiled for some reason, drop into another tty ({{Keypress|Ctrl}}+{{Keypress|Alt}}+{{Keypress|F3}} for example), login there and again kill readahead as you have done with the boot profiling: {{ic|# pkill readahead}}.
+
 
+
This generated your desktop profile located in {{ic|/etc/readahead/desktop}}
+
 
+
=== Enabling Readahead on Your Profiled System ===
+
Now that you have generated both the {{ic|/etc/readahead/boot}} and {{ic|/etc/readahead/desktop}} it's time to activate them.  The easiest place to start readahead for your boot process is again in the /etc/rc.sysinit file.  Add a line to it below the ones you commented out for the profiling process like this (new lines are shown in '''bold text'''):
+
#!/bin/bash
+
#
+
# /etc/rc.sysinit
+
#
+
+
# uncomment the next threee lines to profile the boot process
+
# be sure you disable gdm from starting before you reboot
+
# add a bang character to gdm in the daemons array in rc.conf
+
+
# echo "starting readahead-watch..."
+
# /usr/sbin/readahead-watch -o /etc/readahead/boot
+
# echo "readahead is watching..."
+
+
'''# this starts readahead with your boot profile'''
+
'''/usr/sbin/readahead-list /etc/readahead/boot'''
+
+
. /etc/rc.conf
+
. /etc/rc.d/functions
+
 
+
Now add the '''readahead-list-desktop''' daemon to your daemons array BEFORE THE GRAPHICAL STARTUP (gdm in my case) in {{ic|/etc/rc.conf}} it is recommended that you background it (prefix it with an @ symbol):
+
DAEMONS=(preload syslog-ng network netfs @crond @alsa @hal @fam @powernowd cupsd '''@readahead-list-desktop''' gdm)
+
 
+
Now you can reboot and enjoy readahead!
+
 
+
=== Periodically Update Your Boot and Desktop Profiles ===
+
If you make major changes to your boot or desktop processes, repeat the above profiling steps to keep them current in readahead's lists.  You get the idea.
+
 
+
== User Experiences with Readahead ==
+
Please post your experiences with readahead in this section.  Include some hardware specs to give others an idea what kind of system is being used.
+
 
+
==== Comment 1 ====
+
I installed readhead via the package mentioned above in the AUR and followed the instructions for profiling my system from Peter's blog.  Here is a summary of the results; times were measured using [[bootchart]]:
+
 
+
Before doing anything: 26 sec
+
Using only the boot profile: 25 sec
+
Using only the desktop profile: 20 sec
+
Using both the boot and desktop profile: 27 sec
+
 
+
Hardware specs: X3360 @ 3.40 GHz, 8 gigs of DDR2 @ 1,000 MHz, HDDs are both Seagate SATA-II 640 gig 7200.11 series.
+
 
+
Make sure both your readahead-list* processes have been backgrounded with the @ symbol in rc.conf.  No need for these to be in sequence.  Also, it adds a second on to my laptops boot time as well, but there is a tradeoff.  Archlinux is already a pretty lean OS, so this is probably the wrong way to further optimize, and bootchart stops recording once the bootup sequence has stopped.  It doesn't take into account other metrics, like time-to-firefox.  That extra second I've added makes the whole desktop startup quickly, and improves the feel of speed if not the actual speed.
+
--[[User:Peterw|Peterw]] 12:41, 30 January 2011 (EST)
+
 
+
== Copy of Peterw's Blog Entry on Readahead ==
+
Again, you can read Peterw's Blog from its [[http://quasiyodel.wordpress.com/2008/12/27/install-readahead-list-on-archlinux/ native URL]] but for posterity's sake, I have taken the liberty of pasting it below in case his server goes down or whatever.
+
 
+
Install readahead-list on ArchLinux
+
 
+
According to freshmeat:
+
 
+
"Readahead-list allows users to load files into the page cache before they are needed, to accelerate program loading. It improves on the existing readahead by taking the name of a file with the items to load, instead of requiring the arguments being passed as parameters. Additionally, it contains a tool (filelist-order) to optimize the order of the file list in several possible ways."
+
 
+
I am picking the source file from ubuntu/debian because it also includes a tool to “record filesystem events” and generate the list of files to load. Grab the source and the diff here from launchpad
+
 
+
extract it:
+
 
+
gzip -d readahead-list*.diff.gz
+
tar -xzf readahead-list*.tar.gz
+
 
+
patch it:
+
 
+
patch -p1 < readahead-list*.diff
+
cd readahead-list*/
+
+
Be sure to apply all the patches in the patches directory:
+
 
+
patch -p1 < ../debian/patches/05*
+
patch -p1 < ../debian/patches/10*
+
patch -p1 < ../debian/patches/50*
+
patch -p1 < ../debian/patches/51*
+
 
+
compile:
+
 
+
#please choose the appropriate prefix:
+
./configure --prefix=/usr
+
make
+
#(as root)
+
make install
+
 
+
Hopefully everything is compiled. There might be some error messages, but as long as the process did not error out, everything should be ok.
+
 
+
Now for the system setup. The way I think it ought to go is record the startup in two parts, the boot, and the desktop. The boot part will record and load all files related to general startup. The desktop part will load everything from after the system startup (including graphical login manager) to when the default session type is loaded (i.e. kde desktop). The following files and directories need to be created:
+
 
+
#technically, this contents might make this directory better place in /var but /etc will do
+
mkdir /etc/readahead
+
touch /etc/readahead/boot
+
touch /etc/readahead/desktop
+
#the following can be duplicated for each section, if you want it handled by rc
+
touch /etc/rc.d/readahead-list-desktop
+
touch /etc/rc.d/readahead-watch-desktop
+
 
+
To record the first part, we need to stop the graphical login manager from loading, so we login via the command line interface. This is done by editing the DAEMONS section of /etc/rc.conf by adding an ! before kdm, or gdm, etc. Then we need to start the record as early as we can in the boot process. This is technically done by creating a script, and then using the init= parameter on the kernel line of grub. For this tutorial, we will put the lines of code in /etc/rc.sysint. Insert some lines to make the top of the file look like this:
+
 
+
#!/bin/bash
+
#
+
# /etc/rc.sysinit
+
#
+
+
echo "starting readahead-watch..."
+
/usr/sbin/readahead-watch -o /etc/readahead/boot
+
echo "readahead is watching..."
+
+
#echo "reading files..."
+
#/usr/sbin/readahead-list /etc/readahead/boot &amp;
+
+
. /etc/rc.conf
+
. /etc/rc.d/functions
+
 
+
Line 7 is the import one above. This will record all files loaded after the command is run, on any device and save the list to the specified file. After you login, to kill the process run:
+
 
+
ps ax | grep readahead
+
#as root
+
kill $PID
+
 
+
The boot section has now been recorded. Now the files /etc/rc.d/ will look like:
+
 
+
#!/bin/bash
+
#readahead-watch-desktop
+
/usr/sbin/readahead-watch -o /etc/readahead/desktop
+
 
+
#!/bin/bash
+
#readahead-list-desktop
+
/usr/sbin/readahead-list /etc/readahead/desktop
+
 
+
With these files in place, edit the daemon section in the rc.conf to include readahead-watch-desktop before the login manager, and do NOT background it. Reboot the computer, and kill the process in the same was as before after you have logged in (Note: this will record a terminal instance in the file. You can avoid this by hitting something like ALT-F6 to login textually). After you have stopped the recording, edit the daemons section to instead start readahead-list-desktop.
+
 
+
Here are my results.
+
 
+
The results are kind of dismal in the pure timing end, as observable by bootchart only two seconds shorter. But I have never seen my desktop load faster! If I didn’t have the resource heavy services such as klipper, guidance-power-manager or network-manager it would load in a blink.
+
 
+
Play around with the placement of the readahead-list command, just make sure you start a recording from the same place. This placement of the rc.d file is kind of cheating, because it relies on the lag in response time of the user login to load files in the background, but it still makes a heck of a difference. Also, if you always start up firefox or something when you login, record that too and it will start a little faster.
+

Latest revision as of 17:00, 18 July 2014