service-capacity-modeling 0.3.55__tar.gz → 0.3.57__tar.gz

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.

Potentially problematic release.


This version of service-capacity-modeling might be problematic. Click here for more details.

Files changed (96) hide show
  1. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/PKG-INFO +1 -1
  2. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/cassandra.py +36 -24
  3. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/kafka.py +11 -7
  4. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling.egg-info/PKG-INFO +1 -1
  5. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/LICENSE +0 -0
  6. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/README.md +0 -0
  7. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/__init__.py +0 -0
  8. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/capacity_planner.py +0 -0
  9. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/__init__.py +0 -0
  10. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/__init__.py +0 -0
  11. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_ec2.json +0 -0
  12. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_zz-overrides.json +0 -0
  13. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/profiles.txt +0 -0
  14. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5.json +0 -0
  15. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5a.json +0 -0
  16. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5d.json +0 -0
  17. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5n.json +0 -0
  18. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c6a.json +0 -0
  19. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c6i.json +0 -0
  20. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c6id.json +0 -0
  21. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c7a.json +0 -0
  22. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c7i.json +0 -0
  23. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m4.json +0 -0
  24. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m5.json +0 -0
  25. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m5n.json +0 -0
  26. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6a.json +0 -0
  27. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6i.json +0 -0
  28. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6id.json +0 -0
  29. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6idn.json +0 -0
  30. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6in.json +0 -0
  31. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m7a.json +0 -0
  32. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m7i.json +0 -0
  33. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r4.json +0 -0
  34. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r5.json +0 -0
  35. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r5n.json +0 -0
  36. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6a.json +0 -0
  37. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6i.json +0 -0
  38. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6id.json +0 -0
  39. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6idn.json +0 -0
  40. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6in.json +0 -0
  41. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r7a.json +0 -0
  42. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r7i.json +0 -0
  43. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/manual_drives.json +0 -0
  44. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/manual_instances.json +0 -0
  45. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/hardware/profiles/shapes/aws/manual_services.json +0 -0
  46. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/interface.py +0 -0
  47. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/__init__.py +0 -0
  48. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/common.py +0 -0
  49. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/headroom_strategy.py +0 -0
  50. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/__init__.py +0 -0
  51. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/__init__.py +0 -0
  52. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/aurora.py +0 -0
  53. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/counter.py +0 -0
  54. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/crdb.py +0 -0
  55. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/ddb.py +0 -0
  56. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/elasticsearch.py +0 -0
  57. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/entity.py +0 -0
  58. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/evcache.py +0 -0
  59. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/graphkv.py +0 -0
  60. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/iso_date_math.py +0 -0
  61. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/key_value.py +0 -0
  62. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/postgres.py +0 -0
  63. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/rds.py +0 -0
  64. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/stateless_java.py +0 -0
  65. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/time_series.py +0 -0
  66. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/time_series_config.py +0 -0
  67. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/wal.py +0 -0
  68. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/org/netflix/zookeeper.py +0 -0
  69. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/models/utils.py +0 -0
  70. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/stats.py +0 -0
  71. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/tools/__init__.py +0 -0
  72. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/tools/auto_shape.py +0 -0
  73. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/tools/fetch_pricing.py +0 -0
  74. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/tools/generate_missing.py +0 -0
  75. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling/tools/instance_families.py +0 -0
  76. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling.egg-info/SOURCES.txt +0 -0
  77. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling.egg-info/dependency_links.txt +0 -0
  78. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling.egg-info/entry_points.txt +0 -0
  79. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling.egg-info/requires.txt +0 -0
  80. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/service_capacity_modeling.egg-info/top_level.txt +0 -0
  81. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/setup.cfg +0 -0
  82. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/setup.py +0 -0
  83. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/tests/test_arguments.py +0 -0
  84. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/tests/test_buffers.py +0 -0
  85. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/tests/test_common.py +0 -0
  86. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/tests/test_desire_merge.py +0 -0
  87. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/tests/test_generate_scenarios.py +0 -0
  88. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/tests/test_hardware.py +0 -0
  89. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/tests/test_hardware_shapes.py +0 -0
  90. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/tests/test_headroom_strategy.py +0 -0
  91. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/tests/test_io2.py +0 -0
  92. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/tests/test_model_dump.py +0 -0
  93. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/tests/test_reproducible.py +0 -0
  94. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/tests/test_simulation.py +0 -0
  95. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/tests/test_utils.py +0 -0
  96. {service_capacity_modeling-0.3.55 → service_capacity_modeling-0.3.57}/tests/test_working_set.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: service-capacity-modeling
3
- Version: 0.3.55
3
+ Version: 0.3.57
4
4
  Summary: Contains utilities for modeling capacity for pluggable workloads
5
5
  Author: Joseph Lynch
6
6
  Author-email: josephl@netflix.com
@@ -206,8 +206,34 @@ def _estimate_cassandra_requirement( # pylint: disable=too-many-positional-argu
206
206
  )
207
207
  rps_working_set = min(1.0, disk_rps / max_rps_to_disk)
208
208
 
209
- if memory_preserve:
210
- needed_memory = capacity_requirement.mem_gib.mid
209
+ # Cassandra can defer writes either by buffering in memory or by
210
+ # waiting longer before recompacting (the min-threshold on the
211
+ # L0 compactions or STCS compactions)
212
+ min_threshold = 4
213
+ write_buffer_gib = _write_buffer_gib_zone(
214
+ desires=desires,
215
+ zones_per_region=zones_per_region,
216
+ flushes_before_compaction=min_threshold,
217
+ )
218
+
219
+ while write_buffer_gib > 12 and min_threshold < 16:
220
+ min_threshold *= 2
221
+ write_buffer_gib = _write_buffer_gib_zone(
222
+ desires=desires,
223
+ zones_per_region=zones_per_region,
224
+ flushes_before_compaction=min_threshold,
225
+ )
226
+
227
+ if current_capacity and current_capacity.cluster_instance and memory_preserve:
228
+ # remove base memory and heap from per node ram and then
229
+ # multiply by number of nodes in a zone to compute the zonal requirement.
230
+ reserve_memory = _get_base_memory(desires) + _cass_heap(
231
+ current_capacity.cluster_instance.ram_gib
232
+ )
233
+ needed_memory = (
234
+ current_capacity.cluster_instance.ram_gib - reserve_memory
235
+ ) * current_capacity.cluster_instance_count.mid
236
+ write_buffer_gib = 0
211
237
  else:
212
238
  # If disk RPS will be smaller than our target because there are no
213
239
  # reads, we don't need to hold as much data in memory.
@@ -227,24 +253,6 @@ def _estimate_cassandra_requirement( # pylint: disable=too-many-positional-argu
227
253
  working_set,
228
254
  )
229
255
 
230
- # Cassandra can defer writes either by buffering in memory or by
231
- # waiting longer before recompacting (the min-threshold on the
232
- # L0 compactions or STCS compactions)
233
- min_threshold = 4
234
- write_buffer_gib = _write_buffer_gib_zone(
235
- desires=desires,
236
- zones_per_region=zones_per_region,
237
- flushes_before_compaction=min_threshold,
238
- )
239
-
240
- while write_buffer_gib > 12 and min_threshold < 16:
241
- min_threshold *= 2
242
- write_buffer_gib = _write_buffer_gib_zone(
243
- desires=desires,
244
- zones_per_region=zones_per_region,
245
- flushes_before_compaction=min_threshold,
246
- )
247
-
248
256
  return CapacityRequirement(
249
257
  requirement_type="cassandra-zonal",
250
258
  reference_shape=reference_shape,
@@ -358,10 +366,7 @@ def _estimate_cassandra_cluster_zonal( # pylint: disable=too-many-positional-ar
358
366
  if desires.service_tier <= 1:
359
367
  min_count = 2
360
368
 
361
- base_mem = (
362
- desires.data_shape.reserved_instance_app_mem_gib
363
- + desires.data_shape.reserved_instance_system_mem_gib
364
- )
369
+ base_mem = _get_base_memory(desires)
365
370
 
366
371
  heap_fn = _cass_heap_for_write_buffer(
367
372
  instance=instance,
@@ -484,6 +489,13 @@ def _cass_io_per_read(node_size_gib, sstable_size_mb=160):
484
489
  return 2 * levels
485
490
 
486
491
 
492
+ def _get_base_memory(desires: CapacityDesires):
493
+ return (
494
+ desires.data_shape.reserved_instance_app_mem_gib
495
+ + desires.data_shape.reserved_instance_system_mem_gib
496
+ )
497
+
498
+
487
499
  def _cass_heap_for_write_buffer(
488
500
  instance: Instance,
489
501
  write_buffer_gib: float,
@@ -188,7 +188,8 @@ def _estimate_kafka_requirement( # pylint: disable=too-many-positional-argument
188
188
  ) // zones_per_region
189
189
 
190
190
  logger.debug(
191
- "Need (cpu, mem, disk) = (%s, %s, %s)",
191
+ "Need (instance, cpu, mem, disk) = (%s, %s, %s, %s)",
192
+ instance.name,
192
193
  needed_cores,
193
194
  needed_memory,
194
195
  needed_disk,
@@ -235,7 +236,7 @@ def _kafka_read_io(rps, io_size_kib, size_gib, recovery_seconds: int) -> float:
235
236
  # pylint: disable=too-many-locals
236
237
  # pylint: disable=too-many-return-statements
237
238
  # pylint: disable=too-many-positional-arguments
238
- def _estimate_kafka_cluster_zonal(
239
+ def _estimate_kafka_cluster_zonal( # noqa: C901
239
240
  instance: Instance,
240
241
  drive: Drive,
241
242
  desires: CapacityDesires,
@@ -360,11 +361,14 @@ def _estimate_kafka_cluster_zonal(
360
361
  if required_zone_size is not None:
361
362
  space_gib = max(1, math.ceil(requirement.disk_gib.mid / required_zone_size))
362
363
  ebs_gib = utils.next_n(space_gib, n=100)
363
- max_size = (
364
- max_attached_disk_gib
365
- if max_attached_disk_gib is not None
366
- else drive.max_size_gib / 3
367
- ) # Max allowed disk in `compute_stateful_zone`
364
+
365
+ # Max allowed disk size in `compute_stateful_zone`
366
+ if instance.drive is not None and instance.drive.size_gib > 0:
367
+ max_size = min(max_local_disk_gib, instance.drive.size_gib)
368
+ elif max_attached_disk_gib is not None:
369
+ max_size = max_attached_disk_gib
370
+ else:
371
+ max_size = drive.max_size_gib / 3
368
372
 
369
373
  # Capacity planner only allows ~ 5TB disk (max_size) for gp3 drives
370
374
  # or max_attached_disk_gib if provided.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: service-capacity-modeling
3
- Version: 0.3.55
3
+ Version: 0.3.57
4
4
  Summary: Contains utilities for modeling capacity for pluggable workloads
5
5
  Author: Joseph Lynch
6
6
  Author-email: josephl@netflix.com