service-capacity-modeling 0.3.54__tar.gz → 0.3.56__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.54 → service_capacity_modeling-0.3.56}/PKG-INFO +1 -1
  2. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/cassandra.py +18 -7
  3. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/kafka.py +11 -7
  4. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling.egg-info/PKG-INFO +1 -1
  5. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/LICENSE +0 -0
  6. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/README.md +0 -0
  7. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/__init__.py +0 -0
  8. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/capacity_planner.py +0 -0
  9. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/__init__.py +0 -0
  10. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/__init__.py +0 -0
  11. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_ec2.json +0 -0
  12. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/pricing/aws/3yr-reserved_zz-overrides.json +0 -0
  13. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/profiles.txt +0 -0
  14. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5.json +0 -0
  15. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5a.json +0 -0
  16. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5d.json +0 -0
  17. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c5n.json +0 -0
  18. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c6a.json +0 -0
  19. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c6i.json +0 -0
  20. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c6id.json +0 -0
  21. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c7a.json +0 -0
  22. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_c7i.json +0 -0
  23. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m4.json +0 -0
  24. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m5.json +0 -0
  25. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m5n.json +0 -0
  26. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6a.json +0 -0
  27. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6i.json +0 -0
  28. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6id.json +0 -0
  29. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6idn.json +0 -0
  30. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m6in.json +0 -0
  31. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m7a.json +0 -0
  32. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_m7i.json +0 -0
  33. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r4.json +0 -0
  34. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r5.json +0 -0
  35. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r5n.json +0 -0
  36. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6a.json +0 -0
  37. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6i.json +0 -0
  38. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6id.json +0 -0
  39. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6idn.json +0 -0
  40. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r6in.json +0 -0
  41. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r7a.json +0 -0
  42. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/auto_r7i.json +0 -0
  43. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/manual_drives.json +0 -0
  44. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/manual_instances.json +0 -0
  45. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/hardware/profiles/shapes/aws/manual_services.json +0 -0
  46. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/interface.py +0 -0
  47. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/__init__.py +0 -0
  48. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/common.py +0 -0
  49. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/headroom_strategy.py +0 -0
  50. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/__init__.py +0 -0
  51. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/__init__.py +0 -0
  52. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/aurora.py +0 -0
  53. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/counter.py +0 -0
  54. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/crdb.py +0 -0
  55. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/ddb.py +0 -0
  56. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/elasticsearch.py +0 -0
  57. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/entity.py +0 -0
  58. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/evcache.py +0 -0
  59. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/graphkv.py +0 -0
  60. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/iso_date_math.py +0 -0
  61. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/key_value.py +0 -0
  62. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/postgres.py +0 -0
  63. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/rds.py +0 -0
  64. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/stateless_java.py +0 -0
  65. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/time_series.py +0 -0
  66. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/time_series_config.py +0 -0
  67. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/wal.py +0 -0
  68. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/org/netflix/zookeeper.py +0 -0
  69. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/models/utils.py +0 -0
  70. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/stats.py +0 -0
  71. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/tools/__init__.py +0 -0
  72. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/tools/auto_shape.py +0 -0
  73. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/tools/fetch_pricing.py +0 -0
  74. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/tools/generate_missing.py +0 -0
  75. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling/tools/instance_families.py +0 -0
  76. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling.egg-info/SOURCES.txt +0 -0
  77. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling.egg-info/dependency_links.txt +0 -0
  78. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling.egg-info/entry_points.txt +0 -0
  79. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling.egg-info/requires.txt +0 -0
  80. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/service_capacity_modeling.egg-info/top_level.txt +0 -0
  81. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/setup.cfg +0 -0
  82. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/setup.py +0 -0
  83. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/tests/test_arguments.py +0 -0
  84. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/tests/test_buffers.py +0 -0
  85. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/tests/test_common.py +0 -0
  86. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/tests/test_desire_merge.py +0 -0
  87. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/tests/test_generate_scenarios.py +0 -0
  88. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/tests/test_hardware.py +0 -0
  89. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/tests/test_hardware_shapes.py +0 -0
  90. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/tests/test_headroom_strategy.py +0 -0
  91. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/tests/test_io2.py +0 -0
  92. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/tests/test_model_dump.py +0 -0
  93. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/tests/test_reproducible.py +0 -0
  94. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/tests/test_simulation.py +0 -0
  95. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/tests/test_utils.py +0 -0
  96. {service_capacity_modeling-0.3.54 → service_capacity_modeling-0.3.56}/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.54
3
+ Version: 0.3.56
4
4
  Summary: Contains utilities for modeling capacity for pluggable workloads
5
5
  Author: Joseph Lynch
6
6
  Author-email: josephl@netflix.com
@@ -144,6 +144,7 @@ def _estimate_cassandra_requirement( # pylint: disable=too-many-positional-argu
144
144
  disk_buffer = buffer_for_components(
145
145
  buffers=desires.buffers, components=[BufferComponent.disk]
146
146
  )
147
+ memory_preserve = False
147
148
  reference_shape = desires.reference_shape
148
149
  current_capacity = (
149
150
  None
@@ -169,6 +170,9 @@ def _estimate_cassandra_requirement( # pylint: disable=too-many-positional-argu
169
170
  * current_capacity.cluster_instance_count.mid
170
171
  * (disk_scale or 1)
171
172
  )
173
+ _, memory_preserve = derived_buffer_for_component(
174
+ desires.buffers.derived, ["storage", "memory"]
175
+ )
172
176
  else:
173
177
  # If the cluster is not yet provisioned
174
178
  capacity_requirement = _zonal_requirement_for_new_cluster(
@@ -202,13 +206,19 @@ def _estimate_cassandra_requirement( # pylint: disable=too-many-positional-argu
202
206
  )
203
207
  rps_working_set = min(1.0, disk_rps / max_rps_to_disk)
204
208
 
205
- # If disk RPS will be smaller than our target because there are no
206
- # reads, we don't need to hold as much data in memory.
207
- # For c*, we can skip memory buffer and can just keep using the heap and write buffer calc
208
- # Eventually we'll want to phrase those heap, read cache, and write cache as buffers
209
- needed_memory = min(working_set, rps_working_set) * disk_used_gib * zones_per_region
210
- # Now convert to per zone
211
- needed_memory = max(1, int(needed_memory // zones_per_region))
209
+ if memory_preserve:
210
+ needed_memory = capacity_requirement.mem_gib.mid
211
+ else:
212
+ # If disk RPS will be smaller than our target because there are no
213
+ # reads, we don't need to hold as much data in memory.
214
+ # For c*, we can skip memory buffer and can just keep using the heap and write buffer calc
215
+ # Eventually we'll want to phrase those heap, read cache, and write cache as buffers
216
+ needed_memory = (
217
+ min(working_set, rps_working_set) * disk_used_gib * zones_per_region
218
+ )
219
+ # Now convert to per zone
220
+ needed_memory = max(1, int(needed_memory // zones_per_region))
221
+
212
222
  logger.debug(
213
223
  "Need (cpu, mem, disk, working) = (%s, %s, %s, %f)",
214
224
  needed_cores,
@@ -381,6 +391,7 @@ def _estimate_cassandra_cluster_zonal( # pylint: disable=too-many-positional-ar
381
391
  # C* clusters provision in powers of 2 because doubling
382
392
  cluster_size=next_power_of_2,
383
393
  min_count=max(min_count, required_cluster_size or 0),
394
+ # TODO: Take reserve memory calculation into account during buffer calculation
384
395
  # C* heap usage takes away from OS page cache memory
385
396
  reserve_memory=lambda x: base_mem + heap_fn(x),
386
397
  # C* heap buffers the writes at roughly a rate of
@@ -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.54
3
+ Version: 0.3.56
4
4
  Summary: Contains utilities for modeling capacity for pluggable workloads
5
5
  Author: Joseph Lynch
6
6
  Author-email: josephl@netflix.com