Skip to content

Reduce object allocation when using LogLimitedArray

Adam Hegyi requested to merge estimate-json-size-for-log-limited-array into master

What does this MR do?

This MR estimates the input object size (as JSON) when iterating over the array within Gitlab::Utils::LogLimitedArray rather than calling to_json.

TLDR: Get the estimated size of the JSON object without actually serializing it.

['large', {}, 'object'].to_json.bytesize # 21

# vs

Gitlab::Utils::JsonSizeEstimator.estimate(['large', {}, 'object']) # 21

Previous MR where this was originally implemented (split): !25808 (merged)

Performance

Script to compare execution times (within rails root): RAILS_ENV=production rails runner log_perf.rb

log_perf.rb

Before

normal_api_log_entry     18.199k i/s
 large_api_log_entry    437.419  i/s
    normal_log_entry     19.673k i/s
     large_log_entry    534.500  i/s
Allocations for simple log entry, total: 870
                                          filename     type count old_count total_age min_age max_age total_memsize
                 rails/railtie/configuration.rb:92 T_STRING     1         0         0       0       0             0
                 rails/railtie/configuration.rb:92  T_IMEMO     1         0         0       0       0             0
              active_support/ordered_options.rb:42 T_STRING     1         0         0       0       0             0
                gitlab/lograge/custom_options.rb:9  T_IMEMO     1         0         0       0       0             0
               gitlab/lograge/custom_options.rb:12  T_IMEMO     1         0         0       0       0             0
               gitlab/lograge/custom_options.rb:15   T_DATA     1         0         0       0       0             0
                                       time.rb:722 T_STRING     1         0         0       0       0             0
active_support/core_ext/numeric/conversions.rb:108 T_STRING     1         0         0       0       0             0
              gitlab/utils/log_limited_array.rb:16  T_IMEMO     1         0         0       0       0             0
        active_support/core_ext/object/json.rb:158  T_IMEMO     1         0         0       0       0             0
                active_support/json/encoding.rb:57  T_IMEMO     1         0         0       0       0             0
         active_support/core_ext/object/json.rb:44  T_IMEMO     1         0         0       0       0             0
              gitlab/utils/log_limited_array.rb:15  T_ARRAY     1         0         0       0       0             0
               gitlab/lograge/custom_options.rb:14   T_HASH     1         0         0       0       0             0
               gitlab/lograge/custom_options.rb:24  T_IMEMO     1         0         0       0       0             0
                       gitlab/gitaly_client.rb:341  T_ARRAY     1         0         0       0       0             0
                           labkit/correlation.rb:3  T_IMEMO     1         0         0       0       0             0
                          labkit/correlation.rb:10 T_MODULE     1         0         0       0       0             0
                          labkit/correlation.rb:10 T_STRING     1         0         0       0       0             0
                          labkit/correlation.rb:10  T_IMEMO     1         0         0       0       0             0
            labkit/correlation/correlation_id.rb:3  T_IMEMO     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:27  T_IMEMO     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:26 T_MODULE     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:26 T_STRING     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:26  T_IMEMO     1         0         0       0       0             0
            labkit/correlation/correlation_id.rb:8   T_FILE     1         0         0       0       0             0
                               labkit/context.rb:3  T_IMEMO     1         0         0       0       0             0
                             labkit/context.rb:133 T_STRING     1         0         0       0       0             0
                             labkit/context.rb:133  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:23  T_ARRAY     1         0         0       0       0             0
                              labkit/context.rb:24  T_ARRAY     1         0         0       0       0             0
                              labkit/context.rb:26  T_CLASS     1         0         0       0       0             0
                              labkit/context.rb:26  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:27  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:37  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:45  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:49  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:53  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:57  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:65  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:74  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:76  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:82  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:89  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:93  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:99  T_IMEMO     1         0         0       0       0             0
                             labkit/context.rb:117  T_ARRAY     1         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:187  T_ARRAY     1         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:190 T_STRING     1         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:191 T_STRING     1         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:193  T_ARRAY     1         0         0       0       0             0
                             labkit/context.rb:119 T_STRING     1         0         0       0       0             0
                             labkit/context.rb:119  T_IMEMO     1         0         0       0       0             0
                             labkit/context.rb:119  T_ARRAY     1         0         0       0       0             0
                             labkit/context.rb:121  T_IMEMO     1         0         0       0       0             0
                             labkit/context.rb:132  T_IMEMO     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:25  T_CLASS     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:25  T_IMEMO     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:11  T_IMEMO     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:17  T_IMEMO     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:24  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:72  T_ARRAY     1         0         0       0       0             0
                      gitlab/request_context.rb:14 T_OBJECT     1         0         0       0       0             0
                                    log_perf.rb:72  T_ARRAY     2         0         0       0       0             0
                                       time.rb:724 T_STRING     2         0         0       0       0             0
               gitlab/rugged_instrumentation.rb:18  T_ARRAY     2         0         0       0       0             0
               gitlab/lograge/custom_options.rb:28   T_FILE     2         0         0       0       0             0
                           labkit/correlation.rb:8   T_DATA     2         0         0       0       0             0
            labkit/correlation/correlation_id.rb:8   T_HASH     2         0         0       0       0             0
                             labkit/context.rb:133  T_CLASS     2         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:187   T_DATA     2         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:219 T_STRING     2         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:223 T_STRING     2         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:217  T_ARRAY     2         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:217 T_STRING     2         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:231   T_DATA     2         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:231   T_HASH     2         0         0       0       0             0
                             labkit/context.rb:117  T_IMEMO     2         0         0       0       0             0
                      gitlab/request_context.rb:14  T_ARRAY     2         0         0       0       0             0
               gitlab/lograge/custom_options.rb:12   T_HASH     3         0         0       0       0             0
                active_support/json/encoding.rb:22 T_OBJECT     3         0         0       0       0             0
                active_support/json/encoding.rb:30   T_HASH     3         0         0       0       0             0
                active_support/json/encoding.rb:35   T_HASH     3         0         0       0       0             0
               active_support/json/encoding.rb:107   T_HASH     3         0         0       0       0             0
                                json/common.rb:211   T_DATA     3         0         0       0       0             0
                                json/common.rb:223 T_STRING     3         0         0       0       0             0
                           labkit/correlation.rb:6   T_DATA     3         0         0       0       0             0
            labkit/correlation/correlation_id.rb:8   T_DATA     3         0         0       0       0             0
        active_support/core_ext/object/json.rb:172  T_IMEMO     4         0         0       0       0             0
                active_support/json/encoding.rb:96  T_IMEMO     4         0         0       0       0             0
                active_support/json/encoding.rb:96   T_HASH     4         0         0       0       0             0
               gitlab/lograge/custom_options.rb:28   T_HASH     4         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:218 T_STRING     4         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:220 T_STRING     4         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:222 T_STRING     4         0         0       0       0             0
               gitlab/lograge/custom_options.rb:12  T_ARRAY     6         0         0       0       0             0
        active_support/core_ext/object/json.rb:172 T_STRING     6         0         0       0       0             0
               gitlab/lograge/custom_options.rb:28   T_DATA     6         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:215 T_STRING    10         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:231 T_STRING    12         0         0       0       0             0
        active_support/core_ext/object/json.rb:172  T_ARRAY    13         0         0       0       0             0
        active_support/core_ext/object/json.rb:172   T_HASH    13         0         0       0       0             0
                active_support/json/encoding.rb:96  T_ARRAY    13         0         0       0       0             0
                active_support/json/encoding.rb:92 T_STRING    17         0         0       0       0             0
                active_support/json/encoding.rb:58  T_IMEMO    17         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:231  T_IMEMO    18         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:231  T_ARRAY    18         0         0       0       0             0
                                json/common.rb:223  T_ARRAY    21         0         0       0       0             0
               gitlab/lograge/custom_options.rb:28  T_ARRAY    31         0         0       0       0             0
         active_support/core_ext/object/json.rb:39 T_STRING    34         0         0       0       0             0
               gitlab/lograge/custom_options.rb:28  T_IMEMO    34         0         0       0       0             0
            labkit/correlation/correlation_id.rb:8  T_ARRAY    60         0         0       0       0             0
            labkit/correlation/correlation_id.rb:8  T_IMEMO    67         0         0       0       0             0
               gitlab/lograge/custom_options.rb:28 T_STRING   123         0         0       0       0             0
            labkit/correlation/correlation_id.rb:8 T_STRING   201         0         0       0       0             0
                                             TOTAL            870         0         0       0       0             0

After

About 40% speedup.

normal_api_log_entry     33.117k i/s
 large_api_log_entry    660.240  i/s
    normal_log_entry     64.949k i/s 
     large_log_entry      1.142k i/s
Allocations for simple log entry, total: 708
                 rails/railtie/configuration.rb:92 T_STRING     1         0         0       0       0             0
                 rails/railtie/configuration.rb:92  T_IMEMO     1         0         0       0       0             0
              active_support/ordered_options.rb:42 T_STRING     1         0         0       0       0             0
                gitlab/lograge/custom_options.rb:9  T_IMEMO     1         0         0       0       0             0
               gitlab/lograge/custom_options.rb:12  T_IMEMO     1         0         0       0       0             0
               gitlab/lograge/custom_options.rb:15   T_DATA     1         0         0       0       0             0
                                       time.rb:722 T_STRING     1         0         0       0       0             0
active_support/core_ext/numeric/conversions.rb:108 T_STRING     1         0         0       0       0             0
              gitlab/utils/log_limited_array.rb:15  T_ARRAY     1         0         0       0       0             0
               gitlab/lograge/custom_options.rb:14   T_HASH     1         0         0       0       0             0
               gitlab/lograge/custom_options.rb:24  T_IMEMO     1         0         0       0       0             0
                       gitlab/gitaly_client.rb:341  T_ARRAY     1         0         0       0       0             0
                           labkit/correlation.rb:3  T_IMEMO     1         0         0       0       0             0
                          labkit/correlation.rb:10 T_MODULE     1         0         0       0       0             0
                          labkit/correlation.rb:10 T_STRING     1         0         0       0       0             0
                          labkit/correlation.rb:10  T_IMEMO     1         0         0       0       0             0
            labkit/correlation/correlation_id.rb:3  T_IMEMO     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:27  T_IMEMO     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:26 T_MODULE     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:26 T_STRING     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:26  T_IMEMO     1         0         0       0       0             0
            labkit/correlation/correlation_id.rb:8   T_FILE     1         0         0       0       0             0
                               labkit/context.rb:3  T_IMEMO     1         0         0       0       0             0
                             labkit/context.rb:133 T_STRING     1         0         0       0       0             0
                             labkit/context.rb:133  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:23  T_ARRAY     1         0         0       0       0             0
                              labkit/context.rb:24  T_ARRAY     1         0         0       0       0             0
                              labkit/context.rb:26  T_CLASS     1         0         0       0       0             0
                              labkit/context.rb:26  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:27  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:37  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:45  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:49  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:53  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:57  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:65  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:74  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:76  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:82  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:89  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:93  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:99  T_IMEMO     1         0         0       0       0             0
                             labkit/context.rb:117  T_ARRAY     1         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:187  T_ARRAY     1         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:190 T_STRING     1         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:191 T_STRING     1         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:193  T_ARRAY     1         0         0       0       0             0
                             labkit/context.rb:119 T_STRING     1         0         0       0       0             0
                             labkit/context.rb:119  T_IMEMO     1         0         0       0       0             0
                             labkit/context.rb:119  T_ARRAY     1         0         0       0       0             0
                             labkit/context.rb:121  T_IMEMO     1         0         0       0       0             0
                             labkit/context.rb:132  T_IMEMO     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:25  T_CLASS     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:25  T_IMEMO     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:11  T_IMEMO     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:17  T_IMEMO     1         0         0       0       0             0
           labkit/correlation/correlation_id.rb:24  T_IMEMO     1         0         0       0       0             0
                              labkit/context.rb:72  T_ARRAY     1         0         0       0       0             0
                      gitlab/request_context.rb:14 T_OBJECT     1         0         0       0       0             0
                                    log_perf.rb:72  T_ARRAY     2         0         0       0       0             0
                                       time.rb:724 T_STRING     2         0         0       0       0             0
               gitlab/rugged_instrumentation.rb:18  T_ARRAY     2         0         0       0       0             0
               gitlab/lograge/custom_options.rb:28   T_FILE     2         0         0       0       0             0
                           labkit/correlation.rb:8   T_DATA     2         0         0       0       0             0
            labkit/correlation/correlation_id.rb:8   T_HASH     2         0         0       0       0             0
                             labkit/context.rb:133  T_CLASS     2         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:187   T_DATA     2         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:219 T_STRING     2         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:223 T_STRING     2         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:217  T_ARRAY     2         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:217 T_STRING     2         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:231   T_DATA     2         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:231   T_HASH     2         0         0       0       0             0
                             labkit/context.rb:117  T_IMEMO     2         0         0       0       0             0
                      gitlab/request_context.rb:14  T_ARRAY     2         0         0       0       0             0
               gitlab/lograge/custom_options.rb:12   T_HASH     3         0         0       0       0             0
                           labkit/correlation.rb:6   T_DATA     3         0         0       0       0             0
            labkit/correlation/correlation_id.rb:8   T_DATA     3         0         0       0       0             0
               gitlab/lograge/custom_options.rb:28   T_HASH     4         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:218 T_STRING     4         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:220 T_STRING     4         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:222 T_STRING     4         0         0       0       0             0
               gitlab/lograge/custom_options.rb:12  T_ARRAY     6         0         0       0       0             0
            gitlab/utils/json_size_estimator.rb:53 T_STRING     6         0         0       0       0             0
               gitlab/lograge/custom_options.rb:28   T_DATA     6         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:215 T_STRING    10         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:231 T_STRING    12         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:231  T_IMEMO    18         0         0       0       0             0
  active_support/core_ext/module/delegation.rb:231  T_ARRAY    18         0         0       0       0             0
               gitlab/lograge/custom_options.rb:28  T_ARRAY    31         0         0       0       0             0
               gitlab/lograge/custom_options.rb:28  T_IMEMO    34         0         0       0       0             0
            labkit/correlation/correlation_id.rb:8  T_ARRAY    60         0         0       0       0             0
            labkit/correlation/correlation_id.rb:8  T_IMEMO    67         0         0       0       0             0
               gitlab/lograge/custom_options.rb:28 T_STRING   123         0         0       0       0             0
            labkit/correlation/correlation_id.rb:8 T_STRING   201         0         0       0       0             0
                                             TOTAL            708         0         0       0       0             0

Does this MR meet the acceptance criteria?

Conformity

Availability and Testing

Security

If this MR contains changes to processing or storing of credentials or tokens, authorization and authentication methods and other items described in the security review guidelines:

  • Label as security and @ mention @gitlab-com/gl-security/appsec
  • The MR includes necessary changes to maintain consistency between UI, API, email, or other methods
  • Security reports checked/validated by a reviewer from the AppSec team
Edited by Adam Hegyi

Merge request reports