-
Notifications
You must be signed in to change notification settings - Fork 357
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
[Performance] Remove compliance from VmOrTemplate includes #5283
[Performance] Remove compliance from VmOrTemplate includes #5283
Conversation
Over time, the `compliances` table will get quiet large, and when paired with the rest of the tables in this report, you end up getting a query executed that looks like this: SELECT "vms"."id" AS t0_r0, ..., "vms"."memory_hot_add_increment" AS t0_r75, "hosts"."id" AS t1_r0, ..., "hosts"."physical_server_id" AS t1_r36, "storages"."id" AS t2_r0, ..., "storages"."storage_domain_type" AS t2_r18, "ext_management_systems"."id" AS t3_r0, ..., "ext_management_systems"."tenant_mapping_enabled" AS t3_r23, "snapshots"."id" AS t4_r0, ..., "snapshots"."ems_ref" AS t4_r16, "compliances"."id" AS t5_r0, ..., "compliances"."event_type" AS t5_r6, "operating_systems"."id" AS t6_r0, ..., "operating_systems"."kernel_version" AS t6_r25, "hardwares"."id" AS t7_r0, ..., "hardwares"."provision_state" AS t7_r34, "tags"."id" AS t8_r0, "tags"."name" AS t8_r1 FROM "vms" LEFT OUTER JOIN "hosts" ON "hosts"."id" = "vms"."host_id" LEFT OUTER JOIN "storages" ON "storages"."id" = "vms"."storage_id" LEFT OUTER JOIN "ext_management_systems" ON "ext_management_systems"."id" = "vms"."ems_id" LEFT OUTER JOIN "snapshots" ON "snapshots"."vm_or_template_id" = "vms"."id" LEFT OUTER JOIN "compliances" ON "compliances"."resource_id" = "vms"."id" AND "compliances"."resource_type" = $1 LEFT OUTER JOIN "operating_systems" ON "operating_systems"."vm_or_template_id" = "vms"."id" LEFT OUTER JOIN "hardwares" ON "hardwares"."vm_or_template_id" = "vms"."id" LEFT OUTER JOIN "taggings" ON "taggings"."taggable_id" = "vms"."id" AND "taggings"."taggable_type" = $2 LEFT OUTER JOIN "tags" ON "tags"."id" = "taggings"."tag_id" WHERE "vms"."type" IN (...) AND "vms"."template" = $3 AND (lower(vms.name) like '%win2k%' escape '`') AND "vms"."id" IN (...) ORDER BY LOWER("vms"."name") ASC This ends up creating 243 columns per record, and the number of rows returned has been observed to be over 80k with just 20 VMs being targeted in the `"vms"."id" IN (...)` portion of the query. Since some fixes have been made to avoid the N+1 that results from doing this: - ManageIQ/manageiq#17473 - ManageIQ/manageiq#17474 - ManageIQ/manageiq#17475 It is much better to do use those facilities. Even with the N+1, it is much better making extra round trips than the gigs of data that would be returned as a result.
Checked commit NickLaMuro@f149e51 with ruby 2.3.3, rubocop 0.52.1, haml-lint 0.20.0, and yamllint 1.10.0 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice find Nick.
This is removing compliances, which were included to only access the last compliances.
extra credit: is it possible to includes for the last compliances and avoid the N+1 too?
Since this is a performance PR, can we show some form of numbers here?
regardless of metrics, this looks sound/good and we should merge
Test failure looks unrelated. I'll circle back and see what changes caused the chargeback "USD" to look like "United States Dollars" |
@kbrock Please... read the description...
Also, as part of the QA steps (which I will put together tomorrow, see description), I am planning on tossing in the numbers at that time, since it would be something others can compare against (instead of some random DB that I happen to be using). |
@kbrock Metrics added, along with the steps to reproduce yourself (updates in description). |
@kbrock I know you already approved this PR, but there were some updates to the text of the PR and I'd like to know if we still can count on your kind endorsement here 😄 Thanks. |
thanks @mzazrivec - yes, I still approve this message |
…rom_VmOrTemplate_yaml_report [Performance] Remove compliance from VmOrTemplate includes (cherry picked from commit f39659c) Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1686043
Hammer backport details:
|
Fine backport (to manageiq repo) details:
|
For some databases, this brings back way too many records See also ManageIQ#5283 https://bugzilla.redhat.com/show_bug.cgi?id=1733351
For some databases, this brings back way too many records. It is unnecessary. And if it were necessary, it will get automatically anyway See also ManageIQ#5283 https://bugzilla.redhat.com/show_bug.cgi?id=1733351
For some databases, this brings back way too many records. It is unnecessary. And if it were necessary, it will get automatically anyway See also ManageIQ#5283 https://bugzilla.redhat.com/show_bug.cgi?id=1733351
Over time, the
compliances
table will get quiet large, and when paired with the rest of the tables in this report, you end up getting a query executed that looks like this:This ends up creating 243 columns per record, and the number of rows returned has been observed to be over 80k with just 20 VMs being targeted in the
"vms"."id" IN (...)
portion of the query.Since some fixes have been made to avoid the N+1 that results from doing this:
It is much better to do use those facilities. Even with the N+1, it is much better making extra round trips than the gigs of data that would be returned as a result.
Metrics
The following is output from running the QA steps below:
Before
After
The "Rows" and the total request time is the important data to make note of.
Links
Host.yaml
: Remove compliances include from Host.yaml #3989Steps for Testing/QA
Will put a script together for some replication data and a script to help see the before and after.Update: Instructions for replication and benchmarking this change can be found in the following gist:
https://gist.github.com/NickLaMuro/f36576f9fa73c2bcc0d1ef7b7d0adafb
Left example run data in the Metrics section above.