speed up ar(1) on UFS file systems
authoremaste <emaste@FreeBSD.org>
Mon, 29 Jun 2015 13:48:44 +0000 (13:48 +0000)
committeremaste <emaste@FreeBSD.org>
Mon, 29 Jun 2015 13:48:44 +0000 (13:48 +0000)
commit56f61c7a15151f217da0da378d96eba38efe709f
tree76a467440be53d306171b628d26cf158b2abeaf5
parentf07d3d455971c3561479579ffd10ac0275dbab26
speed up ar(1) on UFS file systems

Fault in the buffer prior to writing to workaround poor performance due
to interaction with kernel fs deadlock avoidance code. See the comment
prior to vn_io_fault_doio() in sys/kern/vfs_vnops.c for details of the
issue.

On my stable/10 desktop with a 16MB obj.o and "ar r out.a obj.o" I see
the following run times (seconds):

x ar.r284891
+ ar.patched
+----------------------------------------------------------------------+
|+                                                                     |
|+                                                                    x|
|+                                                                   xx|
|A                                                                   |A|
+----------------------------------------------------------------------+
    N         Min          Max        Median           Avg        Stddev
x   3       1.307        1.321         1.315     1.3143333  0.0070237692
+   3       0.020        0.023         0.022   0.021666667  0.0015275252
Difference at 95.0% confidence
        -1.29267 +/- 0.0115203
        -98.3515% +/- 0.876513%
        (Student's t, pooled s = 0.00508265)

Thanks to kib for diagnosing and explaining the issue and suggesting
the workaround.

Reviewed by: eadler, kib
MFC after: 1 week
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D2933
usr.bin/ar/write.c