Re: [PATCH 1/2] nfs: writeback pages wait queue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, Oct 23, 2011 at 11:54:39PM +0800, Wu Fengguang wrote:
> On Fri, Oct 21, 2011 at 12:05:30AM +0800, Wu Fengguang wrote:
> > Trond,
> > 
> > After applying these two patches, the IO-less patchset performances
> > 45% better than the vanilla kernel and the average commit size only
> > decreases by -16% in the common NFS-thresh=1G/nfs-1dd case :)
> 
> To better understand how the NFS writeback wait queue helps, I
> visualized the network traffic over time. Attached are the graphs for
> the vanilla kernel and the one with the IO-less + NFS wait queue
> patches.
> 
> nfs-1dd-4k-32p-32016M-1024M:10-3.1.0-rc8-vanilla+/dstat-bw.png
> nfs-1dd-4k-32p-31951M-1024M:10-3.1.0-rc8-nfs-wq4+/dstat-bw.png
> 
> The obvious difference is, the network traffic become now more
> distributed and the "zero traffic" periods are mostly reduced.
> 
> The other 2dd, 10dd cases have similar results.

To better explore the internal NFS server states and to make it clear
where the performance gain comes from, I collected the dstat data in
the NFS server and visualized the network/disk throughputs over time.
The results are attached for the following test cases. 

nfs-1dd-4k-32p-32016M-1024M:10-3.1.0-rc10-vanilla+
nfs-1dd-4k-32p-31951M-1024M:10-3.1.0-rc9-ioless-full-nfs-wq5-next-20111014+

In the above cases, the vanilla kernel is shown to have roughly
_interleaved_ disk/net activities. After the patches, the disk/net
pipeline is well established, hence the impressive performance improvements.

     3.1.0-rc10-vanilla+  3.1.0-rc9-ioless-full-nfs-wq5-next-20111014+  
------------------------  ------------------------  
                   57.48       +25.5%        72.11  NFS-thresh=1G/nfs-10dd-4k-32p-32768M-1024M:10-X
                   63.86       +27.1%        81.15  NFS-thresh=1G/nfs-1dd-4k-32p-32768M-1024M:10-X
                   47.51       +80.1%        85.54  NFS-thresh=1G/nfs-2dd-4k-32p-32768M-1024M:10-X
                  168.85       +41.4%       238.80  TOTAL write_bw

          3.1.0-vanilla+  3.1.0-rc9-ioless-full-nfs-wq5-next-20111014+
------------------------  ------------------------
                   21.93       +97.0%        43.21  NFS-thresh=100M/nfs-10dd-4k-32p-32768M-100M:10-X
                   55.91       +27.4%        71.23  NFS-thresh=100M/nfs-1dd-4k-32p-32768M-100M:10-X
                   26.73      +129.2%        61.25  NFS-thresh=100M/nfs-2dd-4k-32p-32768M-100M:10-X
                   15.66       +40.3%        21.96  NFS-thresh=10M/nfs-10dd-4k-32p-32768M-10M:10-X
                   29.01        +0.7%        29.20  NFS-thresh=10M/nfs-1dd-4k-32p-32768M-10M:10-X
                   20.52        +7.9%        22.13  NFS-thresh=10M/nfs-2dd-4k-32p-32768M-10M:10-X
                   56.30       +28.1%        72.11  NFS-thresh=1G/nfs-10dd-4k-32p-32768M-1024M:10-X
                   63.33       +28.1%        81.15  NFS-thresh=1G/nfs-1dd-4k-32p-32768M-1024M:10-X
                   51.95       +64.6%        85.54  NFS-thresh=1G/nfs-2dd-4k-32p-32768M-1024M:10-X
                    9.87       -48.2%         5.11  NFS-thresh=1M/nfs-10dd-4k-32p-32768M-1M:10-X
                   14.52       -24.0%        11.03  NFS-thresh=1M/nfs-1dd-4k-32p-32768M-1M:10-X
                   15.69       -67.4%         5.12  NFS-thresh=1M/nfs-2dd-4k-32p-32768M-1M:10-X
                  381.42       +33.5%       509.05  TOTAL write_bw

The vanilla kernel's disk idle periods indicate that the background
flusher work is not running. This is true. The NFS server has 12GB
memory and hence 1.2GB background dirty thresh. So when the client
side has dirty thresh <= 1GB, it won't send enough data to trigger
the background work in NFS server. So the server disk IOs will be
triggered mostly by NFS commits. The patched kernel seems to generate
smoother commit pattern to prevent most disk idles.

To explore how it performs when the NFS server's background writeback
kicks in, I further tried lowering the NFS server's dirty thresholds
to

dirty_bytes = 1GB, background threshold = 512MB
-----------------------------------------------
graphs attached for cases:
        nfs-1dd-1M-32p-32016M-1024M:10-3.1.0-vanilla+
        nfs-1dd-1M-32p-31951M-1024M:10-3.1.0-rc9-ioless-full-nfs-wq5-next-20111014+

          3.1.0-vanilla+  3.1.0-rc9-ioless-full-nfs-wq5-next-20111014+
------------------------  ------------------------
                   25.23       +71.2%        43.21  NFS-thresh=100M/nfs-10dd-1M-32p-32768M-100M:10-X
                   60.21       +15.1%        69.29  NFS-thresh=100M/nfs-1dd-1M-32p-32768M-100M:10-X
                   33.46       +82.8%        61.18  NFS-thresh=100M/nfs-2dd-1M-32p-32768M-100M:10-X
                   21.81        +2.8%        22.42  NFS-thresh=10M/nfs-10dd-1M-32p-32768M-10M:10-X
                   28.71       -11.0%        25.55  NFS-thresh=10M/nfs-1dd-1M-32p-32768M-10M:10-X
                   28.11       -13.0%        24.46  NFS-thresh=10M/nfs-2dd-1M-32p-32768M-10M:10-X
                   54.10       +42.3%        76.97  NFS-thresh=1G/nfs-10dd-1M-32p-32768M-1024M:10-X
                   64.88       +29.1%        83.76  NFS-thresh=1G/nfs-1dd-1M-32p-32768M-1024M:10-X
                   53.64       +56.2%        83.79  NFS-thresh=1G/nfs-2dd-1M-32p-32768M-1024M:10-X
                   13.00       -61.0%         5.06  NFS-thresh=1M/nfs-10dd-1M-32p-32768M-1M:10-X
                   13.53       -33.9%         8.95  NFS-thresh=1M/nfs-1dd-1M-32p-32768M-1M:10-X
                   16.51       -72.5%         4.54  NFS-thresh=1M/nfs-2dd-1M-32p-32768M-1M:10-X
                  413.20       +23.2%       509.18  TOTAL write_bw

dirty_bytes = 100MB, background threshold = 50MB
------------------------------------------------
graphs attached for cases:
        nfs-1dd-100k-32p-32016M-1024M:10-3.1.0-vanilla+
        nfs-1dd-100k-32p-31951M-1024M:10-3.1.0-rc9-ioless-full-nfs-wq5-next-20111014+

          3.1.0-vanilla+  3.1.0-rc9-ioless-full-nfs-wq5-next-20111014+
------------------------  ------------------------
                   24.93       +71.1%        42.67  NFS-thresh=100M/nfs-10dd-100k-32p-32768M-100M:10-X
                   58.35       +23.0%        71.78  NFS-thresh=100M/nfs-1dd-100k-32p-32768M-100M:10-X
                   28.47      +123.0%        63.48  NFS-thresh=100M/nfs-2dd-100k-32p-32768M-100M:10-X
                   18.44       +22.5%        22.60  NFS-thresh=10M/nfs-10dd-100k-32p-32768M-10M:10-X
                   28.75        +0.1%        28.78  NFS-thresh=10M/nfs-1dd-100k-32p-32768M-10M:10-X
                   20.84       +12.0%        23.34  NFS-thresh=10M/nfs-2dd-100k-32p-32768M-10M:10-X
                   71.78        +6.4%        76.38  NFS-thresh=1G/nfs-10dd-100k-32p-32768M-1024M:10-X
                   91.02        -4.7%        86.72  NFS-thresh=1G/nfs-1dd-100k-32p-32768M-1024M:10-X
                   78.84        +9.9%        86.64  NFS-thresh=1G/nfs-2dd-100k-32p-32768M-1024M:10-X
                  421.42       +19.2%       502.39  TOTAL write_bw

The conclusion is,

- it helps the vanilla kernel performance to lower the NFS server's
  dirty threshold

- when NFS server's background writeback is not running, the patches
  will help establish good net/disk pipeline and improve performance;
  otherwise it maintains roughly the same performance

Thanks,
Fengguang

Attachment: dstat-nfss-bw.png
Description: PNG image

Attachment: dstat-nfss-bw.png
Description: PNG image

Attachment: dstat-nfss-bw.png
Description: PNG image

Attachment: dstat-nfss-bw.png
Description: PNG image

Attachment: dstat-nfss-bw.png
Description: PNG image

Attachment: dstat-nfss-bw.png
Description: PNG image


[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]