ZFS prefetch problem

jhell jhell at DataIX.net
Thu Dec 31 22:22:54 UTC 2009


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1



On Thu, 31 Dec 2009 11:13, mickael.maillot@ wrote:
> this bug is referenced:
> http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6859997
> and a good description can be found here:
> http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6861397
> and a long thread on zfs-discuss
> http://mail.opensolaris.org/pipermail/zfs-discuss/2009-July/029710.html
>
> i use bob friesenhahn's script to test (with little mod)
> http://www.simplesystems.org/users/bfriesen/zfs-discuss/zfs-cache-test.ksh
>
> so i test on my hardware for reading 3000 8M files
>
> without prefetch: no problem
> initial
> real    7m49.039s
> user    0m2.931s
> sys     0m22.574s
> second
> real    7m48.080s
> user    0m2.858s
> sys     0m32.559s
>
> with prefetch enable:
> initial
> real    2m55.163s
> user    0m2.244s
> sys     0m10.072s
> second
> real    7m37.522s
> user    0m2.367s
> sys     0m10.565s
>
> ok i hit the same bug.
> it was fix by this commit:
> http://hg.intevation.org/mirrors/opensolaris.org/onnv-gate/rev/0e96dd3b905a
> which add kstats for prefetch and a bug in rollback (not for us)
>
> the only modif for the prefetch + arc problem is resolv by:
> --- dmu_zfetch.c.orig   2009-12-31 15:46:15.211700719 +0100
> +++ dmu_zfetch.c        2009-12-31 15:46:42.915461251 +0100
> @@ -323,7 +323,8 @@
>                 * we will read "len" blocks before "striding".
>                 */
>                if (zh->zst_offset >= zs->zst_offset &&
> -                   zh->zst_offset < zs->zst_offset + zs->zst_len) {
> +                   zh->zst_offset < zs->zst_offset + zs->zst_len &&
> +                       prefetched) {
>                        /* already fetched */
>                        rc = 1;
>                        goto out;
>
> with this patch i have:
> initial
> real    2m57.614s
> user    0m2.228s
> sys     0m10.054s
> second
> real    2m45.403s
> user    0m2.445s
> sys     0m9.726s
> third
> real    2m16.381s
> user    0m2.152s
> sys     0m9.136s
>
> looks good.
> tested on 8-STABLE amd64, with/without log/cache ssd. (but not with zil_disable)
>

Thanks for the heads up on this. I have applied the following to a 
stable/7 system @r201336 "The obrien new year copyright ;)" and will write 
back with further results.

Attached is a patch to r201336.

Happy New Years!

- -- 

  Thu Dec 31 17:08:44 2009

  jhell

-----BEGIN PGP SIGNATURE-----

iQEcBAEBAgAGBQJLPSQtAAoJEJBXh4mJ2FR+SdcH/jb7j6Fb7OfvRwY2yNpoJ3iG
li5NZ3Ukj7CC4XNIYS3nal3xg55oIvzTfjX6+c7MCCpbx2p3RuAvMh2wOcU+B2vn
Pdvd0sDFRG96caUrdJ0O1ZIs2SmdVSKz/vxQEVtWW6EUq/4NOd+D243zDJxqOYED
CkgobJmymWQ9swxR0uvH0vlsj8mK481GkMJPWVKDthGvjLU72dp+A1sCEj1e7B3J
b9n48m66jUSYJwxO0Kyf8oHNVYdUvOURcwrSnS0yUdZlsUIn0ALHEGkO26N3Jl0V
Te9CFuNaQfpsswTMiZQvpMVfhPk+292tGXsERaxx4m46SyWFnZYpXu8qUIwqhpM=
=0pfh
-----END PGP SIGNATURE-----
-------------- next part --------------
--- dmu_zfetch.c.orig	2009-12-31 16:54:17.921496283 -0500
+++ dmu_zfetch.c	2009-12-31 16:58:16.278113395 -0500
@@ -324,7 +324,8 @@
 		 * we will read "len" blocks before "striding".
 		 */
 		if (zh->zst_offset >= zs->zst_offset &&
-		    zh->zst_offset < zs->zst_offset + zs->zst_len) {
+		    zh->zst_offset < zs->zst_offset + zs->zst_len &&
+			prefetched) {
 			/* already fetched */
 			rc = 1;
 			goto out;


More information about the freebsd-fs mailing list