.\" -*- mode: troff; coding: utf-8 -*-
.\" Automatically generated by Podwrapper::Man 1.47.7 (Pod::Simple 3.47)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
.ie n \{\
.    ds C` ""
.    ds C' ""
'br\}
.el\{\
.    ds C`
.    ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el       .ds Aq '
.\"
.\" If the F register is >0, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD.  Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.\"
.\" Avoid warning from groff about undefined register 'F'.
.de IX
..
.nr rF 0
.if \n(.g .if rF .nr rF 1
.if (\n(rF:(\n(.g==0)) \{\
.    if \nF \{\
.        de IX
.        tm Index:\\$1\t\\n%\t"\\$2"
..
.        if !\nF==2 \{\
.            nr % 0
.            nr F 2
.        \}
.    \}
.\}
.rr rF
.\"
.\" Required to disable full justification in groff 1.23.0.
.if n .ds AD l
.\" ========================================================================
.\"
.IX Title "nbdkit-rate-filter 1"
.TH nbdkit-rate-filter 1 2026-04-03 nbdkit-1.47.7 NBDKIT
.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
.SH NAME
nbdkit\-rate\-filter \- limit bandwidth by connection or server
.SH SYNOPSIS
.IX Header "SYNOPSIS"
.Vb 6
\& nbdkit \-\-filter=rate PLUGIN [PLUGIN\-ARGS...]
\&                      [rate=BITSPERSEC]
\&                      [connection\-rate=BITSPERSEC]
\&                      [rate\-file=FILENAME]
\&                      [connection\-rate\-file=FILENAME]
\&                      [burstiness=SECS]
.Ve
.SH DESCRIPTION
.IX Header "DESCRIPTION"
\&\f(CW\*(C`nbdkit\-rate\-filter\*(C'\fR is a filter that limits the bandwidth that can
be used by the server.  Limits can be applied per connection and/or
for the server as a whole.
.SH EXAMPLES
.IX Header "EXAMPLES"
.IP "nbdkit \-\-filter=rate memory 64M rate=1M" 4
.IX Item "nbdkit --filter=rate memory 64M rate=1M"
Create a 64M RAM disk and limit server bandwidth as a whole to a
maximum of 1\ Mbps (megabit per second).
.IP "nbdkit \-\-filter=rate memory 64M connection\-rate=50K" 4
.IX Item "nbdkit --filter=rate memory 64M connection-rate=50K"
Limit each connection to 50\ Kbps (kilobits per second).  However as
there is no limit to the number of simultaneous connections this does
not limit overall server bandwidth.
.IP "nbdkit \-\-filter=rate memory 64M connection\-rate=50K rate=1M" 4
.IX Item "nbdkit --filter=rate memory 64M connection-rate=50K rate=1M"
Limit each connection to 50\ Kbps.  Additionally the total bandwidth
across all connections to the server is limited to 1\ Mbps.
.IP "nbdkit \-\-filter=rate memory 64M rate=1M rate\-file=/tmp/rate" 4
.IX Item "nbdkit --filter=rate memory 64M rate=1M rate-file=/tmp/rate"
Initially limit bandwidth to 1\ Mbps.  While the server is running
the rate can be adjusted dynamically by writing a different rate into
\&\fI/tmp/rate\fR.
.SH PARAMETERS
.IX Header "PARAMETERS"
.IP \fBconnection\-rate=\fRBITSPERSEC 4
.IX Item "connection-rate=BITSPERSEC"
Limit each connection to \f(CW\*(C`BITSPERSEC\*(C'\fR.
.IP \fBrate=\fRBITSPERSEC 4
.IX Item "rate=BITSPERSEC"
Limit total bandwidth across all connections to \f(CW\*(C`BITSPERSEC\*(C'\fR.
.IP \fBconnection\-rate\-file=\fRFILENAME 4
.IX Item "connection-rate-file=FILENAME"
.PD 0
.IP \fBrate\-file=\fRFILENAME 4
.IX Item "rate-file=FILENAME"
.PD
Adjust the per\-connection or total bandwidth dynamically by writing
\&\f(CW\*(C`BITSPERSEC\*(C'\fR into \f(CW\*(C`FILENAME\*(C'\fR.  See "DYNAMIC ADJUSTMENT" below.
.IP \fBburstiness=\fRSECS 4
.IX Item "burstiness=SECS"
Control the bucket capacity, expressed as a length of time in
"rate\-equivalent seconds" that the client is allowed to burst for
after a period of inactivity.  The default is 2.0 seconds.  It\*(Aqs not
recommended to set this smaller than the default.
.PP
\&\f(CW\*(C`BITSPERSEC\*(C'\fR can be specified as a simple number, or you can use a
number followed by \f(CW\*(C`K\*(C'\fR, \f(CW\*(C`M\*(C'\fR etc to mean kilobits, megabits and so
on.
.SH "DYNAMIC ADJUSTMENT"
.IX Header "DYNAMIC ADJUSTMENT"
Using the \f(CW\*(C`connection\-rate\-file\*(C'\fR or \f(CW\*(C`rate\-file\*(C'\fR parameters you can
dynamically adjust the bandwidth while the server is running.
.PP
If the file is not present when the server starts up then the initial
rate is taken from the associated \f(CW\*(C`connection\-rate\*(C'\fR or \f(CW\*(C`rate\*(C'\fR
parameter (or if that is not present, then it is unlimited).  If the
file is deleted while the server is running then the last rate read
from the file continues to be used.
.PP
The file should be updated atomically (eg. create a new file, then
rename or \fBmv\fR\|(1) the new file over the old file).
.PP
There will be a short delay between the file being updated and the new
rate coming into effect.
.SH NOTES
.IX Header "NOTES"
You can specify \f(CW\*(C`rate\*(C'\fR and \f(CW\*(C`connection\-rate\*(C'\fR on their own or
together.  If you specify neither, the filter is turned off.
.PP
The rate filter approximates the bandwidth used by the NBD protocol on
the wire.  Some operations such as zeroing and trimming are
effectively free (because only a tiny NBD message is sent over the
network) and so do not count against the bandwidth limit.  NBD and TCP
protocol overhead is not included, so you may find that other tools
such as \fBtc\fR\|(8) and \fBiptables\fR\|(8) give more accurate results.
.PP
There are separate bandwidth limits for read and write (ie. download
and upload to the server).
.PP
If the size of requests made by your client is much larger than the
rate limit then you can see long, lumpy sleeps in this filter.  In the
future we may modify the filter to break up large requests
automatically in order to limit the length of sleeps.  Placing the
\&\fBnbdkit\-blocksize\-filter\fR\|(1) in front of this filter, or adjusting
\&\f(CW\*(C`burstiness\*(C'\fR upwards may help.
.SH FILES
.IX Header "FILES"
.ie n .IP \fR\fI$filterdir\fR\fI/nbdkit\-rate\-filter.so\fR 4
.el .IP \fR\f(CI$filterdir\fR\fI/nbdkit\-rate\-filter.so\fR 4
.IX Item "$filterdir/nbdkit-rate-filter.so"
The filter.
.Sp
Use \f(CW\*(C`nbdkit \-\-dump\-config\*(C'\fR to find the location of \f(CW$filterdir\fR.
.SH VERSION
.IX Header "VERSION"
\&\f(CW\*(C`nbdkit\-rate\-filter\*(C'\fR first appeared in nbdkit 1.12.
.SH "SEE ALSO"
.IX Header "SEE ALSO"
\&\fBnbdkit\fR\|(1),
\&\fBnbdkit\-blocksize\-filter\fR\|(1),
\&\fBnbdkit\-delay\-filter\fR\|(1),
\&\fBnbdkit\-exitlast\-filter\fR\|(1),
\&\fBnbdkit\-exitwhen\-filter\fR\|(1),
\&\fBnbdkit\-limit\-filter\fR\|(1),
\&\fBnbdkit\-pause\-filter\fR\|(1),
\&\fBnbdkit\-spinning\-filter\fR\|(1),
\&\fBnbdkit\-filter\fR\|(3),
\&\fBiptables\fR\|(8),
\&\fBtc\fR\|(8).
.SH AUTHORS
.IX Header "AUTHORS"
Richard W.M. Jones
.SH COPYRIGHT
.IX Header "COPYRIGHT"
Copyright Red Hat
.SH LICENSE
.IX Header "LICENSE"
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
.IP \(bu 4
Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
.IP \(bu 4
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
.IP \(bu 4
Neither the name of Red Hat nor the names of its contributors may be
used to endorse or promote products derived from this software without
specific prior written permission.
.PP
THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS \*(Aq\*(AqAS IS\*(Aq\*(Aq AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
