12 way dbench analysis: 2.5.9, dalloc and fastwalkdcache
Hi,
Its about time I took to the kernel with the dbench stick. The following results were done on a 12 way ppc64 machine with 250MHz cpus. I tested 2.5.9, 2.5.9 with Andrew Morton's dalloc work and Hanna Linder's fast walk dcache patch. The results can be found at:
http://samba.org/~anton/linux/2.5.9/
A few things to note:
1. On 2.5.9, lru_list_lock contention starts to cut in at 4 cpus. Andrew's dalloc work gets rid of this bottleneck completely. Its fantastic stuff!
2. The dcache lock starts to cut in at 6 cpus, and Hanna's patch reduces the contention a lot.
Things look pretty good right out to 12 way with these patches, I'll try and get some runs on a larger SMP next.
Anton
Quoted 10 lines · Anton Blanchard
Hi,
Its about time I took to the kernel with the dbench stick. The following results were done on a 12 way ppc64 machine with 250MHz cpus. I tested 2.5.9, 2.5.9 with Andrew Morton's dalloc work and Hanna Linder's fast walk dcache patch. The results can be found at:
Thanks, Anton.
I should point out that the patches are misnamed - this stuff has nothing to do with "delayed allocation". It just started out that way.
The code Anton tested was the removal of the buffer LRUs and the buffer hashtable and the introduction of address_space-based writeback. That code is >this< close to being ready. Still chasing a couple of oddities.
Anton also found a ratcache locking bug. Patch is under test.
After the writeback changes I plan on:
- A ton of little cleanups
- Add dirty address_spaces to the superblocks, don't find them via inodes.
- Assemble BIOs direct against pagecache for buffer-backed filesystems - bypass the buffer layer for bulk file I/O.
- All sorts of other stuff.
- Then back onto delayed allocate. That's item 78 on the 79-entry todo list...
-
Quoted 3 lines · On Thu, 18 Apr 2002 18:18:43 +1000 Anton Blanchard <[email protected]> wrote:
1. On 2.5.9,
lru_list_lockcontention starts to cut in at 4 cpus. Andrew's dalloc work gets rid of this bottleneck completely. Its fantastic stuff!
Agreed.
Just wanted to state for the public record: Andrew Morton is a God, Rusty.
Signature · 2 lines
there are those who do and those who hang on and you don't see too many doers quoting their contemporaries. -- Larry McVoy
Quoted 3 lines · --On Thursday, April 18, 2002 18:18:43 +1000 Anton Blanchard <[email protected]>…
2. The dcache lock starts to cut in at 6 cpus, and Hanna's patch reduces the contention a lot.
Thanks Anton for running this. The data on your website will be very useful to me. I fixed one problem and put the patch up on sourceforge. undo_locked() called dget() while holding the dcache_lock instead of dget_locked() which is designed to be called with the dcache_lock held.
This patch is against 2.5.8 at:
http://prdownloads.sf.net/lse/fast_walkA1-2.5.8.patch
However, I recently found a deadlock that no one else has been able to reproduce. Could you try doing a find on /proc and tell me if it deadlocks?
Thanks.
Hanna
------
fs/dcache.c +10 -3
@@ -704,13 +704,22 @@struct dentry *d_lookup (struct dentry * parent,struct qstr * name) { +struct dentry * dentry; +spin_lock (&dcache_lock); + dentry =__d_lookup (parent,name); +spin_unlock (&dcache_lock); +return dentry; +} + +struct dentry *__d_lookup (struct dentry * parent,struct qstr * name) +{ +unsigned int len = name->len;unsigned int hash = name->hash;const unsigned char *str = name->name;struct list_head *head =d_hash (parent,hash);struct list_head *tmp; -spin_lock (&dcache_lock); tmp = head->next;for (;;) { struct dentry * dentry = list_entry(tmp, struct dentry, d_hash);
@@ -732,10 +741,8 @@ }__dget_locked (dentry); dentry->d_vfs_flags |=DCACHE_REFERENCED ; -spin_unlock (&dcache_lock);return dentry; } -spin_unlock (&dcache_lock);return NULL ; }
fs/namei.c +111 -6
197 lines not on this page · raw message
include/linux/dcache.h +1 -0
@@ -220,6 +220,7 @@/* appendix may either be NULL or be used for transname suffixes */ extern struct dentry *d_lookup (struct dentry *,struct qstr *); +extern struct dentry *__d_lookup (struct dentry *,struct qstr *);/* validate "insecure" dentry pointer */ extern int d_validate (struct dentry *,struct dentry *);
include/linux/fs.h +4 -7
@@ -1282,12 +1282,15 @@* - require a directory * - ending slashes ok even for nonexistent files * - internal "there are more path compnents" flag +* - locked when lookup done with dcache_lock held */ #define LOOKUP_FOLLOW (1)#define LOOKUP_DIRECTORY (2)#define LOOKUP_CONTINUE (4)#define LOOKUP_PARENT (16)#define LOOKUP_NOALT (32) +#define LOOKUP_LOCKED (64) +/* * Type of the last component on LOOKUP_PARENT */
@@ -1317,14 +1320,8 @@extern int FASTCALL (__user_walk (const char *,unsigned ,struct nameidata *));extern int FASTCALL (path_init (const char *,unsigned ,struct nameidata *));extern int FASTCALL (path_walk (const char *,struct nameidata *)); +extern int FASTCALL (path_lookup (const char *,unsigned ,struct nameidata *));extern int FASTCALL (link_path_walk (const char *,struct nameidata *)); -static inline int path_lookup (const char *path,unsigned flags,struct nameidata *nd) -{ -int error =0 ; -if (path_init (path, flags, nd)) - error =path_walk (path, nd); -return error; -}extern void path_release (struct nameidata *);extern int follow_down (struct vfsmount **,struct dentry **);extern int follow_up (struct vfsmount **,struct dentry **);
Quoted 5 lines
The code Anton tested was the removal of the buffer LRUs and the buffer hashtable and the introduction of address_space-based writeback. That code is >this< close to being ready. Still chasing a couple of oddities.
http://samba.org/~anton/linux/2.5.9/
GOLD FOR AUSTRALIA!
The latest results include updates to dallocbase-70-writeback and a per cpu page cache, both from Andrew.
Anton
Hi Hanna,
Quoted 6 lines
Thanks Anton for running this. The data on your website will be very useful to me. I fixed one problem and put the patch up on sourceforge.
undo_locked()calleddget()while holding thedcache_lockinstead ofdget_locked()which is designed to be called with thedcache_lockheld.
Quoted 6 lines
This patch is against 2.5.8 at:
http://prdownloads.sf.net/lse/fast_walkA1-2.5.8.patchHowever, I recently found a deadlock that no one else has been able to reproduce. Could you try doing a find on /proc and tell me if it deadlocks?
Indeed that does deadlock, I'll give the new patch a go (with Pauls undo_locked suggestion). I did get a dcache BUG() when I tried an SDET run (lost the details unfortunately) but I'll try to reproduce it with this patch.
Anton