Skip to content

OCPBUGS-17157: cache/json: use shared buffers for JSON decoding#1140

Merged
openshift-merge-robot merged 1 commit intooperator-framework:masterfrom
stevekuznetsov:skuznets/encoding-decoding-shared-buffers
Sep 7, 2023
Merged

OCPBUGS-17157: cache/json: use shared buffers for JSON decoding#1140
openshift-merge-robot merged 1 commit intooperator-framework:masterfrom
stevekuznetsov:skuznets/encoding-decoding-shared-buffers

Conversation

@stevekuznetsov
Copy link
Copy Markdown
Contributor

This commit uses a shared buffer in a shared decoder for the ListBundles call, which should reduce our memory footprint when we're asked for this data.

I also changed the sorting of the key-set to be an explicit call to sort.Slice, instead of an implicit side-effect from sets.New().List().

This commit uses a shared buffer in a shared decoder for the ListBundles
call, which should reduce our memory footprint when we're asked for this
data.

I also changed the sorting of the key-set to be an explicit call to
sort.Slice, instead of an implicit side-effect from sets.New().List().

Signed-off-by: Steve Kuznetsov <skuznets@redhat.com>
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Sep 6, 2023
@openshift-ci-robot
Copy link
Copy Markdown

@stevekuznetsov: This pull request references Jira Issue OCPBUGS-17157, which is valid.

3 validation(s) were run on this bug
  • bug is open, matching expected state (open)
  • bug target version (4.14.0) matches configured target version for branch (4.14.0)
  • bug is in the state POST, which is one of the valid states (NEW, ASSIGNED, POST)

Requesting review from QA contact:
/cc @jianzhangbjz

The bug has been updated to refer to the pull request using the external bug tracker.

Details

In response to this:

This commit uses a shared buffer in a shared decoder for the ListBundles call, which should reduce our memory footprint when we're asked for this data.

I also changed the sorting of the key-set to be an explicit call to sort.Slice, instead of an implicit side-effect from sets.New().List().

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

@openshift-ci-robot openshift-ci-robot added the jira/valid-bug Indicates that a referenced Jira bug is valid for the branch this PR is targeting. label Sep 6, 2023
@stevekuznetsov
Copy link
Copy Markdown
Contributor Author

/assign @joelanford @grokspawn

@stevekuznetsov
Copy link
Copy Markdown
Contributor Author

stevekuznetsov commented Sep 6, 2023

Local testing only shows modest improvements, but these will be true regardless of GC performance, whereas os.ReadFile() can only perform this well when called N times if we have time to GC.

Here's the pprof diff while running this in the background:

while true; do grpcurl -plaintext 127.0.0.1:50051 api.Registry/ListBundles; sleep 1; done
$ go tool pprof -diff_base /home/stevekuznetsov/pprof/pprof.opm.alloc_objects.alloc_space.inuse_objects.inuse_space.015.pb.gz /home/stevekuznetsov/pprof/pprof.opm.alloc_objects.alloc_space.inuse_objects.inuse_space.012.pb.gz
File: opm
Build ID: f7be9c041bb04f86b16d09314008a9af727f3b81
Type: inuse_space
Time: Sep 6, 2023 at 9:26am (MDT)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) top 
Showing nodes accounting for -571.39kB, 7.90% of 7234.88kB total
Showing top 10 nodes out of 98
      flat  flat%   sum%        cum   cum%
-1319.97kB 18.24% 18.24% -1319.97kB 18.24%  os.ReadFile
 1184.27kB 16.37%  1.88%  1184.27kB 16.37%  encoding/json.(*Decoder).refill
-1025.63kB 14.18% 16.05% -1025.63kB 14.18%  regexp/syntax.(*compiler).inst
 -627.57kB  8.67% 24.73%  -627.57kB  8.67%  encoding/json.unquoteBytes
  600.16kB  8.30% 16.43%   -27.41kB  0.38%  encoding/json.(*decodeState).literalStore
  557.26kB  7.70%  8.73%   557.26kB  7.70%  github.com/russross/blackfriday/v2.init
  553.04kB  7.64%  1.08%   553.04kB  7.64%  github.com/gogo/protobuf/proto.RegisterType
  536.37kB  7.41%  6.33%   536.37kB  7.41%  k8s.io/apimachinery/pkg/api/meta.init
 -516.01kB  7.13%   0.8%  -516.01kB  7.13%  regexp/syntax.appendRange
 -513.31kB  7.09%  7.90%  -513.31kB  7.09%  k8s.io/apimachinery/pkg/conversion.ConversionFuncs.AddUntyped

Comment thread pkg/cache/json.go
Comment thread pkg/cache/json.go
Comment thread pkg/cache/json.go
// The SQLite-based server
// configures its querier to
// omit these fields when
// key path is set.
Copy link
Copy Markdown
Contributor

@grokspawn grokspawn Sep 7, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit:

Suggested change
// key path is set.
// bundle path is set.

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented Sep 7, 2023

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: grokspawn, stevekuznetsov

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci openshift-ci Bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Sep 7, 2023
Copy link
Copy Markdown
Member

@awgreene awgreene left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One question, looks good otherwise.

Comment thread pkg/cache/json.go
Comment on lines +71 to +79
sort.Slice(keys, func(i, j int) bool {
if keys[i].chName != keys[j].chName {
return keys[i].chName < keys[j].chName
}
if keys[i].pkgName != keys[j].pkgName {
return keys[i].pkgName < keys[j].pkgName
}
return keys[i].name < keys[j].name
})
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are we ordering the list here?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The ordering existed before, I just made it explicit. I imagine consumers (or tests) of this output benefit from a stable list.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For e.g. #1069

@stevekuznetsov stevekuznetsov added the lgtm Indicates that a PR is ready to be merged. label Sep 7, 2023
@openshift-merge-robot openshift-merge-robot merged commit 5ca4a9f into operator-framework:master Sep 7, 2023
@openshift-ci-robot
Copy link
Copy Markdown

@stevekuznetsov: Jira Issue OCPBUGS-17157: Some pull requests linked via external trackers have merged:

The following pull requests linked via external trackers have not merged:

These pull request must merge or be unlinked from the Jira bug in order for it to move to the next state. Once unlinked, request a bug refresh with /jira refresh.

Jira Issue OCPBUGS-17157 has not been moved to the MODIFIED state.

Details

In response to this:

This commit uses a shared buffer in a shared decoder for the ListBundles call, which should reduce our memory footprint when we're asked for this data.

I also changed the sorting of the key-set to be an explicit call to sort.Slice, instead of an implicit side-effect from sets.New().List().

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. jira/valid-bug Indicates that a referenced Jira bug is valid for the branch this PR is targeting. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. lgtm Indicates that a PR is ready to be merged.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants