Skip to content

Commit 5b744e4

Browse files
owenowenismeTruongQuangPhat
authored andcommitted
[Core] Fix OOM kill msg wrong threshold w/ resource isolation (ray-project#62948)
## Description The OOM kill message re-computed the memory threshold at kill time via `GetMemoryThreshold()`, which under `--enable-resource-isolation` could read a different cgroup `memory.max` value than at init time (e.g. "max" instead of digits), silently falling back to 0.95. Fix: have each monitor pass the threshold it actually fired on through the callback instead of letting NodeManager guess. Now the OOM msg should be something like this ``` Memory on the node (IP: 10.0.0.1, ID: abc123) was 7.20GB / 8.00GB (0.900000); OOM kill reason: Memory usage 7728742400B exceeded threshold of 6871947674B (85.9% of 8589934592B total); Object store memory usage: [...]; Ray killed 1 worker(s) based on the killing policy: [...]; ``` ## Related issues > Link related issues: "Fixes ray-project#1234", "Closes ray-project#1234", or "Related to ray-project#1234". ## Additional information > Optional: Add implementation details, API changes, usage examples, screenshots, etc. --------- Signed-off-by: You-Cheng Lin <mses010108@gmail.com> Signed-off-by: You-Cheng Lin <106612301+owenowenisme@users.noreply.github.com> Signed-off-by: phattruong <23120318@student.hcmus.edu.vn>
1 parent ae91f05 commit 5b744e4

11 files changed

Lines changed: 76 additions & 56 deletions

src/ray/common/event_memory_monitor.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ void EventMemoryMonitor::MonitoringThreadMain() {
192192

193193
if (high_modified && IsEnabled()) {
194194
Disable();
195-
kill_workers_callback_();
195+
kill_workers_callback_("user cgroup memory upper bound was met or exceeded");
196196
}
197197
} else {
198198
RAY_LOG(ERROR) << absl::StrFormat(

src/ray/common/memory_monitor_interface.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <functional>
2121
#include <optional>
2222
#include <ostream>
23+
#include <string>
2324

2425
#include "absl/container/flat_hash_map.h"
2526
#include "ray/util/compat.h"
@@ -70,8 +71,10 @@ using ProcessesMemorySnapshot = absl::flat_hash_map<pid_t, int64_t>;
7071

7172
/**
7273
* @brief Callback to trigger worker oom killing when under memory pressure.
74+
* @param trigger_reason A human-readable description of why the monitor triggered
75+
* the kill (e.g. threshold exceeded, cgroup event, PSI pressure).
7376
*/
74-
using KillWorkersCallback = std::function<void()>;
77+
using KillWorkersCallback = std::function<void(std::string trigger_reason)>;
7578

7679
/**
7780
* @brief implementations of this interface monitors the memory usage of the node

src/ray/common/pressure_memory_monitor.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ void PressureMemoryMonitor::MonitoringThreadMain() {
161161
if (fds[0].revents & POLLPRI) {
162162
if (IsEnabled()) {
163163
Disable();
164-
kill_workers_callback_();
164+
kill_workers_callback_("user cgroup memory pressure was detected");
165165
}
166166
} else if (fds[0].revents & POLLERR) {
167167
RAY_LOG(ERROR) << "Got POLLERR while monitoring memory pressure. "

src/ray/common/tests/event_memory_monitor_test.cc

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class EventMemoryMonitorTest : public ::testing::Test {
6666
TEST_F(EventMemoryMonitorTest, TestNonexistentCgroupPathFailsGracefully) {
6767
std::string nonexistent_path = "/nonexistent/cgroup/path";
6868
StatusSetOr<std::unique_ptr<EventMemoryMonitor>, StatusT::IOError> result =
69-
EventMemoryMonitor::Create(std::move(nonexistent_path), []() {});
69+
EventMemoryMonitor::Create(std::move(nonexistent_path), [](std::string) {});
7070

7171
ASSERT_TRUE(result.has_error())
7272
<< "Failed to catch invalid cgroup path when creating EventMemoryMonitor";
@@ -78,7 +78,7 @@ TEST_F(EventMemoryMonitorTest, TestMissingMemoryEventsFileFailsGracefully) {
7878
RAY_CHECK(empty_dir_or.ok()) << empty_dir_or.status().ToString();
7979
std::unique_ptr<TempDirectory> empty_dir = std::move(empty_dir_or.value());
8080
StatusSetOr<std::unique_ptr<EventMemoryMonitor>, StatusT::IOError> result =
81-
EventMemoryMonitor::Create(empty_dir->GetPath(), []() {});
81+
EventMemoryMonitor::Create(empty_dir->GetPath(), [](std::string) {});
8282

8383
ASSERT_TRUE(result.has_error())
8484
<< "Failed to catch invalid cgroup configuration when creating EventMemoryMonitor";
@@ -87,7 +87,7 @@ TEST_F(EventMemoryMonitorTest, TestMissingMemoryEventsFileFailsGracefully) {
8787

8888
TEST_F(EventMemoryMonitorTest, TestSuccessfulCreationWithValidPath) {
8989
StatusSetOr<std::unique_ptr<EventMemoryMonitor>, StatusT::IOError> result =
90-
EventMemoryMonitor::Create(mock_cgroup_dir_->GetPath(), []() {});
90+
EventMemoryMonitor::Create(mock_cgroup_dir_->GetPath(), [](std::string) {});
9191
ASSERT_TRUE(result.has_value())
9292
<< "Failed to create EventMemoryMonitor: " << result.message();
9393
std::unique_ptr<EventMemoryMonitor> monitor = std::move(result.value());
@@ -98,7 +98,9 @@ TEST_F(EventMemoryMonitorTest, TestCallbackCalledWhenHighEventChanges) {
9898
WriteMemoryEventsFile(events_file_->GetPath(), 0, 0);
9999

100100
auto callback_latch = std::make_shared<boost::latch>(1);
101-
KillWorkersCallback callback = [callback_latch]() { callback_latch->count_down(); };
101+
KillWorkersCallback callback = [callback_latch](std::string) {
102+
callback_latch->count_down();
103+
};
102104

103105
StatusSetOr<std::unique_ptr<EventMemoryMonitor>, StatusT::IOError> result =
104106
EventMemoryMonitor::Create(std::move(mock_cgroup_dir_->GetPath()),
@@ -116,7 +118,9 @@ TEST_F(EventMemoryMonitorTest, TestNoCallbackWhenValuesUnchanged) {
116118
WriteMemoryEventsFile(events_file_->GetPath(), 0, 0);
117119

118120
auto callback_latch = std::make_shared<boost::latch>(1);
119-
KillWorkersCallback callback = [callback_latch]() { callback_latch->count_down(); };
121+
KillWorkersCallback callback = [callback_latch](std::string) {
122+
callback_latch->count_down();
123+
};
120124

121125
StatusSetOr<std::unique_ptr<EventMemoryMonitor>, StatusT::IOError> result =
122126
EventMemoryMonitor::Create(mock_cgroup_dir_->GetPath(), callback);
@@ -133,7 +137,9 @@ TEST_F(EventMemoryMonitorTest, TestNoCallbackWhenIrrelevantEventChanges) {
133137
WriteMemoryEventsFile(events_file_->GetPath(), 0, 0);
134138

135139
auto callback_latch = std::make_shared<boost::latch>(1);
136-
KillWorkersCallback callback = [callback_latch]() { callback_latch->count_down(); };
140+
KillWorkersCallback callback = [callback_latch](std::string) {
141+
callback_latch->count_down();
142+
};
137143

138144
StatusSetOr<std::unique_ptr<EventMemoryMonitor>, StatusT::IOError> result =
139145
EventMemoryMonitor::Create(mock_cgroup_dir_->GetPath(), callback);
@@ -153,7 +159,7 @@ TEST_F(EventMemoryMonitorTest, TestMultipleCallbacksOnMultipleChanges) {
153159
auto latch2 = std::make_shared<boost::latch>(1);
154160
auto latch3 = std::make_shared<boost::latch>(1);
155161
std::atomic<int> callback_count{0};
156-
KillWorkersCallback callback = [&callback_count, latch1, latch2, latch3]() {
162+
KillWorkersCallback callback = [&callback_count, latch1, latch2, latch3](std::string) {
157163
int count = ++callback_count;
158164
if (count == 1) {
159165
latch1->count_down();

src/ray/common/tests/memory_monitor_factory_test.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ TEST_F(MemoryMonitorFactoryTest,
7878
FakeCgroupManager cgroup_manager(kUserMemoryMaxBytes, kUserMemoryHighBytes);
7979

8080
std::vector<std::unique_ptr<MemoryMonitorInterface>> monitors =
81-
MemoryMonitorFactory::Create([]() {},
81+
MemoryMonitorFactory::Create([](std::string) {},
8282
/*resource_isolation_enabled=*/false,
8383
cgroup_manager);
8484

@@ -93,7 +93,7 @@ TEST_F(MemoryMonitorFactoryTest,
9393
TempFile pressure_file(cgroup_manager.GetPath() + "/memory.pressure");
9494

9595
std::vector<std::unique_ptr<MemoryMonitorInterface>> monitors =
96-
MemoryMonitorFactory::Create([]() {},
96+
MemoryMonitorFactory::Create([](std::string) {},
9797
/*resource_isolation_enabled=*/true,
9898
cgroup_manager);
9999

src/ray/common/tests/pressure_memory_monitor_test.cc

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@ TEST_F(PressureMemoryMonitorTest, TestInvalidStallDurationReturnsFalse) {
9999
TEST_F(PressureMemoryMonitorTest, TestNonexistentCgroupPathFailsGracefully) {
100100
MemoryPsi psi = {.mode = "some", .stall_proportion = 0.5f, .stall_duration_s = 2};
101101
std::string nonexistent_path = "/nonexistent/cgroup/path";
102-
auto result = PressureMemoryMonitor::Create(psi, std::move(nonexistent_path), []() {});
102+
auto result =
103+
PressureMemoryMonitor::Create(psi, std::move(nonexistent_path), [](std::string) {});
103104

104105
ASSERT_TRUE(result.has_error())
105106
<< "Failed to catch invalid cgroup path when creating PressureMemoryMonitor";
@@ -109,7 +110,8 @@ TEST_F(PressureMemoryMonitorTest, TestNonexistentCgroupPathFailsGracefully) {
109110
TEST_F(PressureMemoryMonitorTest, TestMonitorCreationWritesTriggerStringToFile) {
110111
MemoryPsi psi = {.mode = "some", .stall_proportion = 0.5f, .stall_duration_s = 2};
111112

112-
auto result = PressureMemoryMonitor::Create(psi, mock_cgroup_dir_->GetPath(), []() {});
113+
auto result =
114+
PressureMemoryMonitor::Create(psi, mock_cgroup_dir_->GetPath(), [](std::string) {});
113115
ASSERT_TRUE(result.has_value())
114116
<< "Failed to create PressureMemoryMonitor: " << result.message();
115117

@@ -162,7 +164,9 @@ TEST_F(PressureMemoryMonitorTest,
162164
close(listener);
163165

164166
std::shared_ptr<boost::latch> has_called_once = std::make_shared<boost::latch>(1);
165-
auto kill_workers_callback = [has_called_once]() { has_called_once->count_down(); };
167+
auto kill_workers_callback = [has_called_once](std::string) {
168+
has_called_once->count_down();
169+
};
166170
std::unique_ptr<PressureMemoryMonitor> monitor =
167171
std::make_unique<PressureMemoryMonitor>(
168172
mock_cgroup_dir_->GetPath(), listener_fd, kill_workers_callback);

src/ray/common/tests/threshold_memory_monitor_test.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ TEST_F(ThresholdMemoryMonitorTest, TestMonitorTriggerCanDetectMemoryUsage) {
7575
MakeThresholdMemoryMonitor(
7676
0 /*memory_usage_threshold_bytes*/,
7777
1 /*refresh_interval_ms*/,
78-
[has_checked_once]() { has_checked_once->count_down(); },
78+
[has_checked_once](std::string) { has_checked_once->count_down(); },
7979
"" /*root_cgroup_path*/);
8080
has_checked_once->wait();
8181
}
@@ -105,7 +105,7 @@ TEST_F(ThresholdMemoryMonitorTest,
105105
MakeThresholdMemoryMonitor(
106106
memory_usage_threshold_bytes, // (70%)
107107
1 /*refresh_interval_ms*/,
108-
[has_checked_once]() { has_checked_once->count_down(); },
108+
[has_checked_once](std::string) { has_checked_once->count_down(); },
109109
cgroup_dir /*root_cgroup_path*/);
110110

111111
has_checked_once->wait();
@@ -137,7 +137,7 @@ TEST_F(ThresholdMemoryMonitorTest,
137137
MakeThresholdMemoryMonitor(
138138
memory_usage_threshold_bytes, // (70%)
139139
1 /*refresh_interval_ms*/,
140-
[callback_triggered]() { callback_triggered->store(true); },
140+
[callback_triggered](std::string) { callback_triggered->store(true); },
141141
cgroup_dir /*root_cgroup_path*/);
142142

143143
std::this_thread::sleep_for(std::chrono::seconds(5));
@@ -172,7 +172,7 @@ TEST_F(ThresholdMemoryMonitorTest,
172172
MakeResourceIsolatedThresholdMemoryMonitor(
173173
threshold_bytes,
174174
1 /*refresh_interval_ms*/,
175-
[has_checked_once]() { has_checked_once->count_down(); },
175+
[has_checked_once](std::string) { has_checked_once->count_down(); },
176176
"" /*root_cgroup_path*/,
177177
user_cgroup_dir,
178178
system_cgroup_dir);
@@ -213,7 +213,7 @@ TEST_F(
213213
MakeResourceIsolatedThresholdMemoryMonitor(
214214
threshold_bytes,
215215
1 /*refresh_interval_ms*/,
216-
[has_checked_once]() { has_checked_once->count_down(); },
216+
[has_checked_once](std::string) { has_checked_once->count_down(); },
217217
"" /*root_cgroup_path*/,
218218
user_cgroup_dir,
219219
system_cgroup_dir);
@@ -253,7 +253,7 @@ TEST_F(ThresholdMemoryMonitorTest,
253253
MakeResourceIsolatedThresholdMemoryMonitor(
254254
threshold_bytes,
255255
1 /*refresh_interval_ms*/,
256-
[callback_triggered]() { callback_triggered->store(true); },
256+
[callback_triggered](std::string) { callback_triggered->store(true); },
257257
"" /*root_cgroup_path*/,
258258
user_cgroup_dir,
259259
system_cgroup_dir);

src/ray/common/threshold_memory_monitor.cc

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,26 @@ ThresholdMemoryMonitor::ThresholdMemoryMonitor(KillWorkersCallback kill_workers_
6262

6363
runner_->RunFnPeriodically(
6464
[this] {
65-
bool is_usage_above_threshold = false;
65+
std::optional<MemoryUsageSnapshot> exceeded_snapshot;
6666
if (resource_isolation_enabled_) {
67-
is_usage_above_threshold = IsResourceIsolationThresholdExceeded();
67+
exceeded_snapshot = IsResourceIsolationThresholdExceeded();
6868
} else {
69-
is_usage_above_threshold = IsHostMemoryThresholdExceeded();
69+
exceeded_snapshot = IsHostMemoryThresholdExceeded();
7070
}
7171

72-
if (is_usage_above_threshold && IsEnabled()) {
72+
if (exceeded_snapshot.has_value() && IsEnabled()) {
73+
const MemoryUsageSnapshot &cur_memory_snapshot = exceeded_snapshot.value();
7374
Disable();
74-
kill_workers_callback_();
75+
std::string trigger_reason = absl::StrFormat(
76+
"Memory usage %dB exceeded threshold of %dB (%.1f%% of %dB total)",
77+
cur_memory_snapshot.used_bytes,
78+
memory_usage_threshold_bytes_,
79+
(cur_memory_snapshot.total_bytes > 0
80+
? static_cast<float>(memory_usage_threshold_bytes_) /
81+
static_cast<float>(cur_memory_snapshot.total_bytes) * 100
82+
: 0.0f),
83+
cur_memory_snapshot.total_bytes);
84+
kill_workers_callback_(trigger_reason);
7585
}
7686
},
7787
monitor_interval_ms,
@@ -94,7 +104,8 @@ bool ThresholdMemoryMonitor::IsEnabled() const {
94104
return !worker_killing_in_progress_.load();
95105
}
96106

97-
bool ThresholdMemoryMonitor::IsHostMemoryThresholdExceeded() {
107+
std::optional<MemoryUsageSnapshot>
108+
ThresholdMemoryMonitor::IsHostMemoryThresholdExceeded() {
98109
MemoryUsageSnapshot cur_memory_snapshot =
99110
MemoryMonitorUtils::TakeSystemMemoryUsageSnapshot(root_cgroup_path_);
100111
int64_t used_memory_bytes = cur_memory_snapshot.used_bytes;
@@ -104,7 +115,7 @@ bool ThresholdMemoryMonitor::IsHostMemoryThresholdExceeded() {
104115
RAY_LOG_EVERY_MS(WARNING, MemoryMonitorInterface::kLogIntervalMs)
105116
<< "Unable to capture node memory. Monitor will not be able "
106117
<< "to detect memory usage above threshold.";
107-
return false;
118+
return std::nullopt;
108119
}
109120
bool is_usage_above_threshold = used_memory_bytes > memory_usage_threshold_bytes_;
110121
if (is_usage_above_threshold) {
@@ -117,10 +128,13 @@ bool ThresholdMemoryMonitor::IsHostMemoryThresholdExceeded() {
117128
static_cast<float>(memory_usage_threshold_bytes_) /
118129
static_cast<float>(total_memory_bytes));
119130
}
120-
return is_usage_above_threshold;
131+
return is_usage_above_threshold
132+
? std::optional<MemoryUsageSnapshot>(cur_memory_snapshot)
133+
: std::nullopt;
121134
}
122135

123-
bool ThresholdMemoryMonitor::IsResourceIsolationThresholdExceeded() {
136+
std::optional<MemoryUsageSnapshot>
137+
ThresholdMemoryMonitor::IsResourceIsolationThresholdExceeded() {
124138
StatusSetOr<MemoryUsageSnapshot, StatusT::NotFound> user_slice_memory_snapshot_or =
125139
MemoryMonitorUtils::TakeUserSliceMemoryUsageSnapshot(user_cgroup_path_,
126140
system_cgroup_path_);
@@ -130,7 +144,7 @@ bool ThresholdMemoryMonitor::IsResourceIsolationThresholdExceeded() {
130144
"The threshold memory monitor will not be able to provide resource isolation "
131145
"protection.",
132146
user_slice_memory_snapshot_or.message());
133-
return false;
147+
return std::nullopt;
134148
}
135149
MemoryUsageSnapshot user_slice_memory_snapshot = user_slice_memory_snapshot_or.value();
136150
bool is_usage_above_threshold =
@@ -145,7 +159,9 @@ bool ThresholdMemoryMonitor::IsResourceIsolationThresholdExceeded() {
145159
static_cast<float>(memory_usage_threshold_bytes_) /
146160
static_cast<float>(user_slice_memory_snapshot.total_bytes));
147161
}
148-
return is_usage_above_threshold;
162+
return is_usage_above_threshold
163+
? std::optional<MemoryUsageSnapshot>(user_slice_memory_snapshot)
164+
: std::nullopt;
149165
}
150166

151167
} // namespace ray

src/ray/common/threshold_memory_monitor.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include <cstdint>
1818
#include <memory>
19+
#include <optional>
1920
#include <thread>
2021

2122
#include "ray/asio/periodical_runner.h"
@@ -83,16 +84,18 @@ class ThresholdMemoryMonitor : public MemoryMonitorInterface {
8384
*
8485
* @return True if the memory usage is above the threshold.
8586
*/
86-
bool IsHostMemoryThresholdExceeded();
87+
/// Returns the memory snapshot if the host memory usage exceeds the threshold,
88+
/// or std::nullopt otherwise.
89+
std::optional<MemoryUsageSnapshot> IsHostMemoryThresholdExceeded();
8790

8891
/**
8992
* @brief Checks if the memory usage across all user slice processes,
9093
* including their object store usage, exceeds their allowed
9194
* threshold under resource isolation mode on this node.
9295
*
93-
* @return True if the user process memory usage is above the threshold.
96+
* @return The memory snapshot if above threshold, std::nullopt otherwise.
9497
*/
95-
bool IsResourceIsolationThresholdExceeded();
98+
std::optional<MemoryUsageSnapshot> IsResourceIsolationThresholdExceeded();
9699

97100
/// Callback function that executes at each monitoring interval,
98101
/// on a dedicated thread managed by this class.

src/ray/raylet/node_manager.cc

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3068,12 +3068,12 @@ void NodeManager::ReleaseKillWorkerInProgress() {
30683068

30693069
// Picks the workers and kills the process if the memory usage is above the threshold.
30703070
KillWorkersCallback NodeManager::CreateKillWorkersCallback() {
3071-
return [this]() {
3071+
return [this](std::string trigger_reason) {
30723072
if (!MarkKillWorkerInProgress()) {
30733073
return;
30743074
}
30753075
io_service_.post(
3076-
[this]() {
3076+
[this, trigger_reason = std::move(trigger_reason)]() {
30773077
std::vector<std::shared_ptr<WorkerInterface>> workers =
30783078
worker_pool_.GetAllRegisteredWorkers(/* filter_dead_workers */ true,
30793079
/* filter_io_workers */ true);
@@ -3116,25 +3116,13 @@ KillWorkersCallback NodeManager::CreateKillWorkersCallback() {
31163116
return;
31173117
}
31183118

3119-
// Compute the memory usage threshold
3120-
int64_t total_memory_bytes = memory_usage_snapshot.total_bytes;
3121-
int64_t computed_threshold_bytes = MemoryMonitorUtils::GetMemoryThreshold(
3122-
total_memory_bytes,
3123-
RayConfig::instance().memory_usage_threshold(),
3124-
RayConfig::instance().min_memory_free_bytes(),
3125-
initial_config_.enable_resource_isolation,
3126-
*cgroup_manager_);
3127-
float computed_threshold_fraction =
3128-
static_cast<float>(computed_threshold_bytes) /
3129-
static_cast<float>(total_memory_bytes);
3130-
31313119
std::string oom_kill_details = CreateOomKillMessageDetails(
31323120
workers_to_kill_and_should_retry,
31333121
self_node_id_,
31343122
memory_usage_snapshot,
31353123
store_client_->GetMemoryUsage().value_or("Not available"),
31363124
process_memory_snapshot,
3137-
computed_threshold_fraction);
3125+
trigger_reason);
31383126
std::string oom_kill_suggestions =
31393127
CreateOomKillMessageSuggestions(workers_to_kill_and_should_retry);
31403128

@@ -3204,7 +3192,7 @@ std::string NodeManager::CreateOomKillMessageDetails(
32043192
const MemoryUsageSnapshot &memory_usage_snapshot,
32053193
const std::string &object_store_memory_usage,
32063194
const ProcessesMemorySnapshot &process_memory_snapshot,
3207-
float usage_threshold) const {
3195+
const std::string &trigger_reason) const {
32083196
if (workers_to_kill.empty()) {
32093197
return "";
32103198
}
@@ -3261,8 +3249,8 @@ std::string NodeManager::CreateOomKillMessageDetails(
32613249
}
32623250

32633251
return absl::StrFormat(
3264-
"Memory on the node (IP: %s, ID: %s) was %sGB / %sGB (%f), "
3265-
"which exceeds the memory usage threshold of %f; "
3252+
"Memory on the node (IP: %s, ID: %s) was %sGB / %sGB (%f); "
3253+
"OOM kill reason: %s; "
32663254
"Object store memory usage: [%s]; "
32673255
"Ray killed %d worker(s) based on the killing policy: "
32683256
"[%s]; "
@@ -3274,7 +3262,7 @@ std::string NodeManager::CreateOomKillMessageDetails(
32743262
used_bytes_gb,
32753263
total_bytes_gb,
32763264
usage_fraction,
3277-
usage_threshold,
3265+
trigger_reason,
32783266
absl::StrReplaceAll(object_store_memory_usage, {{"\n", "; "}}),
32793267
workers_to_kill.size(),
32803268
absl::StrJoin(worker_details, "; "),

0 commit comments

Comments
 (0)