redis-benchmarks-specification 0.2.42__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- redis_benchmarks_specification/__api__/Readme.md +7 -0
- redis_benchmarks_specification/__api__/__init__.py +5 -0
- redis_benchmarks_specification/__api__/api.py +87 -0
- redis_benchmarks_specification/__api__/app.py +191 -0
- redis_benchmarks_specification/__builder__/Readme.md +7 -0
- redis_benchmarks_specification/__builder__/__init__.py +5 -0
- redis_benchmarks_specification/__builder__/builder.py +1010 -0
- redis_benchmarks_specification/__builder__/schema.py +23 -0
- redis_benchmarks_specification/__cli__/__init__.py +5 -0
- redis_benchmarks_specification/__cli__/args.py +226 -0
- redis_benchmarks_specification/__cli__/cli.py +624 -0
- redis_benchmarks_specification/__cli__/stats.py +1304 -0
- redis_benchmarks_specification/__common__/__init__.py +0 -0
- redis_benchmarks_specification/__common__/builder_schema.py +256 -0
- redis_benchmarks_specification/__common__/env.py +96 -0
- redis_benchmarks_specification/__common__/github.py +280 -0
- redis_benchmarks_specification/__common__/package.py +28 -0
- redis_benchmarks_specification/__common__/runner.py +485 -0
- redis_benchmarks_specification/__common__/spec.py +143 -0
- redis_benchmarks_specification/__common__/suppress_warnings.py +20 -0
- redis_benchmarks_specification/__common__/timeseries.py +1621 -0
- redis_benchmarks_specification/__compare__/__init__.py +5 -0
- redis_benchmarks_specification/__compare__/args.py +240 -0
- redis_benchmarks_specification/__compare__/compare.py +3322 -0
- redis_benchmarks_specification/__init__.py +15 -0
- redis_benchmarks_specification/__runner__/__init__.py +5 -0
- redis_benchmarks_specification/__runner__/args.py +334 -0
- redis_benchmarks_specification/__runner__/remote_profiling.py +535 -0
- redis_benchmarks_specification/__runner__/runner.py +3837 -0
- redis_benchmarks_specification/__self_contained_coordinator__/__init__.py +5 -0
- redis_benchmarks_specification/__self_contained_coordinator__/args.py +210 -0
- redis_benchmarks_specification/__self_contained_coordinator__/artifacts.py +27 -0
- redis_benchmarks_specification/__self_contained_coordinator__/build_info.py +61 -0
- redis_benchmarks_specification/__self_contained_coordinator__/clients.py +58 -0
- redis_benchmarks_specification/__self_contained_coordinator__/cpuset.py +17 -0
- redis_benchmarks_specification/__self_contained_coordinator__/docker.py +108 -0
- redis_benchmarks_specification/__self_contained_coordinator__/post_processing.py +19 -0
- redis_benchmarks_specification/__self_contained_coordinator__/prepopulation.py +96 -0
- redis_benchmarks_specification/__self_contained_coordinator__/runners.py +740 -0
- redis_benchmarks_specification/__self_contained_coordinator__/self_contained_coordinator.py +2554 -0
- redis_benchmarks_specification/__setups__/__init__.py +0 -0
- redis_benchmarks_specification/__setups__/topologies.py +17 -0
- redis_benchmarks_specification/__spec__/__init__.py +5 -0
- redis_benchmarks_specification/__spec__/args.py +78 -0
- redis_benchmarks_specification/__spec__/cli.py +259 -0
- redis_benchmarks_specification/__watchdog__/__init__.py +5 -0
- redis_benchmarks_specification/__watchdog__/args.py +54 -0
- redis_benchmarks_specification/__watchdog__/watchdog.py +175 -0
- redis_benchmarks_specification/commands/__init__.py +0 -0
- redis_benchmarks_specification/commands/commands.py +15 -0
- redis_benchmarks_specification/setups/builders/gcc:15.2.0-amd64-debian-bookworm-default.yml +20 -0
- redis_benchmarks_specification/setups/builders/gcc:15.2.0-arm64-debian-bookworm-default.yml +20 -0
- redis_benchmarks_specification/setups/platforms/aws-ec2-1node-c5.4xlarge.yml +27 -0
- redis_benchmarks_specification/setups/topologies/topologies.yml +153 -0
- redis_benchmarks_specification/test-suites/defaults.yml +32 -0
- redis_benchmarks_specification/test-suites/generate.py +114 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hexpire-5-fields-10B-values.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hexpire-50-fields-10B-values.yml +53 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hexpireat-5-fields-10B-values.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hexpireat-50-fields-10B-values.yml +53 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hgetall-50-fields-100B-values.yml +52 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hgetex-5-fields-10B-values.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hgetex-50-fields-10B-values.yml +53 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hgetex-persist-50-fields-10B-values.yml +53 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hpexpire-5-fields-10B-values.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hpexpire-50-fields-10B-values.yml +53 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hpexpireat-5-fields-10B-values.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hpexpireat-50-fields-10B-values.yml +53 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-htll-50-fields-10B-values.yml +53 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-1-fields-with-1000B-values-expiration.yml +35 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-1-fields-with-10B-values-expiration.yml +34 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-1-fields-with-10B-values-long-expiration.yml +35 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-1-fields-with-10B-values-short-expiration.yml +35 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-20-fields-with-1B-values-pipeline-30.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-5-fields-with-1000B-values-expiration.yml +36 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-5-fields-with-10B-values-expiration.yml +35 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-5-fields-with-10B-values-long-expiration.yml +36 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-5-fields-with-10B-values-short-expiration.yml +36 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-50-fields-with-1000B-values-expiration.yml +45 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-50-fields-with-1000B-values.yml +44 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-50-fields-with-100B-values.yml +44 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-50-fields-with-10B-values-expiration.yml +44 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-50-fields-with-10B-values-long-expiration.yml +45 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-50-fields-with-10B-values-short-expiration.yml +45 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-50-fields-with-10B-values.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-10Kkeys-load-hash-50-fields-with-10000B-values.yml +44 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-10Kkeys-load-list-rpush-bulkload-pipeline-50.yml +39 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-10Kkeys-load-list-with-10B-values-pipeline-50.yml +33 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-10Mkeys-load-hash-5-fields-with-100B-values-pipeline-10.yml +33 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-10Mkeys-load-hash-5-fields-with-100B-values.yml +33 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-10Mkeys-load-hash-5-fields-with-10B-values-pipeline-10.yml +34 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-10Mkeys-load-hash-5-fields-with-10B-values.yml +33 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-10Mkeys-string-get-10B-pipeline-100-nokeyprefix.yml +38 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Kkeys-hash-listpack-500-fields-update-20-fields-with-1B-to-64B-values.yml +75 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-100B-expire-use-case.yml +50 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-10B-expire-use-case.yml +50 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-10B-psetex-expire-use-case.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-10B-setex-expire-use-case.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-1KiB-expire-use-case.yml +49 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-4KiB-expire-use-case.yml +50 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-bitmap-getbit-pipeline-10.yml +42 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-exists-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-expire-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-expireat-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-pexpire-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-scan-count-500-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-scan-cursor-count-500-pipeline-10.yml +42 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-scan-cursor-count-5000-pipeline-10.yml +42 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-scan-cursor-pipeline-10.yml +42 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-scan-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-scan-type-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-touch-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-ttl-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hexists.yml +45 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hget-hgetall-hkeys-hvals-with-100B-values.yml +48 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hgetall-50-fields-10B-values.yml +53 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hincrby.yml +42 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hincrbyfloat.yml +42 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hkeys-10-fields-with-10B-values-with-expiration-pipeline-10.yml +45 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hkeys-5-fields-with-100B-values-with-expiration-pipeline-10.yml +44 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hkeys-5-fields-with-10B-values-with-expiration-pipeline-10.yml +44 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hkeys-50-fields-with-10B-values-with-expiration-pipeline-10.yml +54 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hmget-5-fields-with-100B-values-pipeline-10.yml +44 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-transactions-multi-exec-pipeline-20.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-list-lpop-rpop-with-100B-values.yml +44 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-list-lpop-rpop-with-10B-values.yml +44 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-list-lpop-rpop-with-1KiB-values.yml +44 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-list-rpoplpush-with-10B-values.yml +42 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-hash-5-fields-with-1000B-values-pipeline-10.yml +34 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-hash-5-fields-with-1000B-values.yml +33 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-hash-50-fields-with-10B-values-long-expiration-pipeline-10.yml +46 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-hash-hmset-5-fields-with-1000B-values.yml +33 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-list-rpush-with-10B-values.yml +32 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-list-with-100B-values.yml +32 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-list-with-10B-values-pipeline-10.yml +33 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-list-with-10B-values.yml +32 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-list-with-1KiB-values.yml +32 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-set-intset-with-100-elements-19-digits-pipeline-10.yml +58 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-set-intset-with-100-elements-19-digits.yml +58 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-set-intset-with-100-elements-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-set-intset-with-100-elements.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-stream-1-fields-with-100B-values-pipeline-10.yml +33 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-stream-1-fields-with-100B-values.yml +33 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-stream-5-fields-with-100B-values-pipeline-10.yml +34 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-stream-5-fields-with-100B-values.yml +33 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-100B-values-pipeline-10.yml +32 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-100B-values.yml +35 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-10B-values-pipeline-10.yml +33 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-10B-values-pipeline-100-nokeyprefix.yml +29 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-10B-values-pipeline-100.yml +33 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-10B-values-pipeline-50.yml +33 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-10B-values-pipeline-500.yml +33 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-10B-values.yml +32 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-1KiB-values-pipeline-10.yml +32 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-1KiB-values.yml +32 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-20KiB-values.yml +35 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-zset-listpack-with-100-elements-double-score.yml +91 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-zset-with-10-elements-double-score.yml +35 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-zset-with-10-elements-int-score.yml +34 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-append-1-100B-pipeline-10.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-append-1-100B.yml +42 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-decr.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-100B-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-100B.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-10B-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-10B-pipeline-100-nokeyprefix.yml +38 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-10B-pipeline-100.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-10B-pipeline-50.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-10B-pipeline-500.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-10B.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-1KiB-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-1KiB.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-32B-pipeline-10.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-32B.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-incr-pipeline-10.yml +30 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-incrby-pipeline-10.yml +30 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-incrby.yml +30 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-incrbyfloat-pipeline-10.yml +30 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-incrbyfloat.yml +30 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-int-encoding-strlen-pipeline-10.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mget-1KiB.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-100B-expire-pipeline-10.yml +45 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-100B-expire.yml +45 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-100B-pipeline-10.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-100B.yml +42 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-1KB-pipeline-10.yml +42 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-1KB.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-32B-pipeline-10.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-32B.yml +42 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-512B-pipeline-10.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-512B.yml +42 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-with-expiration-240B-400_conns.yml +47 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-set-with-ex-100B-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setex-100B-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setget200c-1KiB-pipeline-1.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setget200c-1KiB-pipeline-10.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setget200c-4KiB-pipeline-1.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setget200c-4KiB-pipeline-10.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setget200c-512B-pipeline-1.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setget200c-512B-pipeline-10.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setrange-100B-pipeline-10.yml +42 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setrange-100B.yml +42 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-100M-bits-bitmap-bitcount.yml +45 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-1Billion-bits-bitmap-bitcount.yml +45 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-2-elements-geopos.yml +38 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-2-elements-geosearch-fromlonlat-withcoord.yml +39 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geodist-pipeline-10.yml +36 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geodist.yml +36 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geohash-pipeline-10.yml +35 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geohash.yml +34 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geopos-pipeline-10.yml +35 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geopos.yml +34 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geosearch-fromlonlat-bybox.yml +36 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geosearch-fromlonlat-pipeline-10.yml +36 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geosearch-fromlonlat.yml +36 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-hash-1K-fields-hgetall-pipeline-10.yml +285 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-hash-1K-fields-hgetall.yml +284 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-hash-hscan-1K-fields-100B-values-cursor-count-1000.yml +291 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-hash-hscan-1K-fields-10B-values-cursor-count-100.yml +291 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-hash-hscan-1K-fields-10B-values.yml +290 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-hash-hscan-50-fields-10B-values.yml +54 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10-elements-lrange-all-elements-pipeline-10.yml +37 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10-elements-lrange-all-elements.yml +36 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-100-elements-int-7bit-uint-lrange-all-elements-pipeline-10.yml +44 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-100-elements-int-lrange-all-elements-pipeline-10.yml +52 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-100-elements-llen-pipeline-10.yml +52 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-100-elements-lrange-all-elements-pipeline-10.yml +52 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-100-elements-lrange-all-elements.yml +51 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10K-elements-lindex-integer.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10K-elements-lindex-string-pipeline-10.yml +42 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10K-elements-lindex-string.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10K-elements-linsert-lrem-integer.yml +45 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10K-elements-linsert-lrem-string.yml +45 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10K-elements-lpos-integer.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10K-elements-lpos-string.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-1K-elements-lrange-all-elements-pipeline-10.yml +202 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-1K-elements-lrange-all-elements.yml +201 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-2K-elements-quicklist-lrange-all-elements-longs.yml +258 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-load-hash-1K-fields-with-5B-values.yml +282 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-load-zset-with-5-elements-parsing-float-score.yml +36 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-load-zset-with-5-elements-parsing-hexa-score.yml +36 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-pfadd-4KB-values-pipeline-10.yml +32 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-10-elements-smembers-pipeline-10.yml +37 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-10-elements-smembers.yml +36 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-10-elements-smismember.yml +38 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-100-elements-sismember-is-a-member.yml +53 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-100-elements-sismember-not-a-member.yml +53 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-100-elements-smembers.yml +50 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-100-elements-smismember.yml +54 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-100-elements-sscan.yml +50 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-10M-elements-sismember-50pct-chance.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-10M-elements-srem-50pct-chance.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-1K-elements-smembers.yml +200 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-1K-elements-sscan-cursor-count-100.yml +201 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-1K-elements-sscan.yml +200 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-1M-elements-sismember-50pct-chance.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-200K-elements-sadd-constant.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-2M-elements-sadd-increasing.yml +32 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zincrby-1M-elements-pipeline-1.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zrank-100K-elements-pipeline-1.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zrank-10M-elements-pipeline-1.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zrank-1M-elements-pipeline-1.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zrem-5M-elements-pipeline-1.yml +47 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zrevrangebyscore-256K-elements-pipeline-1.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zrevrangebyscore-256K-elements-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zrevrank-1M-elements-pipeline-1.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-10-elements-zrange-all-elements-long-scores.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-10-elements-zrange-all-elements.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-100-elements-zrange-all-elements.yml +66 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-100-elements-zrangebyscore-all-elements-long-scores.yml +66 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-100-elements-zrangebyscore-all-elements.yml +66 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-100-elements-zscan.yml +65 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-1K-elements-zrange-all-elements.yml +322 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-1K-elements-zscan.yml +321 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-1M-elements-zcard-pipeline-10.yml +39 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-1M-elements-zremrangebyscore-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-1M-elements-zrevrange-5-elements.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-1M-elements-zrevrange-withscores-5-elements-pipeline-10.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-1M-elements-zscore-pipeline-10.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-600K-elements-zrangestore-1K-elements.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-600K-elements-zrangestore-300K-elements.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-listpack-zrank-100-elements-pipeline-1.yml +50 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-lua-eval-hset-expire.yml +37 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-lua-evalsha-hset-expire.yml +41 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-set-10-100-elements-sdiff.yml +57 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-set-10-100-elements-sinter.yml +57 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-set-10-100-elements-sunion.yml +57 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-stream-5-entries-xread-all-entries-pipeline-10.yml +46 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-stream-5-entries-xread-all-entries.yml +46 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-zset-300-elements-skiplist-encoded-zunion.yml +434 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-zset-300-elements-skiplist-encoded-zunionstore.yml +434 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-load-string-with-512B-values-pipeline-10.yml +37 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-load-string-with-512B-values.yml +37 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-get-with-1KiB-values-400_conns.yml +45 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-get-with-1KiB-values-40_conns.yml +45 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-get-with-1KiB-values-pipeline-10-2000_conns.yml +46 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-get-with-1KiB-values-pipeline-10-400_conns.yml +46 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-get-with-1KiB-values-pipeline-10-40_conns.yml +46 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-mixed-20-80-with-512B-values-400_conns.yml +45 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-mixed-20-80-with-512B-values-pipeline-10-2000_conns.yml +46 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-mixed-20-80-with-512B-values-pipeline-10-400_conns.yml +46 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-mixed-20-80-with-512B-values-pipeline-10-5200_conns.yml +46 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-mixed-50-50-with-512B-values-with-expiration-pipeline-10-400_conns.yml +43 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-connection-hello-pipeline-10.yml +32 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-connection-hello.yml +32 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-multiple-hll-pfcount-100B-values.yml +34 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-multiple-hll-pfmerge-100B-values.yml +34 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-nokeys-connection-ping-pipeline-10.yml +29 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-nokeys-pubsub-mixed-100-channels-128B-100-publishers-100-subscribers.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-nokeys-pubsub-mixed-100-channels-128B-100-publishers-1000-subscribers.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-nokeys-pubsub-mixed-100-channels-128B-100-publishers-5000-subscribers.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-nokeys-pubsub-mixed-100-channels-128B-100-publishers-50K-subscribers-5k-conns.yml +40 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-nokeys-pubsub-publish-1K-channels-10B-no-subscribers.yml +30 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-nokeys-server-time-pipeline-10.yml +29 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-leaderboard-top-10.yml +68 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-leaderboard-top-100.yml +69 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-leaderboard-top-1000.yml +68 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-rate-limiting-lua-100k-sessions.yml +64 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-realtime-analytics-membership-pipeline-10.yml +56 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-realtime-analytics-membership.yml +56 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-session-caching-hash-100k-sessions.yml +108 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-session-caching-json-100k-sessions.yml +109 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-session-caching-string-100k-sessions.yml +98 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-session-storage-100k-sessions.yml +205 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-session-storage-1k-sessions.yml +205 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-stream-10M-entries-xread-count-100.yml +36 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-stream-10M-entries-xreadgroup-count-100-noack.yml +38 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-stream-10M-entries-xreadgroup-count-100.yml +38 -0
- redis_benchmarks_specification/test-suites/memtier_benchmark-stream-concurrent-xadd-xreadgroup-70-30.yml +50 -0
- redis_benchmarks_specification/test-suites/template.txt +18 -0
- redis_benchmarks_specification/vector-search-test-suites/vector_db_benchmark_test.yml +41 -0
- redis_benchmarks_specification-0.2.42.dist-info/LICENSE +201 -0
- redis_benchmarks_specification-0.2.42.dist-info/METADATA +434 -0
- redis_benchmarks_specification-0.2.42.dist-info/RECORD +336 -0
- redis_benchmarks_specification-0.2.42.dist-info/WHEEL +4 -0
- redis_benchmarks_specification-0.2.42.dist-info/entry_points.txt +10 -0
|
@@ -0,0 +1,535 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Remote profiling utilities for Redis benchmark runner.
|
|
3
|
+
|
|
4
|
+
This module provides functionality to trigger remote profiling of Redis processes
|
|
5
|
+
via HTTP GET endpoints during benchmark execution. Profiles are collected in
|
|
6
|
+
pprof binary format for performance analysis.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import datetime
|
|
10
|
+
import logging
|
|
11
|
+
import os
|
|
12
|
+
import threading
|
|
13
|
+
import time
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Optional, Dict, Any
|
|
16
|
+
import requests
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def extract_redis_pid(redis_conn) -> Optional[int]:
|
|
20
|
+
"""
|
|
21
|
+
Extract Redis process ID from Redis INFO command.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
redis_conn: Redis connection object
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
Redis process ID as integer, or None if not found
|
|
28
|
+
"""
|
|
29
|
+
try:
|
|
30
|
+
redis_info = redis_conn.info()
|
|
31
|
+
pid = redis_info.get("process_id")
|
|
32
|
+
if pid is not None:
|
|
33
|
+
logging.info(f"Extracted Redis PID: {pid}")
|
|
34
|
+
return int(pid)
|
|
35
|
+
else:
|
|
36
|
+
logging.warning("Redis process_id not found in INFO command")
|
|
37
|
+
return None
|
|
38
|
+
except Exception as e:
|
|
39
|
+
logging.error(f"Failed to extract Redis PID: {e}")
|
|
40
|
+
return None
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def extract_redis_metadata(redis_conn) -> Dict[str, Any]:
|
|
44
|
+
"""
|
|
45
|
+
Extract Redis metadata for profile comments.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
redis_conn: Redis connection object
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
Dictionary containing Redis metadata
|
|
52
|
+
"""
|
|
53
|
+
try:
|
|
54
|
+
redis_info = redis_conn.info()
|
|
55
|
+
metadata = {
|
|
56
|
+
"redis_version": redis_info.get("redis_version", "unknown"),
|
|
57
|
+
"redis_git_sha1": redis_info.get("redis_git_sha1", "unknown"),
|
|
58
|
+
"redis_git_dirty": redis_info.get("redis_git_dirty", "unknown"),
|
|
59
|
+
"redis_build_id": redis_info.get("redis_build_id", "unknown"),
|
|
60
|
+
"process_id": redis_info.get("process_id", "unknown"),
|
|
61
|
+
"tcp_port": redis_info.get("tcp_port", "unknown"),
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
# Use build_id if git_sha1 is empty or 0
|
|
65
|
+
if metadata["redis_git_sha1"] in ("", 0, "0"):
|
|
66
|
+
metadata["redis_git_sha1"] = metadata["redis_build_id"]
|
|
67
|
+
|
|
68
|
+
logging.info(
|
|
69
|
+
f"Extracted Redis metadata: version={metadata['redis_version']}, sha={metadata['redis_git_sha1']}, pid={metadata['process_id']}"
|
|
70
|
+
)
|
|
71
|
+
return metadata
|
|
72
|
+
except Exception as e:
|
|
73
|
+
logging.error(f"Failed to extract Redis metadata: {e}")
|
|
74
|
+
return {
|
|
75
|
+
"redis_version": "unknown",
|
|
76
|
+
"redis_git_sha1": "unknown",
|
|
77
|
+
"redis_git_dirty": "unknown",
|
|
78
|
+
"redis_build_id": "unknown",
|
|
79
|
+
"process_id": "unknown",
|
|
80
|
+
"tcp_port": "unknown",
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def extract_server_info_for_args(redis_conn) -> Dict[str, str]:
|
|
85
|
+
"""
|
|
86
|
+
Extract server information from Redis INFO SERVER to auto-detect
|
|
87
|
+
github_org, github_repo, github_version, and github_hash when not explicitly provided.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
redis_conn: Redis connection object
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
Dictionary containing detected server information:
|
|
94
|
+
- github_org: Detected organization (e.g., 'redis', 'valkey-io')
|
|
95
|
+
- github_repo: Detected repository (e.g., 'redis', 'valkey')
|
|
96
|
+
- github_version: Detected version
|
|
97
|
+
- github_hash: Detected git hash from redis_git_sha1
|
|
98
|
+
- server_name: Server name from INFO
|
|
99
|
+
"""
|
|
100
|
+
try:
|
|
101
|
+
server_info = redis_conn.info("server")
|
|
102
|
+
|
|
103
|
+
# Extract server name and version info
|
|
104
|
+
server_name = server_info.get("server_name", "").lower()
|
|
105
|
+
redis_version = server_info.get("redis_version", "unknown")
|
|
106
|
+
|
|
107
|
+
# Extract git hash info
|
|
108
|
+
redis_git_sha1 = server_info.get("redis_git_sha1", "")
|
|
109
|
+
redis_build_id = server_info.get("redis_build_id", "")
|
|
110
|
+
github_hash = "unknown"
|
|
111
|
+
|
|
112
|
+
# Use git_sha1 if available and not empty/zero
|
|
113
|
+
if redis_git_sha1 and redis_git_sha1 not in ("", "0", "00000000"):
|
|
114
|
+
github_hash = redis_git_sha1
|
|
115
|
+
# Fallback to build_id if git_sha1 is not available
|
|
116
|
+
elif redis_build_id and redis_build_id not in ("", "0"):
|
|
117
|
+
github_hash = redis_build_id
|
|
118
|
+
|
|
119
|
+
# Default values
|
|
120
|
+
github_org = "redis"
|
|
121
|
+
github_repo = "redis"
|
|
122
|
+
github_version = redis_version
|
|
123
|
+
|
|
124
|
+
# Check for Valkey
|
|
125
|
+
if "valkey" in server_name:
|
|
126
|
+
github_org = "valkey-io"
|
|
127
|
+
github_repo = "valkey"
|
|
128
|
+
# Use valkey_version if available, fallback to redis_version
|
|
129
|
+
valkey_version = server_info.get("valkey_version")
|
|
130
|
+
if valkey_version:
|
|
131
|
+
github_version = valkey_version
|
|
132
|
+
|
|
133
|
+
logging.info(
|
|
134
|
+
f"Auto-detected server info: org={github_org}, repo={github_repo}, "
|
|
135
|
+
f"version={github_version}, hash={github_hash}, server_name={server_name}"
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
return {
|
|
139
|
+
"github_org": github_org,
|
|
140
|
+
"github_repo": github_repo,
|
|
141
|
+
"github_version": github_version,
|
|
142
|
+
"github_hash": github_hash,
|
|
143
|
+
"server_name": server_name,
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
except Exception as e:
|
|
147
|
+
logging.error(f"Failed to extract server info: {e}")
|
|
148
|
+
return {
|
|
149
|
+
"github_org": "redis",
|
|
150
|
+
"github_repo": "redis",
|
|
151
|
+
"github_version": "unknown",
|
|
152
|
+
"github_hash": "unknown",
|
|
153
|
+
"server_name": "unknown",
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def extract_server_metadata_for_timeseries(redis_conn) -> Dict[str, str]:
|
|
158
|
+
"""
|
|
159
|
+
Extract comprehensive server metadata from Redis INFO SERVER for use as
|
|
160
|
+
timeseries metadata tags.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
redis_conn: Redis connection object
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
Dictionary containing server metadata for timeseries tags:
|
|
167
|
+
- os: Operating system information
|
|
168
|
+
- arch_bits: Architecture bits (32/64)
|
|
169
|
+
- gcc_version: GCC compiler version
|
|
170
|
+
- server_mode: Server mode (standalone/cluster/sentinel)
|
|
171
|
+
- multiplexing_api: Multiplexing API used (epoll/kqueue/etc)
|
|
172
|
+
- atomicvar_api: Atomic variable API
|
|
173
|
+
- redis_build_id: Build ID
|
|
174
|
+
- redis_git_dirty: Git dirty flag
|
|
175
|
+
- process_supervised: Process supervision status
|
|
176
|
+
- availability_zone: Availability zone (if available)
|
|
177
|
+
- And other interesting metadata fields
|
|
178
|
+
"""
|
|
179
|
+
try:
|
|
180
|
+
server_info = redis_conn.info("server")
|
|
181
|
+
|
|
182
|
+
# Extract interesting metadata fields for timeseries tags
|
|
183
|
+
metadata = {}
|
|
184
|
+
|
|
185
|
+
# Core system information
|
|
186
|
+
if "os" in server_info:
|
|
187
|
+
metadata["os"] = str(server_info["os"])
|
|
188
|
+
if "arch_bits" in server_info:
|
|
189
|
+
metadata["arch_bits"] = str(server_info["arch_bits"])
|
|
190
|
+
if "gcc_version" in server_info:
|
|
191
|
+
metadata["gcc_version"] = str(server_info["gcc_version"])
|
|
192
|
+
|
|
193
|
+
# Server configuration
|
|
194
|
+
if "server_mode" in server_info:
|
|
195
|
+
metadata["server_mode"] = str(server_info["server_mode"])
|
|
196
|
+
elif "redis_mode" in server_info: # Fallback for older versions
|
|
197
|
+
metadata["server_mode"] = str(server_info["redis_mode"])
|
|
198
|
+
|
|
199
|
+
# Performance-related APIs
|
|
200
|
+
if "multiplexing_api" in server_info:
|
|
201
|
+
metadata["multiplexing_api"] = str(server_info["multiplexing_api"])
|
|
202
|
+
if "atomicvar_api" in server_info:
|
|
203
|
+
metadata["atomicvar_api"] = str(server_info["atomicvar_api"])
|
|
204
|
+
if "monotonic_clock" in server_info:
|
|
205
|
+
metadata["monotonic_clock"] = str(server_info["monotonic_clock"])
|
|
206
|
+
|
|
207
|
+
# Build information
|
|
208
|
+
if "redis_build_id" in server_info:
|
|
209
|
+
metadata["redis_build_id"] = str(server_info["redis_build_id"])
|
|
210
|
+
if "redis_git_dirty" in server_info:
|
|
211
|
+
metadata["redis_git_dirty"] = str(server_info["redis_git_dirty"])
|
|
212
|
+
|
|
213
|
+
# Process information
|
|
214
|
+
if "process_supervised" in server_info:
|
|
215
|
+
metadata["process_supervised"] = str(server_info["process_supervised"])
|
|
216
|
+
|
|
217
|
+
# Cloud/deployment information
|
|
218
|
+
if "availability_zone" in server_info and server_info["availability_zone"]:
|
|
219
|
+
metadata["availability_zone"] = str(server_info["availability_zone"])
|
|
220
|
+
|
|
221
|
+
# IO threads (performance relevant)
|
|
222
|
+
if "io_threads_active" in server_info:
|
|
223
|
+
metadata["io_threads_active"] = str(server_info["io_threads_active"])
|
|
224
|
+
|
|
225
|
+
# Server name and version info
|
|
226
|
+
if "server_name" in server_info and server_info["server_name"]:
|
|
227
|
+
metadata["server_name"] = str(server_info["server_name"])
|
|
228
|
+
if "redis_version" in server_info:
|
|
229
|
+
metadata["redis_version"] = str(server_info["redis_version"])
|
|
230
|
+
if "valkey_version" in server_info:
|
|
231
|
+
metadata["valkey_version"] = str(server_info["valkey_version"])
|
|
232
|
+
if "valkey_release_stage" in server_info:
|
|
233
|
+
metadata["valkey_release_stage"] = str(server_info["valkey_release_stage"])
|
|
234
|
+
|
|
235
|
+
# Configuration file info
|
|
236
|
+
if "config_file" in server_info and server_info["config_file"]:
|
|
237
|
+
metadata["config_file"] = str(server_info["config_file"])
|
|
238
|
+
else:
|
|
239
|
+
metadata["config_file"] = "none"
|
|
240
|
+
|
|
241
|
+
logging.info(
|
|
242
|
+
f"Extracted {len(metadata)} server metadata fields for timeseries: {list(metadata.keys())}"
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
return metadata
|
|
246
|
+
|
|
247
|
+
except Exception as e:
|
|
248
|
+
logging.error(f"Failed to extract server metadata: {e}")
|
|
249
|
+
return {}
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def calculate_profile_duration(benchmark_duration_seconds: int) -> int:
|
|
253
|
+
"""
|
|
254
|
+
Calculate profiling duration based on benchmark duration.
|
|
255
|
+
|
|
256
|
+
Args:
|
|
257
|
+
benchmark_duration_seconds: Expected benchmark duration in seconds
|
|
258
|
+
|
|
259
|
+
Returns:
|
|
260
|
+
Profiling duration in seconds (minimum: benchmark duration, maximum: 30)
|
|
261
|
+
"""
|
|
262
|
+
# Minimum duration is the benchmark duration, maximum is 30 seconds
|
|
263
|
+
duration = min(max(benchmark_duration_seconds, 10), 30)
|
|
264
|
+
logging.info(
|
|
265
|
+
f"Calculated profile duration: {duration}s (benchmark: {benchmark_duration_seconds}s)"
|
|
266
|
+
)
|
|
267
|
+
return duration
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def trigger_remote_profile(
|
|
271
|
+
host: str,
|
|
272
|
+
port: int,
|
|
273
|
+
pid: int,
|
|
274
|
+
duration: int,
|
|
275
|
+
timeout: int = 60,
|
|
276
|
+
username: Optional[str] = None,
|
|
277
|
+
password: Optional[str] = None,
|
|
278
|
+
) -> Optional[bytes]:
|
|
279
|
+
"""
|
|
280
|
+
Trigger remote profiling via HTTP GET request using pprof endpoint.
|
|
281
|
+
|
|
282
|
+
Args:
|
|
283
|
+
host: Remote host address
|
|
284
|
+
port: Remote port number
|
|
285
|
+
pid: Redis process ID
|
|
286
|
+
duration: Profiling duration in seconds
|
|
287
|
+
timeout: HTTP request timeout in seconds
|
|
288
|
+
username: Optional username for HTTP basic authentication
|
|
289
|
+
password: Optional password for HTTP basic authentication
|
|
290
|
+
|
|
291
|
+
Returns:
|
|
292
|
+
Profile content in pprof binary format, or None if failed
|
|
293
|
+
"""
|
|
294
|
+
url = f"http://{host}:{port}/debug/pprof/profile"
|
|
295
|
+
params = {"pid": pid, "seconds": duration}
|
|
296
|
+
|
|
297
|
+
# Prepare authentication if provided
|
|
298
|
+
auth = None
|
|
299
|
+
if username is not None and password is not None:
|
|
300
|
+
auth = (username, password)
|
|
301
|
+
logging.info(f"Using HTTP basic authentication with username: {username}")
|
|
302
|
+
|
|
303
|
+
try:
|
|
304
|
+
logging.info(
|
|
305
|
+
f"Triggering remote profile: {url} with PID={pid}, duration={duration}s"
|
|
306
|
+
)
|
|
307
|
+
response = requests.get(url, params=params, timeout=timeout, auth=auth)
|
|
308
|
+
response.raise_for_status()
|
|
309
|
+
|
|
310
|
+
profile_content = response.content
|
|
311
|
+
logging.info(f"Successfully collected profile: {len(profile_content)} bytes")
|
|
312
|
+
return profile_content
|
|
313
|
+
|
|
314
|
+
except requests.exceptions.Timeout:
|
|
315
|
+
logging.error(f"Remote profiling request timed out after {timeout}s")
|
|
316
|
+
return None
|
|
317
|
+
except requests.exceptions.ConnectionError:
|
|
318
|
+
logging.error(f"Failed to connect to remote profiling endpoint: {host}:{port}")
|
|
319
|
+
return None
|
|
320
|
+
except requests.exceptions.HTTPError as e:
|
|
321
|
+
logging.error(f"HTTP error during remote profiling: {e}")
|
|
322
|
+
if e.response.status_code == 401:
|
|
323
|
+
logging.error("Authentication failed - check username and password")
|
|
324
|
+
return None
|
|
325
|
+
except Exception as e:
|
|
326
|
+
logging.error(f"Unexpected error during remote profiling: {e}")
|
|
327
|
+
return None
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
def save_profile_with_metadata(
|
|
331
|
+
profile_content: bytes,
|
|
332
|
+
benchmark_name: str,
|
|
333
|
+
output_dir: str,
|
|
334
|
+
redis_metadata: Dict[str, Any],
|
|
335
|
+
duration: int,
|
|
336
|
+
) -> Optional[str]:
|
|
337
|
+
"""
|
|
338
|
+
Save profile content to file in pprof binary format.
|
|
339
|
+
|
|
340
|
+
Args:
|
|
341
|
+
profile_content: Profile data in pprof binary format
|
|
342
|
+
benchmark_name: Name of the benchmark
|
|
343
|
+
output_dir: Output directory path
|
|
344
|
+
redis_metadata: Redis metadata dictionary
|
|
345
|
+
duration: Profiling duration in seconds
|
|
346
|
+
|
|
347
|
+
Returns:
|
|
348
|
+
Path to saved file, or None if failed
|
|
349
|
+
"""
|
|
350
|
+
try:
|
|
351
|
+
# Create output directory if it doesn't exist
|
|
352
|
+
Path(output_dir).mkdir(parents=True, exist_ok=True)
|
|
353
|
+
|
|
354
|
+
# Generate filename with .pb.gz extension
|
|
355
|
+
filename = f"{benchmark_name}.pb.gz"
|
|
356
|
+
filepath = os.path.join(output_dir, filename)
|
|
357
|
+
|
|
358
|
+
# Generate timestamp
|
|
359
|
+
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
360
|
+
|
|
361
|
+
# Write binary profile content directly
|
|
362
|
+
with open(filepath, "wb") as f:
|
|
363
|
+
f.write(profile_content)
|
|
364
|
+
|
|
365
|
+
# Create a separate metadata file
|
|
366
|
+
metadata_filename = f"{benchmark_name}.metadata.txt"
|
|
367
|
+
metadata_filepath = os.path.join(output_dir, metadata_filename)
|
|
368
|
+
|
|
369
|
+
metadata_content = (
|
|
370
|
+
f"Profile from redis sha = {redis_metadata['redis_git_sha1']} "
|
|
371
|
+
f"and pid {redis_metadata['process_id']} for duration of {duration}s. "
|
|
372
|
+
f"Collection date: {timestamp}\n"
|
|
373
|
+
f"benchmark_name={benchmark_name}\n"
|
|
374
|
+
f"redis_git_sha1={redis_metadata['redis_git_sha1']}\n"
|
|
375
|
+
f"redis_version={redis_metadata['redis_version']}\n"
|
|
376
|
+
f"redis_git_dirty={redis_metadata['redis_git_dirty']}\n"
|
|
377
|
+
f"redis_build_id={redis_metadata['redis_build_id']}\n"
|
|
378
|
+
f"process_id={redis_metadata['process_id']}\n"
|
|
379
|
+
f"tcp_port={redis_metadata['tcp_port']}\n"
|
|
380
|
+
f"duration_seconds={duration}\n"
|
|
381
|
+
)
|
|
382
|
+
|
|
383
|
+
with open(metadata_filepath, "w") as f:
|
|
384
|
+
f.write(metadata_content)
|
|
385
|
+
|
|
386
|
+
logging.info(f"Saved profile to: {filepath}")
|
|
387
|
+
logging.info(f"Saved metadata to: {metadata_filepath}")
|
|
388
|
+
return filepath
|
|
389
|
+
|
|
390
|
+
except Exception as e:
|
|
391
|
+
logging.error(f"Failed to save profile file: {e}")
|
|
392
|
+
return None
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
class RemoteProfiler:
|
|
396
|
+
"""
|
|
397
|
+
Remote profiler class to handle threaded profiling execution.
|
|
398
|
+
"""
|
|
399
|
+
|
|
400
|
+
def __init__(
|
|
401
|
+
self,
|
|
402
|
+
host: str,
|
|
403
|
+
port: int,
|
|
404
|
+
output_dir: str,
|
|
405
|
+
username: Optional[str] = None,
|
|
406
|
+
password: Optional[str] = None,
|
|
407
|
+
):
|
|
408
|
+
self.host = host
|
|
409
|
+
self.port = port
|
|
410
|
+
self.output_dir = output_dir
|
|
411
|
+
self.username = username
|
|
412
|
+
self.password = password
|
|
413
|
+
self.profile_thread = None
|
|
414
|
+
self.profile_result = None
|
|
415
|
+
self.profile_error = None
|
|
416
|
+
|
|
417
|
+
def start_profiling(
|
|
418
|
+
self, redis_conn, benchmark_name: str, benchmark_duration_seconds: int
|
|
419
|
+
) -> bool:
|
|
420
|
+
"""
|
|
421
|
+
Start profiling in a separate thread.
|
|
422
|
+
|
|
423
|
+
Args:
|
|
424
|
+
redis_conn: Redis connection object
|
|
425
|
+
benchmark_name: Name of the benchmark
|
|
426
|
+
benchmark_duration_seconds: Expected benchmark duration
|
|
427
|
+
|
|
428
|
+
Returns:
|
|
429
|
+
True if profiling thread started successfully, False otherwise
|
|
430
|
+
"""
|
|
431
|
+
try:
|
|
432
|
+
# Extract Redis metadata and PID
|
|
433
|
+
redis_metadata = extract_redis_metadata(redis_conn)
|
|
434
|
+
pid = redis_metadata.get("process_id")
|
|
435
|
+
|
|
436
|
+
if pid == "unknown" or pid is None:
|
|
437
|
+
logging.error("Cannot start remote profiling: Redis PID not available")
|
|
438
|
+
return False
|
|
439
|
+
|
|
440
|
+
# Calculate profiling duration
|
|
441
|
+
duration = calculate_profile_duration(benchmark_duration_seconds)
|
|
442
|
+
|
|
443
|
+
# Start profiling thread
|
|
444
|
+
self.profile_thread = threading.Thread(
|
|
445
|
+
target=self._profile_worker,
|
|
446
|
+
args=(pid, duration, benchmark_name, redis_metadata),
|
|
447
|
+
daemon=True,
|
|
448
|
+
)
|
|
449
|
+
self.profile_thread.start()
|
|
450
|
+
|
|
451
|
+
logging.info(
|
|
452
|
+
f"Started remote profiling thread for benchmark: {benchmark_name}"
|
|
453
|
+
)
|
|
454
|
+
return True
|
|
455
|
+
|
|
456
|
+
except Exception as e:
|
|
457
|
+
logging.error(f"Failed to start remote profiling: {e}")
|
|
458
|
+
return False
|
|
459
|
+
|
|
460
|
+
def _profile_worker(
|
|
461
|
+
self,
|
|
462
|
+
pid: int,
|
|
463
|
+
duration: int,
|
|
464
|
+
benchmark_name: str,
|
|
465
|
+
redis_metadata: Dict[str, Any],
|
|
466
|
+
):
|
|
467
|
+
"""
|
|
468
|
+
Worker function for profiling thread.
|
|
469
|
+
"""
|
|
470
|
+
try:
|
|
471
|
+
# Trigger remote profiling
|
|
472
|
+
profile_content = trigger_remote_profile(
|
|
473
|
+
self.host,
|
|
474
|
+
self.port,
|
|
475
|
+
pid,
|
|
476
|
+
duration,
|
|
477
|
+
username=self.username,
|
|
478
|
+
password=self.password,
|
|
479
|
+
)
|
|
480
|
+
|
|
481
|
+
if profile_content is not None:
|
|
482
|
+
# Save profile with metadata
|
|
483
|
+
filepath = save_profile_with_metadata(
|
|
484
|
+
profile_content,
|
|
485
|
+
benchmark_name,
|
|
486
|
+
self.output_dir,
|
|
487
|
+
redis_metadata,
|
|
488
|
+
duration,
|
|
489
|
+
)
|
|
490
|
+
self.profile_result = filepath
|
|
491
|
+
else:
|
|
492
|
+
self.profile_error = "Failed to collect profile content"
|
|
493
|
+
|
|
494
|
+
except Exception as e:
|
|
495
|
+
self.profile_error = f"Profile worker error: {e}"
|
|
496
|
+
logging.error(self.profile_error)
|
|
497
|
+
|
|
498
|
+
def wait_for_completion(self, timeout: int = 60) -> bool:
|
|
499
|
+
"""
|
|
500
|
+
Wait for profiling thread to complete.
|
|
501
|
+
|
|
502
|
+
Args:
|
|
503
|
+
timeout: Maximum time to wait in seconds
|
|
504
|
+
|
|
505
|
+
Returns:
|
|
506
|
+
True if completed successfully, False if timed out or failed
|
|
507
|
+
"""
|
|
508
|
+
if self.profile_thread is None:
|
|
509
|
+
return False
|
|
510
|
+
|
|
511
|
+
try:
|
|
512
|
+
self.profile_thread.join(timeout=timeout)
|
|
513
|
+
|
|
514
|
+
if self.profile_thread.is_alive():
|
|
515
|
+
logging.warning(
|
|
516
|
+
f"Remote profiling thread did not complete within {timeout}s"
|
|
517
|
+
)
|
|
518
|
+
return False
|
|
519
|
+
|
|
520
|
+
if self.profile_error:
|
|
521
|
+
logging.error(f"Remote profiling failed: {self.profile_error}")
|
|
522
|
+
return False
|
|
523
|
+
|
|
524
|
+
if self.profile_result:
|
|
525
|
+
logging.info(
|
|
526
|
+
f"Remote profiling completed successfully: {self.profile_result}"
|
|
527
|
+
)
|
|
528
|
+
return True
|
|
529
|
+
else:
|
|
530
|
+
logging.warning("Remote profiling completed but no result available")
|
|
531
|
+
return False
|
|
532
|
+
|
|
533
|
+
except Exception as e:
|
|
534
|
+
logging.error(f"Error waiting for remote profiling completion: {e}")
|
|
535
|
+
return False
|