[Gluster-users] FUSE I/O Lockup while accessing glusterfs shares

Hugo Cisneiros (Eitch) hugo.cisneiros at gmail.com
Tue Jun 22 15:40:40 UTC 2010


Hi,

We have a web server installation that is using glusterFS. There are 3
GlusterFS servers and 4 GlusterFS clients acessing one share. We're
having a problem that randomly, the httpd processes begin to hung
while waiting for I/O. This begins to happen with the following kernel
call trace:

kernel: INFO: task httpd.worker:18974 blocked for more than 120 seconds.
kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables
this message.
kernel: httpd.worker  D ffffffff80150462     0 18974   4818
18975 18972 (NOTLB)
kernel: ffff8108c0ee7c78 0000000000000086 ffff8101f3b2b000 ffff810116d0f200
kernel: ffff81037392c6d8 000000000000000a ffff8106b73d57a0 ffff810116dd4100
kernel: 00004f0baea8a21e 00000000000026f5 ffff8106b73d5988 0000000300000000
kernel: Call Trace:
kernel: [<ffffffff88443cda>] :fuse:fuse_dentry_revalidate+0x13e/0x1c1
kernel: [<ffffffff80063c6f>] __mutex_lock_slowpath+0x60/0x9b
kernel: [<ffffffff80063cb9>] .text.lock.mutex+0xf/0x14
kernel: [<ffffffff8000cec2>] do_lookup+0x90/0x1e6
kernel: [<ffffffff80009bb2>] __link_path_walk+0x3a6/0xf42
kernel: [<ffffffff8000e9e2>] link_path_walk+0x42/0xb2
kernel: [<ffffffff8000ccb2>] do_path_lookup+0x275/0x2f1
kernel: [<ffffffff8001280e>] getname+0x15b/0x1c2
kernel: [<ffffffff80023876>] __user_walk_fd+0x37/0x4c
kernel: [<ffffffff80028846>] vfs_stat_fd+0x1b/0x4a
kernel: [<ffffffff8000c5fe>] _atomic_dec_and_lock+0x39/0x57
kernel: [<ffffffff800235a8>] sys_newstat+0x19/0x31
kernel: [<ffffffff80012b54>] __fput+0x191/0x1bd
kernel: [<ffffffff8002c9e4>] mntput_no_expire+0x19/0x89
kernel: [<ffffffff80023b84>] filp_close+0x5c/0x64
kernel: [<ffffffff8001dfa6>] sys_close+0x88/0xbd
kernel: [<ffffffff8005d116>] system_call+0x7e/0x83

Looking at the glusterfs client logs, the following entries begin to
show up before this call trace begins:

[fuse-bridge.c:585:fuse_lookup] glusterfs-fuse: 89023783: LOOKUP
46912563008752/2010 (fuse_loc_fill() failed)
[fuse-bridge.c:793:fuse_getattr] glusterfs-fuse: 89024196: GETATTR
46912563008752 (fuse_loc_fill() failed)
[fuse-bridge.c:793:fuse_getattr] glusterfs-fuse: 89024203: GETATTR
46912563008752 (fuse_loc_fill() failed)
[fuse-bridge.c:793:fuse_getattr] glusterfs-fuse: 89024207: GETATTR
46912563008752 (fuse_loc_fill() failed)
[fuse-bridge.c:793:fuse_getattr] glusterfs-fuse: 89024210: GETATTR
46912563008752 (fuse_loc_fill() failed)
[fuse-bridge.c:793:fuse_getattr] glusterfs-fuse: 89024213: GETATTR
46912563008752 (fuse_loc_fill() failed)
[fuse-bridge.c:793:fuse_getattr] glusterfs-fuse: 89024218: GETATTR
46912563008752 (fuse_loc_fill() failed)

The same message repeats 1116 times. Talking with a friend, we noticed
that the 4 web servers are reading *and* writing very concurrently and
because of this, there are many lookups, reads and unlinks returning
"no such file or directory" on the log, like these:

[fuse-bridge.c:859:fuse_fd_cbk] glusterfs-fuse: 88969079: OPEN()
/cache/70ea5f0d4df01648be4f70d9813f24b7.meta => -1 (No such file or
directory)
[fuse-bridge.c:1215:fuse_unlink_cbk] glusterfs-fuse: 88969080:
UNLINK() /cache/70ea5f0d4df01648be4f70d9813f24b7.meta => -1 (No such
file or directory)
[fuse-bridge.c:491:fuse_entry_cbk] glusterfs-fuse:
LOOKUP(/cache/index.html) inode (ptr=0x2aaab313f9f0, ino=1528908,
gen=5480759143103581058) found conflict (ptr=0x2aaadebc8690,
ino=1528908, gen=5480759143103581058)

After the kernel call trace appears, the fuse filesystem becomes very
unresponsive and unstable. Who tries to read the mounted directory,
randomly gets its process locked (with status waiting for I/O) and
hangs forever. We know that maybe glusterfs is not made for high
concurrency for both writing and reading, so we're working on getting
an alternate solution for this behavior (it's a disk cache, we're
transfering for something like memcached). But maybe this error helps
to find something unexpected going on... :)

Here's the client configuration:

volume vol01
  type protocol/client
  option transport-type tcp
  option remote-host server01.domain
  option remote-subvolume vol
end-volume

volume vol02
  type protocol/client
  option transport-type tcp
  option remote-host server02.domain
  option remote-subvolume vol
end-volume

volume vol03
  type protocol/client
  option transport-type tcp
  option remote-host server03.domain
  option remote-subvolume vol
end-volume

volume vol-mirror
    type cluster/replicate
    subvolumes vol01 vol02 vol03
end-volume

volume vol-iocache
  type performance/io-cache
  option cache-size 128MB
  option cache-timeout 2
  subvolumes vol-mirror
end-volume

volume vol-quickread
    type performance/quick-read
    option cache-timeout 1
    option max-file-size 64kB
    subvolumes vol-iocache
end-volume

volume vol-writebehind
    type performance/write-behind
    option cache-size 4MB
    subvolumes vol-quickread
end-volume

volume vol-statprefetch
    type performance/stat-prefetch
    subvolumes vol-writebehind
end-volume

Thanks,

-- 
[]'s
Hugo
www.devin.com.br



More information about the Gluster-users mailing list