[lustre-discuss] NRS TBF queue classification, rule matching, and rate limiting behavior

Rasool Almasikoupaei rasool.almasikoupaei at uni-tuebingen.de
Wed Jul 22 13:44:01 UTC 2026


Hello!

If someone could help clarify the behavior of the NRS TBF policy, I 
would really appreciate it. I'm particularly interested in how 
queue/bucket creation, classification, and rate limiting work.

I am configuring TBF on OSTs with rules similar to:
/
lctl set_param ost.OSS.ost_io.nrs_policies="tbf"

lctl set_param ost.OSS.ost_io.nrs_tbf_rule="start lt_$uid 
nid={192.168.43.[250-251]@tcp}&uid={$uid} rate=10000 realtime=1"

lctl set_param ost.OSS.ost_io.nrs_tbf_rule="start rt_$uid 
nid={192.168.43.*@tcp}&uid={$uid} rate=10000"/

The goal of this configuration is to protect interactive I/O from login 
nodes while controlling heavy I/O from compute nodes.

According to the documentation, using:

/lctl set_param ost.OSS.ost_io.nrs_policies="tbf"/

enables all available classifiers. I would like to clarify how these 
classifiers affect queue creation and rule matching.

I have the following questions:

*1. How are TBF queues/buckets created and how do rule fields affect 
their identity?*

According to the documentation, using:

/lctl set_param ost.OSS.ost_io.nrs_policies="tbf"/

enables all available classifiers (NID, JOBID, OPCODE, UID/GID).

How is the TBF queue/resource identity determined when multiple 
classifiers are enabled?

For example, with:

/start rt_1000 nid={192.168.43.*@tcp}&uid={1000} rate=10000/

and the same UID accessing from:
/
192.168.43.1 at tcp
192.168.43.2 at tcp/

does Lustre create:

a) one shared bucket:
/
UID=1000
rate=10000/

or:

b) separate buckets:

/NID=192.168.43.1 at tcp
rate=10000/

/NID=192.168.43.2 at tcp
rate=10000/

or:

c) another classifier-dependent/composite resource key?

More generally, are fields in nrs_tbf_rule (nid, uid, gid, jobid, etc.) 
only match conditions used to select the rule, or can they also 
participate in determining the TBF queue/resource identity?

For example, if gid or jobid are not specified in a rule, are they 
ignored, or can they still cause additional queue separation because 
those classifiers are enabled?

*2. Does realtime=1 provide scheduling priority?*

For example, if login traffic and compute traffic from the same user 
both have pending RPCs:

/login:
     lt_$uid
     realtime=1/
/
compute:
     rt_$uid/

will login traffic be serviced ahead of compute traffic?

*3. Rate limiting versus fair sharing*

My understanding is that TBF rate= is a token bucket rate limit rather 
than a fair-share weight.

For example:

/user A: rate=10000
user B: rate=10000/

If only user A is active, will user A remain limited to the configured 
rate, or can it consume unused OST bandwidth?

The desired behavior for our environment is:

/when multiple users are active:
     provide isolation and prevent starvation

when there is no contention:
     allow active users to use available OST bandwidth

always:
     prioritize interactive login-node traffic over compute-node traffic/

If TBF is not intended for this type of dynamic sharing, is there 
another NRS policy or recommended approach?

Any clarification would be greatly appreciated.

Rasool

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lustre.org/pipermail/lustre-discuss_lists.lustre.org/attachments/20260722/8304ee73/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5095 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.lustre.org/pipermail/lustre-discuss_lists.lustre.org/attachments/20260722/8304ee73/attachment.p7s>


More information about the lustre-discuss mailing list