opengris-scaler 1.12.37__cp38-cp38-musllinux_1_2_x86_64.whl
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.
- opengris_scaler-1.12.37.dist-info/METADATA +730 -0
- opengris_scaler-1.12.37.dist-info/RECORD +196 -0
- opengris_scaler-1.12.37.dist-info/WHEEL +5 -0
- opengris_scaler-1.12.37.dist-info/entry_points.txt +10 -0
- opengris_scaler-1.12.37.dist-info/licenses/LICENSE +201 -0
- opengris_scaler-1.12.37.dist-info/licenses/LICENSE.spdx +7 -0
- opengris_scaler-1.12.37.dist-info/licenses/NOTICE +8 -0
- opengris_scaler.libs/libcapnp-1-e88d5415.0.1.so +0 -0
- opengris_scaler.libs/libgcc_s-2298274a.so.1 +0 -0
- opengris_scaler.libs/libkj-1-9bebd8ac.0.1.so +0 -0
- opengris_scaler.libs/libstdc++-08d5c7eb.so.6.0.33 +0 -0
- scaler/__init__.py +14 -0
- scaler/about.py +5 -0
- scaler/client/__init__.py +0 -0
- scaler/client/agent/__init__.py +0 -0
- scaler/client/agent/client_agent.py +218 -0
- scaler/client/agent/disconnect_manager.py +27 -0
- scaler/client/agent/future_manager.py +112 -0
- scaler/client/agent/heartbeat_manager.py +74 -0
- scaler/client/agent/mixins.py +89 -0
- scaler/client/agent/object_manager.py +98 -0
- scaler/client/agent/task_manager.py +64 -0
- scaler/client/client.py +672 -0
- scaler/client/future.py +252 -0
- scaler/client/object_buffer.py +129 -0
- scaler/client/object_reference.py +25 -0
- scaler/client/serializer/__init__.py +0 -0
- scaler/client/serializer/default.py +16 -0
- scaler/client/serializer/mixins.py +38 -0
- scaler/cluster/__init__.py +0 -0
- scaler/cluster/cluster.py +95 -0
- scaler/cluster/combo.py +157 -0
- scaler/cluster/object_storage_server.py +45 -0
- scaler/cluster/scheduler.py +86 -0
- scaler/config/__init__.py +0 -0
- scaler/config/common/__init__.py +0 -0
- scaler/config/common/logging.py +41 -0
- scaler/config/common/web.py +18 -0
- scaler/config/common/worker.py +65 -0
- scaler/config/common/worker_adapter.py +28 -0
- scaler/config/config_class.py +317 -0
- scaler/config/defaults.py +94 -0
- scaler/config/mixins.py +20 -0
- scaler/config/section/__init__.py +0 -0
- scaler/config/section/cluster.py +66 -0
- scaler/config/section/ecs_worker_adapter.py +78 -0
- scaler/config/section/native_worker_adapter.py +30 -0
- scaler/config/section/object_storage_server.py +13 -0
- scaler/config/section/scheduler.py +126 -0
- scaler/config/section/symphony_worker_adapter.py +35 -0
- scaler/config/section/top.py +16 -0
- scaler/config/section/webui.py +16 -0
- scaler/config/types/__init__.py +0 -0
- scaler/config/types/network_backend.py +12 -0
- scaler/config/types/object_storage_server.py +45 -0
- scaler/config/types/worker.py +67 -0
- scaler/config/types/zmq.py +83 -0
- scaler/entry_points/__init__.py +0 -0
- scaler/entry_points/cluster.py +10 -0
- scaler/entry_points/object_storage_server.py +26 -0
- scaler/entry_points/scheduler.py +51 -0
- scaler/entry_points/top.py +272 -0
- scaler/entry_points/webui.py +6 -0
- scaler/entry_points/worker_adapter_ecs.py +22 -0
- scaler/entry_points/worker_adapter_native.py +31 -0
- scaler/entry_points/worker_adapter_symphony.py +26 -0
- scaler/io/__init__.py +0 -0
- scaler/io/async_binder.py +89 -0
- scaler/io/async_connector.py +95 -0
- scaler/io/async_object_storage_connector.py +225 -0
- scaler/io/mixins.py +154 -0
- scaler/io/sync_connector.py +68 -0
- scaler/io/sync_object_storage_connector.py +249 -0
- scaler/io/sync_subscriber.py +83 -0
- scaler/io/utility.py +80 -0
- scaler/io/ymq/__init__.py +0 -0
- scaler/io/ymq/_ymq.pyi +95 -0
- scaler/io/ymq/_ymq.so +0 -0
- scaler/io/ymq/ymq.py +138 -0
- scaler/io/ymq_async_object_storage_connector.py +184 -0
- scaler/io/ymq_sync_object_storage_connector.py +184 -0
- scaler/object_storage/__init__.py +0 -0
- scaler/object_storage/object_storage_server.so +0 -0
- scaler/protocol/__init__.py +0 -0
- scaler/protocol/capnp/__init__.py +0 -0
- scaler/protocol/capnp/_python.py +6 -0
- scaler/protocol/capnp/common.capnp +68 -0
- scaler/protocol/capnp/message.capnp +218 -0
- scaler/protocol/capnp/object_storage.capnp +57 -0
- scaler/protocol/capnp/status.capnp +73 -0
- scaler/protocol/introduction.md +105 -0
- scaler/protocol/python/__init__.py +0 -0
- scaler/protocol/python/common.py +140 -0
- scaler/protocol/python/message.py +751 -0
- scaler/protocol/python/mixins.py +13 -0
- scaler/protocol/python/object_storage.py +118 -0
- scaler/protocol/python/status.py +279 -0
- scaler/protocol/worker.md +228 -0
- scaler/scheduler/__init__.py +0 -0
- scaler/scheduler/allocate_policy/__init__.py +0 -0
- scaler/scheduler/allocate_policy/allocate_policy.py +9 -0
- scaler/scheduler/allocate_policy/capability_allocate_policy.py +280 -0
- scaler/scheduler/allocate_policy/even_load_allocate_policy.py +159 -0
- scaler/scheduler/allocate_policy/mixins.py +55 -0
- scaler/scheduler/controllers/__init__.py +0 -0
- scaler/scheduler/controllers/balance_controller.py +65 -0
- scaler/scheduler/controllers/client_controller.py +131 -0
- scaler/scheduler/controllers/config_controller.py +31 -0
- scaler/scheduler/controllers/graph_controller.py +424 -0
- scaler/scheduler/controllers/information_controller.py +81 -0
- scaler/scheduler/controllers/mixins.py +194 -0
- scaler/scheduler/controllers/object_controller.py +147 -0
- scaler/scheduler/controllers/scaling_policies/__init__.py +0 -0
- scaler/scheduler/controllers/scaling_policies/fixed_elastic.py +145 -0
- scaler/scheduler/controllers/scaling_policies/mixins.py +10 -0
- scaler/scheduler/controllers/scaling_policies/null.py +14 -0
- scaler/scheduler/controllers/scaling_policies/types.py +9 -0
- scaler/scheduler/controllers/scaling_policies/utility.py +20 -0
- scaler/scheduler/controllers/scaling_policies/vanilla.py +95 -0
- scaler/scheduler/controllers/task_controller.py +376 -0
- scaler/scheduler/controllers/worker_controller.py +169 -0
- scaler/scheduler/object_usage/__init__.py +0 -0
- scaler/scheduler/object_usage/object_tracker.py +131 -0
- scaler/scheduler/scheduler.py +251 -0
- scaler/scheduler/task/__init__.py +0 -0
- scaler/scheduler/task/task_state_machine.py +92 -0
- scaler/scheduler/task/task_state_manager.py +61 -0
- scaler/ui/__init__.py +0 -0
- scaler/ui/common/__init__.py +0 -0
- scaler/ui/common/constants.py +9 -0
- scaler/ui/common/live_display.py +147 -0
- scaler/ui/common/memory_window.py +146 -0
- scaler/ui/common/setting_page.py +40 -0
- scaler/ui/common/task_graph.py +840 -0
- scaler/ui/common/task_log.py +111 -0
- scaler/ui/common/utility.py +66 -0
- scaler/ui/common/webui.py +80 -0
- scaler/ui/common/worker_processors.py +104 -0
- scaler/ui/v1.py +76 -0
- scaler/ui/v2.py +102 -0
- scaler/ui/webui.py +21 -0
- scaler/utility/__init__.py +0 -0
- scaler/utility/debug.py +19 -0
- scaler/utility/event_list.py +63 -0
- scaler/utility/event_loop.py +58 -0
- scaler/utility/exceptions.py +42 -0
- scaler/utility/formatter.py +44 -0
- scaler/utility/graph/__init__.py +0 -0
- scaler/utility/graph/optimization.py +27 -0
- scaler/utility/graph/topological_sorter.py +11 -0
- scaler/utility/graph/topological_sorter_graphblas.py +174 -0
- scaler/utility/identifiers.py +107 -0
- scaler/utility/logging/__init__.py +0 -0
- scaler/utility/logging/decorators.py +25 -0
- scaler/utility/logging/scoped_logger.py +33 -0
- scaler/utility/logging/utility.py +183 -0
- scaler/utility/many_to_many_dict.py +123 -0
- scaler/utility/metadata/__init__.py +0 -0
- scaler/utility/metadata/profile_result.py +31 -0
- scaler/utility/metadata/task_flags.py +30 -0
- scaler/utility/mixins.py +13 -0
- scaler/utility/network_util.py +7 -0
- scaler/utility/one_to_many_dict.py +72 -0
- scaler/utility/queues/__init__.py +0 -0
- scaler/utility/queues/async_indexed_queue.py +37 -0
- scaler/utility/queues/async_priority_queue.py +70 -0
- scaler/utility/queues/async_sorted_priority_queue.py +45 -0
- scaler/utility/queues/indexed_queue.py +114 -0
- scaler/utility/serialization.py +9 -0
- scaler/version.txt +1 -0
- scaler/worker/__init__.py +0 -0
- scaler/worker/agent/__init__.py +0 -0
- scaler/worker/agent/heartbeat_manager.py +110 -0
- scaler/worker/agent/mixins.py +137 -0
- scaler/worker/agent/processor/__init__.py +0 -0
- scaler/worker/agent/processor/object_cache.py +107 -0
- scaler/worker/agent/processor/processor.py +285 -0
- scaler/worker/agent/processor/streaming_buffer.py +28 -0
- scaler/worker/agent/processor_holder.py +147 -0
- scaler/worker/agent/processor_manager.py +369 -0
- scaler/worker/agent/profiling_manager.py +109 -0
- scaler/worker/agent/task_manager.py +150 -0
- scaler/worker/agent/timeout_manager.py +19 -0
- scaler/worker/preload.py +84 -0
- scaler/worker/worker.py +265 -0
- scaler/worker_adapter/__init__.py +0 -0
- scaler/worker_adapter/common.py +26 -0
- scaler/worker_adapter/ecs.py +241 -0
- scaler/worker_adapter/native.py +138 -0
- scaler/worker_adapter/symphony/__init__.py +0 -0
- scaler/worker_adapter/symphony/callback.py +45 -0
- scaler/worker_adapter/symphony/heartbeat_manager.py +82 -0
- scaler/worker_adapter/symphony/message.py +24 -0
- scaler/worker_adapter/symphony/task_manager.py +289 -0
- scaler/worker_adapter/symphony/worker.py +204 -0
- scaler/worker_adapter/symphony/worker_adapter.py +123 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
from typing import Any, Dict, Optional
|
|
3
|
+
|
|
4
|
+
from nicegui import ui
|
|
5
|
+
|
|
6
|
+
from scaler.protocol.python.message import StateTask, StateWorker
|
|
7
|
+
from scaler.ui.common.setting_page import Settings
|
|
8
|
+
from scaler.ui.common.utility import format_timediff, get_bounds, make_taskstream_ticks, make_tick_text
|
|
9
|
+
from scaler.utility.formatter import format_bytes
|
|
10
|
+
from scaler.utility.metadata.profile_result import ProfileResult
|
|
11
|
+
|
|
12
|
+
CHART_NAME = "Memory Usage (in bytes)"
|
|
13
|
+
X_AXIS_GRID_LINES = False
|
|
14
|
+
Y_AXIS_GRID_LINES = True
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class MemoryChart:
|
|
18
|
+
def __init__(self):
|
|
19
|
+
self._figure = {}
|
|
20
|
+
self._plot = None
|
|
21
|
+
self._plot_data: Dict[str, Any] = {}
|
|
22
|
+
|
|
23
|
+
self._settings: Optional[Settings] = None
|
|
24
|
+
|
|
25
|
+
self._start_time = datetime.datetime.now() - datetime.timedelta(minutes=30)
|
|
26
|
+
|
|
27
|
+
def setup_memory_chart(self, settings: Settings):
|
|
28
|
+
with ui.card().classes("w-full").style("height: 600px"):
|
|
29
|
+
self._plot_data = {
|
|
30
|
+
"type": "scatter",
|
|
31
|
+
"fill": "tozeroy",
|
|
32
|
+
"fillcolor": "rgba(0,0,255,1)",
|
|
33
|
+
"mode": "none",
|
|
34
|
+
"name": "",
|
|
35
|
+
"x": [],
|
|
36
|
+
"y": [],
|
|
37
|
+
"hovertemplate": [],
|
|
38
|
+
}
|
|
39
|
+
fig = {
|
|
40
|
+
"data": [self._plot_data],
|
|
41
|
+
"layout": {
|
|
42
|
+
"title": {"text": CHART_NAME},
|
|
43
|
+
"autosize": True,
|
|
44
|
+
"margin": {"l": 163},
|
|
45
|
+
"xaxis": {
|
|
46
|
+
"autorange": False,
|
|
47
|
+
"range": [0, 300],
|
|
48
|
+
"showgrid": X_AXIS_GRID_LINES,
|
|
49
|
+
"tickmode": "array",
|
|
50
|
+
"tickvals": [0, 50, 100, 150, 200, 250, 300],
|
|
51
|
+
"ticktext": [-300, -250, -200, -150, -100, -50, 0],
|
|
52
|
+
"zeroline": False,
|
|
53
|
+
},
|
|
54
|
+
"yaxis": {
|
|
55
|
+
"tickmode": "auto",
|
|
56
|
+
"nticks": 4,
|
|
57
|
+
"tickformat": "~s",
|
|
58
|
+
"autorange": True,
|
|
59
|
+
"automargin": True,
|
|
60
|
+
"rangemode": "nonnegative",
|
|
61
|
+
"showgrid": Y_AXIS_GRID_LINES,
|
|
62
|
+
"type": "log",
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
}
|
|
66
|
+
self._figure = fig
|
|
67
|
+
self._plot = ui.plotly(self._figure).classes("w-full h-full")
|
|
68
|
+
self._settings = settings
|
|
69
|
+
|
|
70
|
+
def handle_task_state(self, state_task: StateTask):
|
|
71
|
+
"""
|
|
72
|
+
Only completed tasks have profiling data.
|
|
73
|
+
Use this data to fill in history.
|
|
74
|
+
"""
|
|
75
|
+
if state_task.metadata == b"":
|
|
76
|
+
return
|
|
77
|
+
|
|
78
|
+
profile_result = ProfileResult.deserialize(state_task.metadata)
|
|
79
|
+
|
|
80
|
+
worker_memory = profile_result.memory_peak
|
|
81
|
+
worker_duration = profile_result.duration_s
|
|
82
|
+
|
|
83
|
+
if worker_memory == 0:
|
|
84
|
+
return
|
|
85
|
+
|
|
86
|
+
self.__add_memory_usage(worker_duration, worker_memory)
|
|
87
|
+
|
|
88
|
+
def handle_worker_state(self, _: StateWorker):
|
|
89
|
+
return
|
|
90
|
+
|
|
91
|
+
def update_plot(self):
|
|
92
|
+
now = datetime.datetime.now()
|
|
93
|
+
self.__render_plot(now)
|
|
94
|
+
|
|
95
|
+
def __add_memory_usage(self, time_taken: float, memory_usage: int):
|
|
96
|
+
now = datetime.datetime.now()
|
|
97
|
+
current_time = format_timediff(self._start_time, now)
|
|
98
|
+
task_start_time = current_time - time_taken
|
|
99
|
+
|
|
100
|
+
# find index we need to start changing memory use from
|
|
101
|
+
insert_index = len(self._plot_data["x"])
|
|
102
|
+
while insert_index > 0 and self._plot_data["x"][insert_index - 1] > task_start_time:
|
|
103
|
+
insert_index -= 1
|
|
104
|
+
|
|
105
|
+
# insert points to mark change
|
|
106
|
+
self._plot_data["x"].insert(insert_index, task_start_time)
|
|
107
|
+
self._plot_data["x"].insert(insert_index, task_start_time - 0.01)
|
|
108
|
+
|
|
109
|
+
prev_mem = 0
|
|
110
|
+
if insert_index < len(self._plot_data["y"]):
|
|
111
|
+
prev_mem = self._plot_data["y"][insert_index]
|
|
112
|
+
|
|
113
|
+
self._plot_data["y"].insert(insert_index, prev_mem + memory_usage)
|
|
114
|
+
self._plot_data["y"].insert(insert_index, prev_mem)
|
|
115
|
+
|
|
116
|
+
self._plot_data["hovertemplate"].insert(insert_index, format_bytes(prev_mem + memory_usage))
|
|
117
|
+
self._plot_data["hovertemplate"].insert(insert_index, format_bytes(prev_mem))
|
|
118
|
+
|
|
119
|
+
# fill future overlapping points with the additional memory use
|
|
120
|
+
i = insert_index + 2
|
|
121
|
+
while i < len(self._plot_data["x"]):
|
|
122
|
+
self._plot_data["y"][i] += memory_usage
|
|
123
|
+
self._plot_data["hovertemplate"][i] = format_bytes(self._plot_data["y"][i])
|
|
124
|
+
i += 1
|
|
125
|
+
|
|
126
|
+
# mark end of this task's memory use. always going to be the latest task we have so far.
|
|
127
|
+
self._plot_data["y"].append(memory_usage)
|
|
128
|
+
self._plot_data["hovertemplate"].append(format_bytes(memory_usage))
|
|
129
|
+
self._plot_data["x"].append(current_time - 0.01)
|
|
130
|
+
|
|
131
|
+
self._plot_data["y"].append(0)
|
|
132
|
+
self._plot_data["hovertemplate"].append(format_bytes(0))
|
|
133
|
+
self._plot_data["x"].append(current_time)
|
|
134
|
+
|
|
135
|
+
def __render_plot(self, now: datetime.datetime):
|
|
136
|
+
lower_bound, upper_bound = get_bounds(now, self._start_time, self._settings)
|
|
137
|
+
|
|
138
|
+
ticks = make_taskstream_ticks(lower_bound, upper_bound)
|
|
139
|
+
tick_text = make_tick_text(int(self._settings.stream_window.total_seconds()))
|
|
140
|
+
|
|
141
|
+
self._figure["layout"]["xaxis"]["range"] = [lower_bound, upper_bound]
|
|
142
|
+
self._figure["layout"]["xaxis"]["tickvals"] = ticks
|
|
143
|
+
self._figure["layout"]["xaxis"]["ticktext"] = tick_text
|
|
144
|
+
self._figure["layout"]["yaxis"]["type"] = self._settings.memory_usage_scale
|
|
145
|
+
|
|
146
|
+
self._plot.update()
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
|
|
3
|
+
from nicegui import ui
|
|
4
|
+
|
|
5
|
+
from scaler.protocol.python.message import StateTask, StateWorker
|
|
6
|
+
|
|
7
|
+
SLIDING_WINDOW_OPTIONS = {
|
|
8
|
+
datetime.timedelta(minutes=5): "5",
|
|
9
|
+
datetime.timedelta(minutes=10): "10",
|
|
10
|
+
datetime.timedelta(minutes=30): "30",
|
|
11
|
+
}
|
|
12
|
+
MEMORY_STORE_TIME = max(SLIDING_WINDOW_OPTIONS.keys())
|
|
13
|
+
|
|
14
|
+
MEMORY_USAGE_SCALE_OPTIONS = {"log": "log", "linear": "linear"}
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class Settings:
|
|
18
|
+
def __init__(self):
|
|
19
|
+
self.stream_window = datetime.timedelta(minutes=5)
|
|
20
|
+
self.memory_store_time = MEMORY_STORE_TIME
|
|
21
|
+
self.memory_usage_scale = "linear"
|
|
22
|
+
|
|
23
|
+
def draw_section(self):
|
|
24
|
+
with ui.card().classes("w-fit").classes("q-mx-auto"):
|
|
25
|
+
ui.label("Sliding Window Length").classes("q-mx-auto")
|
|
26
|
+
ui.toggle(SLIDING_WINDOW_OPTIONS).bind_value(self, "stream_window")
|
|
27
|
+
|
|
28
|
+
with ui.card().classes("w-fit").classes("q-mx-auto"):
|
|
29
|
+
ui.label("Memory Usage Scale").classes("q-mx-auto")
|
|
30
|
+
ui.toggle(MEMORY_USAGE_SCALE_OPTIONS).bind_value(self, "memory_usage_scale")
|
|
31
|
+
|
|
32
|
+
def handle_task_state(self, _: StateTask):
|
|
33
|
+
return
|
|
34
|
+
|
|
35
|
+
def handle_worker_state(self, _: StateWorker):
|
|
36
|
+
return
|
|
37
|
+
|
|
38
|
+
@staticmethod
|
|
39
|
+
def max_window_size() -> datetime.timedelta:
|
|
40
|
+
return max(SLIDING_WINDOW_OPTIONS.keys())
|