From a3ada63fc70a60a7d5f115e24c2153a5f1362cdc Mon Sep 17 00:00:00 2001 From: Akashdeep Goel Date: Mon, 27 May 2024 02:20:47 -0700 Subject: [PATCH] Adds support for disk_io in evcache --- service_capacity_modeling/models/common.py | 17 +++++++++++++++++ .../models/org/netflix/evcache.py | 16 ++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/service_capacity_modeling/models/common.py b/service_capacity_modeling/models/common.py index 5ab5498..e8603a1 100644 --- a/service_capacity_modeling/models/common.py +++ b/service_capacity_modeling/models/common.py @@ -229,7 +229,15 @@ def compute_stateful_zone( # Some stateful clusters have preferences on per zone sizing cluster_size: Callable[[int], int] = lambda x: x, min_count: int = 0, + adjusted_disk_io_needed: Optional[float] = 0.0, + read_write_ratio: Optional[float] = 0.0 ) -> ZoneClusterCapacity: + + + #If only reads, then max burst is X reads/s + #If only writes, then max burst is Y writes/s + + # Normalize the cores of this instance type to the latency reference needed_cores = math.ceil( max(1, needed_cores // (instance.cpu_ghz / core_reference_ghz)) @@ -269,6 +277,15 @@ def compute_stateful_zone( ): disk_per_node = min(max_local_disk_gib, instance.drive.size_gib) count = max(count, math.ceil(needed_disk_gib / disk_per_node)) + if adjusted_disk_io_needed != 0.0: + instance_read_iops = drive.read_io_per_s + instance_write_iops = drive.write_io_per_s + instance_adjusted_io = (read_write_ratio * instance_read_iops + \ + (1.0 - read_write_ratio) * instance_write_iops) * \ + drive.block_size_kib * 1024 + if instance_adjusted_io != 0.0: + count = max(count, math.ceil(adjusted_disk_io_needed / instance_adjusted_io)) + count = max(cluster_size(count), min_count) cost = count * instance.annual_cost diff --git a/service_capacity_modeling/models/org/netflix/evcache.py b/service_capacity_modeling/models/org/netflix/evcache.py index 41b3bbf..b0b6c92 100644 --- a/service_capacity_modeling/models/org/netflix/evcache.py +++ b/service_capacity_modeling/models/org/netflix/evcache.py @@ -232,6 +232,20 @@ def reserve_memory(instance_mem_gib): if desires.service_tier < 1: min_count = 2 + is_disk_io_constraint: bool = requirement.disk_gib > 0.0 + adjusted_disk_io_needed = 0.0 + read_write_ratio = 0.0 + if is_disk_io_constraint: + reads_per_sec = desires.query_pattern.estimated_read_per_second.mid + writes_per_sec = desires.query_pattern.estimated_write_per_second.mid + read_size = desires.query_pattern.estimated_mean_read_size_bytes.mid + write_size = desires.query_pattern.estimated_mean_write_size_bytes.mid + read_disk_io_needed = reads_per_sec * read_size + write_disk_io_needed = writes_per_sec * write_size + adjusted_disk_io_needed = (reads_per_sec * read_disk_io_needed + writes_per_sec * write_disk_io_needed) / \ + (reads_per_sec + writes_per_sec) + read_write_ratio = reads_per_sec / (reads_per_sec + writes_per_sec) + cluster = compute_stateful_zone( instance=instance, drive=drive, @@ -248,6 +262,8 @@ def reserve_memory(instance_mem_gib): # Sidecars and Variable OS Memory reserve_memory=lambda x: base_mem, core_reference_ghz=requirement.core_reference_ghz, + adjusted_disk_io_needed = adjusted_disk_io_needed, + read_write_ratio = read_write_ratio ) # Communicate to the actual provision that if we want reduced RF params = {"evcache.copies": copies_per_region}