Re: sysctl is too slow

From: Mateusz Guzik <mjguzik_at_gmail.com>
Date: Mon, 16 Aug 2021 19:30:51 UTC
Last time I checked lookup of a sysctl was very bad with linear scans all over.

Short of complete revamp of the entire thing I would start with
replacing the scans with a RB tree at each level. As is if you indeed
have 5000 datasets, you are doing increasingly longer walks.

On 8/16/21, Alan Somers <asomers@freebsd.org> wrote:
> ztop feels very sluggish on a server with 5000 ZFS datasets.  Dtrace shows
> that almost all of its time is spent in sys_sysctl.  ktrace shows that both
> ztop and sysctl(8) call sys_sysctl a total of five times for each sysctl
> they care about:
>
> 1) To get the next oid
> 2) To get the sysctl's name
> 3) To get the oidfmt
> 4) To get the size of the value
> 5) To get the value itself.
>
> Each of these steps takes about equal time, and together all five take
> about 100us.  If the time per call is mostly syscall overhead, then the
> process could be sped up by 80% by combining all of these things into a
> single syscall: return the next oid, its name, its format, the size of its
> value, and optimistically the value itself, assuming the user passed a
> sufficiently large buffer.
>
> Am I missing something?  Is there any other reason why sysctl is so slow?
> Or should I forget about it, and try to export ZFS's dataset stats through
> devstat instead?
> -Alan
>


-- 
Mateusz Guzik <mjguzik gmail.com>