Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds support for disk_io in evcache #91

Merged
merged 5 commits into from
Jun 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions service_capacity_modeling/models/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ def compute_stateless_region(


# pylint: disable=too-many-locals
# pylint: disable=too-many-statements
def compute_stateful_zone(
instance: Instance,
drive: Drive,
Expand Down Expand Up @@ -229,6 +230,8 @@ 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: float = 0.0,
read_write_ratio: float = 0.0,
) -> ZoneClusterCapacity:
# Normalize the cores of this instance type to the latency reference
needed_cores = math.ceil(
Expand Down Expand Up @@ -269,6 +272,31 @@ 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:
akashdeepgoel marked this conversation as resolved.
Show resolved Hide resolved
instance_read_iops = (
instance.drive.read_io_per_s
if instance.drive.read_io_per_s is not None
else 0
)
assert isinstance(instance_read_iops, int)
instance_write_iops = (
instance.drive.write_io_per_s
if instance.drive.write_io_per_s is not None
else 0
)
assert isinstance(instance_write_iops, int)
instance_adjusted_io = (
(
read_write_ratio * float(instance_read_iops)
+ (1.0 - read_write_ratio) * float(instance_write_iops)
)
* instance.drive.block_size_kib
* 1024.0
)
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
Expand Down
17 changes: 17 additions & 0 deletions service_capacity_modeling/models/org/netflix/evcache.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,21 @@ def reserve_memory(instance_mem_gib):
if desires.service_tier < 1:
min_count = 2

is_disk_io_constraint: bool = requirement.disk_gib.mid > 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 = read_disk_io_needed + write_disk_io_needed
# Giving headroom for cachewarming and region squeeze
adjusted_disk_io_needed = 1.4 * adjusted_disk_io_needed
read_write_ratio = reads_per_sec / (reads_per_sec + writes_per_sec)

cluster = compute_stateful_zone(
instance=instance,
drive=drive,
Expand All @@ -248,6 +263,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}
Expand Down
Loading