-
Notifications
You must be signed in to change notification settings - Fork 2.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add functional index to ipam.ip_address model/table #11519
Comments
Here are the CPU stats of the above 2K API queries against Output of with index
without index
and of course this is just while the test activity is going on in a test environment, not accounting for other workflows and uses happening simultaneously in a production environment. This is just to show the elevated CPU impact. |
Does adding the index require modifying the |
In my testing, adding the index (and the subsequent performance benefits) was invisible to NetBox and didn't require any code changes (beyond creating the index itself). |
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. NetBox is governed by a small group of core maintainers which means not all opened issues may receive direct feedback. Do not attempt to circumvent this process by "bumping" the issue; doing so will result in its immediate closure and you may be barred from participating in any future discussions. Please see our contributing guide. |
NetBox version
v3.4.2
Feature type
Change to existing functionality
Proposed functionality
Create a functional index on the
ipam.ip_address
table. Which indexes the output ofCAST(HOST(ipam.ipaddress))
so it isn't called on every execution of the query - which can be computationally expensive.Use case
I've detailed my findings in this discussion thread.
Queries/searches for
IPAddress
filtered byparent
Prefixes can be CPU intensive to the database and, depending on the parent prefix and IP addresses present, can be very inefficient when searching through hundreds of thousands of IPs (~260K) and only returning a few. Query time itself isn't terrible, but there is a noticeable uptick in CPU & DB worker threads/processes generated by this type of query compared to others - and that can be of concern to larger/high-volume instances.The culprit is mostly with calling
CAST(HOST("ipam_ipaddress"."address") AS INET)
netbox/netbox/ipam/lookups.py
Line 154 in d7c37d9
address
withbtree
orinet_ops
makes little difference in performance and query cost.But the above functional index is 1/3 the query cost (2264 vs 6632) and the query time is
<=2ms
(vs~70ms
). I observed a ~5MB increase (+8%) in table disk size (260K IPs) with this index, and new data insertion time seemed un-impacted in any noticeable way (Using the REST API:(0.0185s without index, 0.0166s with index)
).Additional metrics
Querying the
/ipam/ip-addresses/
endpoint ~2K times with different prefixes asparent
and 3 separate client processes:6m18s
4m37s
Database changes
New index on
address
field.One possible way is in a manually-defined migrations file:
or it might be possible on the model itself via defining an index expression.
External dependencies
N/A
And thanks & credit to @candlerb & @kkthxbye-code for setting me down the path
The text was updated successfully, but these errors were encountered: