Re: The best filesystem for a BIG news server

Alan Cox (alan@lxorguk.ukuu.org.uk)
Fri, 1 Nov 1996 20:39:59 +0000 (GMT)


> Can anybody tell me what filesystem is the best for the disk that
> contains the news. We are talking about a full flow, and that is
> something like 2GB a day.

Probably ext2 with the no_atime patch (appended to the mail).

> Another thing: How can I implement a very very fast disksubsystem for
> the news.

Use either hardware or software RAID/striping. The md driver will give very
good performance when striping disks. You probably want to stripe over
a pair of good disk controllers (eg two buslogic 958's). Oh and needless to
say USE SCSI ;)

Alan

"From " coneill@premier.net Wed Sep 4 23:43:25 1996
Date: Sun, 2 Jun 1996 09:00:59 -0500 (CDT)
From: coneill@premier.net
To: server-linux@netspace.org, linux-kernel@vger.rutgers.edu
Subject: Ext2 speedup (No atime update)

This is an implementation of an idea that I believe was originally
mentioned on the FreeBSD hackers mailing list.

The basic idea behind this is that for some applications, there is litle
or no point in updating the access time on the file. My primary use for
this is on our news server's spool and history disks. These drives are
primarily read-intensive, with most of the files being 2-3k. As you can
understand, updating a 1k inode every time you read a 2k file isn't
really very nice if you don't have to. My tests and examination of the
news programs I'm using indicate that it isn't used for anything.

This patch adds two mount-time options, "no_atime" and "update_atime".
update_atime is the default and will update atime's normally. no_atime
will never update atime's on files, directories, and symlinks.
update_atime primarily exists for remounting the filesystem.

This patch has been in production here for almost a week now with no
problems. It's very straightforward, and should have little or no
side-effects. However, I am wondering, would this be more
useful/appropriate as an inheritable ext2 attribute?

Anyway, please send any feedback you have to me, I'd like to hear from
anyone that tries it, whether or works or doesn't :)

diff -u -r linux.orig/fs/ext2/dir.c linux/fs/ext2/dir.c
--- linux.orig/fs/ext2/dir.c Fri Dec 22 05:00:19 1995
+++ linux/fs/ext2/dir.c Thu May 30 03:04:18 1996
@@ -206,7 +206,7 @@
offset = 0;
brelse (bh);
}
- if (!IS_RDONLY(inode)) {
+ if (!IS_RDONLY(inode) && !test_opt(sb,NO_ATIME)) {
inode->i_atime = CURRENT_TIME;
inode->i_dirt = 1;
}
diff -u -r linux.orig/fs/ext2/file.c linux/fs/ext2/file.c
diff -u -r linux.orig/fs/ext2/super.c linux/fs/ext2/super.c
--- linux.orig/fs/ext2/super.c Sat May 4 02:07:07 1996
+++ linux/fs/ext2/super.c Thu May 30 15:39:58 1996
@@ -252,6 +252,11 @@
value);
return 0;
}
+ } else if (!strcmp (this_char, "no_atime")) {
+ set_opt (*mount_options, NO_ATIME);
+ }
+ else if (!strcmp (this_char, "update_atime")) {
+ clear_opt (*mount_options, NO_ATIME);
}
/* Silently ignore the quota options */
else if (!strcmp (this_char, "grpquota")
diff -u -r linux.orig/fs/ext2/symlink.c linux/fs/ext2/symlink.c
--- linux.orig/fs/ext2/symlink.c Fri Apr 12 02:33:26 1996
+++ linux/fs/ext2/symlink.c Thu May 30 15:42:14 1996
@@ -86,7 +86,7 @@
link = bh->b_data;
} else
link = (char *) inode->u.ext2_i.i_data;
- if (!IS_RDONLY(inode)) {
+ if (!IS_RDONLY(inode) && !test_opt(inode->i_sb,NO_ATIME)) {
inode->i_atime = CURRENT_TIME;
inode->i_dirt = 1;
}
@@ -127,7 +127,7 @@
i++;
put_user (c, buffer++);
}
- if (!IS_RDONLY(inode)) {
+ if (!IS_RDONLY(inode) && !test_opt(inode->i_sb,NO_ATIME)) {
inode->i_atime = CURRENT_TIME;
inode->i_dirt = 1;
}
diff -u -r linux.orig/include/linux/ext2_fs.h linux/include/linux/ext2_fs.h
--- linux.orig/include/linux/ext2_fs.h Mon May 20 12:33:56 1996
+++ linux/include/linux/ext2_fs.h Thu May 30 03:01:55 1996
@@ -296,6 +296,7 @@
#define EXT2_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */
#define EXT2_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */
#define EXT2_MOUNT_MINIX_DF 0x0080 /* Mimics the Minix statfs */
+#define EXT2_MOUNT_NO_ATIME 0x0100 /* Don't update the atime */

#define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt
#define set_opt(o, opt) o |= EXT2_MOUNT_##opt
diff -u -r linux.orig/mm/filemap.c linux/mm/filemap.c
--- linux.orig/mm/filemap.c Sun May 19 15:37:07 1996
+++ linux/mm/filemap.c Thu May 30 21:35:58 1996
@@ -719,7 +719,12 @@
filp->f_reada = 1;
if (page_cache)
free_page(page_cache);
- if (!IS_RDONLY(inode)) {
+ if (inode->i_sb->s_magic==EXT2_SUPER_MAGIC) {
+ if (!IS_RDONLY(inode) && !test_opt(inode->i_sb, NO_ATIME)) {
+ inode->i_atime = CURRENT_TIME;
+ inode->i_dirt = 1;
+ }
+ } else if (!IS_RDONLY(inode)) {
inode->i_atime = CURRENT_TIME;
inode->i_dirt = 1;
}
@@ -1097,7 +1102,12 @@
return -EACCES;
if (!inode->i_op || !inode->i_op->readpage)
return -ENOEXEC;
- if (!IS_RDONLY(inode)) {
+ if (inode->i_sb->s_magic==EXT2_SUPER_MAGIC) {
+ if (!IS_RDONLY(inode) && !test_opt(inode->i_sb, NO_ATIME)) {
+ inode->i_atime = CURRENT_TIME;
+ inode->i_dirt = 1;
+ }
+ } else if (!IS_RDONLY(inode)) {
inode->i_atime = CURRENT_TIME;
inode->i_dirt = 1;
}

-------------------------------------------------------------------------
Clayton O'Neill Business--> Premier One Inc
whatever@oneill.net clayton@premier.net
http://www.oneill.net <--Personal http://www.premier.net