All of lore.kernel.org
 help / color / mirror / Atom feed
From: Goffredo Baroncelli <kreijack@libero.it>
To: linux-btrfs@vger.kernel.org
Cc: stewart@flamingspork.com
Subject: [RFC] aptitude & BTRFS slowness
Date: Wed, 19 Oct 2011 23:24:59 +0200	[thread overview]
Message-ID: <3728579.PMSEXudObp@venice> (raw)

[-- Attachment #1: Type: text/plain, Size: 3891 bytes --]

Hi all,

I suffered a lot for the terrific performance of aptitude on a BTRFS filesystem.
I don't think that BTRFS is a slow filesystem, but it seems that some aptitude 
(or dpkg) patterns are capable to highlight the btrfs slowness in some corner 
case.

In order to alleviate this problem, I wrote a small script which calls 
aptitude with the LD_PRELOAD libeatmyadata library. And now I want to share 
this idea (which is not my own, you can see several suggestion about that in 
the net) in order to collect suggestions and/or critics.

For who which don't know what is libeatmydata, the package info says:

"This package contains a small LD_PRELOAD library (libeatmydata) and a couple 
of helper utilities designed to transparently disable fsync and friends (like 
open(O_SYNC)). This has two side-effects: making software that writes data 
safely to disk a lot quicker and making this software no longer crash 
safe...."

In order to reduce the risk of data loss, my script create a snapshot of the 
root filesystem before calling the aptitude. After the end of aptitude a double 
call to sync, flush all the data on the disk. Finally the snapshot is removed.

The root of my filesystem is a btrfs subvolume (not the real root one). 
Inspired by ArchLinux I called it "__active", and it is placed on the real 
root of the btrfs filesystem. In order to manage the subvolume and its 
snapshots I mount the real root of the btrfs filesystem under /var/btrfs

Before running aptitude my script creates a snapshot of "__active" subvolume 
called "__rollback", and put it in the root of the btrfs filesystem.

During the boot I have two entry in the grub menu, the first one starts the 
system using as root the "__active" subvolume. The other one starts the system 
using the "__rollback" subvolume.

The idea is that if something goes wrong before calling the sync command, I 
can safely start the system from a coherent (i.e. no half package 
installation) system.

The next step is to automatically start from a "__rollback" subvolume if 
present (remember that the subvolume "__rollback" is automatically removed 
after the two sync) during the execution of the initramfs.  Another idea is to 
maintain the last 3-4-5...N rollbacks in order to be able to go back to old 
configuration.

Now, during a packages update the performances with btrfs are comparable to 
the ext4 ones. Obviously what I says about dpkg/aptitude, should be true also 
for other packages manager (like urpm/yum/rpm, pacman....)

Of course there are some caveats:
a) the filesystem must use only one subvolume (the snapshotting is not 
recursive)
b) if a package [re]starts a daemon (like a DB), it inherited the LD_PRELOAD 
environment variable, so the daemon  has the sync disabled

For the second point I am looking a way to enable the libeatmydata only for 
the dpkg program. I found that it is possible to pass --force-unsafe-io to 
dpkg in order to reduce the sync calls. But it seems that some sync are anyway 
performed.

Comments are welcome.

BR
G.Baroncelli


-------------------------------------------
$ cat btrfs-aptitude
#!/bin/bash

ROLLBACK=/var/btrfs/__rollback
ACTIVE=/var/btrfs/__active

if [ ! -d "$ACTIVE" ]; then
        echo "Cannot find $ACTIVE"
        exit
fi

if [ -d "$ROLLBACK" ]; then
        echo "Found $ROLLBACK; remove it"
        btrfs subvolume delete "$ROLLBACK" || exit
fi

echo "Snap shot $ACTIVE -> $ROLLBACK"
btrfs subvolume snapshot "$ACTIVE" "$ROLLBACK" || exit
sync

( 
        export LD_PRELOAD=/usr/lib/libeatmydata/libeatmydata.so
        aptitude
)

echo "Syncing..."
sync 
sleep 5s
sync

echo "Remove $ROLLBACK"
btrfs subvolume delete "$ROLLBACK"
------------------------------------------------------------





-- 
gpg key@ keyserver.linux.it: Goffredo Baroncelli (ghigo) <kreijack@inwind.it>
Key fingerprint = 4769 7E51 5293 D36C 814E  C054 BF04 F161 3DC5 0512

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 190 bytes --]

             reply	other threads:[~2011-10-19 21:24 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-19 21:24 Goffredo Baroncelli [this message]
2011-10-20  3:51 ` [RFC] aptitude & BTRFS slowness Roman Mamedov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3728579.PMSEXudObp@venice \
    --to=kreijack@libero.it \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=stewart@flamingspork.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.