diff --git a/tests/rptest/redpanda_cloud_tests/omb_validation_test.py b/tests/rptest/redpanda_cloud_tests/omb_validation_test.py index 138c23a02bfe4..4b8eafe7822f4 100644 --- a/tests/rptest/redpanda_cloud_tests/omb_validation_test.py +++ b/tests/rptest/redpanda_cloud_tests/omb_validation_test.py @@ -24,6 +24,9 @@ KiB = 1024 MiB = KiB * KiB GiB = KiB * MiB +KB = 10**3 +MB = 10**6 +GB = 10**9 minutes = 60 hours = 60 * minutes @@ -82,6 +85,17 @@ def __init__(self, test_ctx: TestContext, *args, **kwargs): self.rpk = RpkTool(self.redpanda) + self.base_validator = { + OMBSampleConfigurations.E2E_LATENCY_50PCT: + [OMBSampleConfigurations.lte(20)], + OMBSampleConfigurations.E2E_LATENCY_75PCT: + [OMBSampleConfigurations.lte(25)], + OMBSampleConfigurations.E2E_LATENCY_99PCT: + [OMBSampleConfigurations.lte(50)], + OMBSampleConfigurations.E2E_LATENCY_999PCT: + [OMBSampleConfigurations.lte(100)], + } + def _partition_count(self) -> int: tier_config = self.redpanda.advertised_tier_config machine_config = tier_config.machine_type_config @@ -93,6 +107,9 @@ def _producer_count(self, ingress_rate) -> int: def _consumer_count(self, egress_rate) -> int: return max(egress_rate // (4 * MiB), 8) + def _mb_to_mib(self, mb): + return math.floor(0.9537 * mb) + @cluster(num_nodes=12) def test_max_connections(self): tier_config = self.redpanda.advertised_tier_config @@ -140,15 +157,20 @@ def test_max_connections(self): "acks": "all", "linger.ms": 1, "max.in.flight.requests.per.connection": 5, - "batch.size": 131072, }, "consumer_config": { "auto.offset.reset": "earliest", "enable.auto.commit": "false", - "max.partition.fetch.bytes": 131072 }, } + validator = self.base_validator | { + OMBSampleConfigurations.AVG_THROUGHPUT_MBPS: [ + OMBSampleConfigurations.gte( + self._mb_to_mib(producer_rate // (1 * MB))), + ], + } + # ProducerSwarm parameters # @@ -183,13 +205,11 @@ def test_max_connections(self): producer_kwargs[ 'messages_per_second_per_producer'] = messages_per_sec_per_producer - benchmark = OpenMessagingBenchmark( - self._ctx, - self.redpanda, - driver, - (workload, OMBSampleConfigurations.UNIT_TEST_LATENCY_VALIDATOR), - num_workers=OMB_WORKERS, - topology="ensemble") + benchmark = OpenMessagingBenchmark(self._ctx, + self.redpanda, + driver, (workload, validator), + num_workers=OMB_WORKERS, + topology="ensemble") # Create topic for swarm workers after OMB to avoid the reset swarm_topic_name = "swarm_topic" @@ -267,11 +287,18 @@ def test_max_partitions(self): "warmup_duration_minutes": 1, } + validator = self.base_validator | { + OMBSampleConfigurations.AVG_THROUGHPUT_MBPS: [ + OMBSampleConfigurations.gte( + self._mb_to_mib(producer_rate // (1 * MB))), + ], + } + benchmark = OpenMessagingBenchmark( self._ctx, self.redpanda, "ACK_ALL_GROUP_LINGER_1MS_IDEM_MAX_IN_FLIGHT", - (workload, OMBSampleConfigurations.UNIT_TEST_LATENCY_VALIDATOR), + (workload, validator), num_workers=10, topology="ensemble") benchmark.start() @@ -288,6 +315,12 @@ def test_common_workload(self): partitions = self._partition_count() total_producers = self._producer_count(tier_config.ingress_rate) total_consumers = self._consumer_count(tier_config.egress_rate) + validator = self.base_validator | { + OMBSampleConfigurations.AVG_THROUGHPUT_MBPS: [ + OMBSampleConfigurations.gte( + self._mb_to_mib(tier_config.ingress_rate // (1 * MB))), + ], + } workload = { "name": "CommonTestWorkload", @@ -315,22 +348,18 @@ def test_common_workload(self): "acks": "all", "linger.ms": 1, "max.in.flight.requests.per.connection": 5, - "batch.size": 131072, }, "consumer_config": { "auto.offset.reset": "earliest", "enable.auto.commit": "false", - "max.partition.fetch.bytes": 131072 }, } - benchmark = OpenMessagingBenchmark( - self._ctx, - self.redpanda, - driver, - (workload, OMBSampleConfigurations.UNIT_TEST_LATENCY_VALIDATOR), - num_workers=10, - topology="ensemble") + benchmark = OpenMessagingBenchmark(self._ctx, + self.redpanda, + driver, (workload, validator), + num_workers=10, + topology="ensemble") benchmark.start() benchmark_time_min = benchmark.benchmark_time() + 5 benchmark.wait(timeout_sec=benchmark_time_min * 60) @@ -377,12 +406,10 @@ def test_retention(self): "acks": "all", "linger.ms": 1, "max.in.flight.requests.per.connection": 5, - "batch.size": 131072, }, "consumer_config": { "auto.offset.reset": "earliest", "enable.auto.commit": "false", - "max.partition.fetch.bytes": 131072 }, "topic_config": { "retention.bytes": retention_bytes, @@ -391,13 +418,18 @@ def test_retention(self): }, } - benchmark = OpenMessagingBenchmark( - self._ctx, - self.redpanda, - driver, - (workload, OMBSampleConfigurations.UNIT_TEST_LATENCY_VALIDATOR), - num_workers=10, - topology="ensemble") + validator = self.base_validator | { + OMBSampleConfigurations.AVG_THROUGHPUT_MBPS: [ + OMBSampleConfigurations.gte( + self._mb_to_mib(producer_rate // (1 * MB))), + ], + } + + benchmark = OpenMessagingBenchmark(self._ctx, + self.redpanda, + driver, (workload, validator), + num_workers=10, + topology="ensemble") benchmark.start() benchmark_time_min = benchmark.benchmark_time() + 5 benchmark.wait(timeout_sec=benchmark_time_min * 60) diff --git a/tests/rptest/services/redpanda_cloud.py b/tests/rptest/services/redpanda_cloud.py index c4df8d2be7182..3dab8f9ebfde9 100644 --- a/tests/rptest/services/redpanda_cloud.py +++ b/tests/rptest/services/redpanda_cloud.py @@ -65,6 +65,13 @@ class CloudTierName(Enum): GCP_4 = 'tier-4-gcp' GCP_5 = 'tier-5-gcp' + AWS_1_TCO_P5 = 'tco-p5-tier-1-aws' + AWS_2_TCO_P5 = 'tco-p5-tier-2-aws' + AWS_3_TCO_P5 = 'tco-p5-tier-3-aws' + GCP_1_TCO_P5 = 'tco-p5-tier-1-gcp' + GCP_2_TCO_P5 = 'tco-p5-tier-2-gcp' + GCP_3_TCO_P5 = 'tco-p5-tier-3-gcp' + @classmethod def list(cls): return list(map(lambda c: c.value, cls)) @@ -72,11 +79,14 @@ def list(cls): class MachineTypeName(Enum): DOCKER = 'docker' + I3EN_LARGE = 'i3en.large' I3EN_XLARGE = 'i3en.xlarge' I3EN_2XLARGE = 'i3en.2xlarge' I3EN_3XLARGE = 'i3en.3xlarge' N2_STANDARD_4 = 'n2-standard-4' N2_STANDARD_8 = 'n2-standard-8' + N2D_STANDARD_2 = 'n2d-standard-2' + N2D_STANDARD_4 = 'n2d-standard-4' @classmethod def list(cls): @@ -90,11 +100,14 @@ def __init__(self, num_shards: int): MachineTypeConfigs = { MachineTypeName.DOCKER: MachineTypeConfig(num_shards=2), + MachineTypeName.I3EN_LARGE: MachineTypeConfig(num_shards=1), MachineTypeName.I3EN_XLARGE: MachineTypeConfig(num_shards=3), MachineTypeName.I3EN_2XLARGE: MachineTypeConfig(num_shards=7), MachineTypeName.I3EN_3XLARGE: MachineTypeConfig(num_shards=11), MachineTypeName.N2_STANDARD_4: MachineTypeConfig(num_shards=3), MachineTypeName.N2_STANDARD_8: MachineTypeConfig(num_shards=7), + MachineTypeName.N2D_STANDARD_2: MachineTypeConfig(num_shards=1), + MachineTypeName.N2D_STANDARD_4: MachineTypeConfig(num_shards=3), } @@ -138,6 +151,10 @@ def machine_type_config(self) -> MachineTypeConfig: MiB = kiB * kiB GiB = MiB * kiB +KB = 10**3 +MB = 10**6 +GB = 10**9 + # yapf: disable AdvertisedTierConfigs = { # +- ingress_rate @@ -184,6 +201,25 @@ def machine_type_config(self) -> MachineTypeConfig: CloudTierName.DOCKER: AdvertisedTierConfig( 3*MiB, 9*MiB, 3, 128*MiB, 20*GiB, 1, 25, 100, 2*GiB, MachineTypeName.DOCKER, ), + # TCO + CloudTierName.AWS_1_TCO_P5: AdvertisedTierConfig( + 25*MB, 60*MB, 3, 128*MB, 125*GB, 20, 1000, 1500, 16*GiB, MachineTypeName.I3EN_LARGE, + ), + CloudTierName.AWS_2_TCO_P5: AdvertisedTierConfig( + 50*MB, 150*MB, 3, 128*MB, 250*GB, 50, 3000, 3750, 32*GiB, MachineTypeName.I3EN_XLARGE, + ), + CloudTierName.AWS_3_TCO_P5: AdvertisedTierConfig( + 100*MB, 200*MB, 6, 128*MB, 250*GB, 100, 6000, 7500, 32*GiB, MachineTypeName.I3EN_XLARGE, + ), + CloudTierName.GCP_1_TCO_P5: AdvertisedTierConfig( + 25*MB, 60*MB, 3, 128*MB, 125*GB, 20, 1000, 1500, 8*GiB, MachineTypeName.N2D_STANDARD_2, + ), + CloudTierName.GCP_2_TCO_P5: AdvertisedTierConfig( + 50*MB, 150*MB, 3, 128*MB, 250*GB, 50, 2800, 3750, 16*GiB, MachineTypeName.N2D_STANDARD_4, + ), + CloudTierName.GCP_3_TCO_P5: AdvertisedTierConfig( + 100*MB, 200*MB, 6, 128*MB, 250*GB, 100, 5600, 7500, 16*GiB, MachineTypeName.N2D_STANDARD_4, + ), } # yapf: enable