-
Notifications
You must be signed in to change notification settings - Fork 5.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(runtime): use
prlimit
to limit resource usage of command to av…
…oid OOM Runtime Kill (#6338) Co-authored-by: openhands <[email protected]> Co-authored-by: Engel Nyst <[email protected]> Co-authored-by: Graham Neubig <[email protected]>
- Loading branch information
1 parent
1a715d2
commit 6a6dc93
Showing
5 changed files
with
151 additions
and
43 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
"""Stress tests for the DockerRuntime, which connects to the ActionExecutor running in the sandbox.""" | ||
|
||
from conftest import _close_test_runtime, _load_runtime | ||
|
||
from openhands.core.logger import openhands_logger as logger | ||
from openhands.events.action import CmdRunAction | ||
|
||
|
||
def test_stress_docker_runtime(temp_dir, runtime_cls, repeat=1): | ||
runtime, config = _load_runtime( | ||
temp_dir, | ||
runtime_cls, | ||
docker_runtime_kwargs={ | ||
'cpu_period': 100000, # 100ms | ||
'cpu_quota': 100000, # Can use 100ms out of each 100ms period (1 CPU) | ||
'mem_limit': '4G', # 4 GB of memory | ||
}, | ||
) | ||
|
||
action = CmdRunAction( | ||
command='sudo apt-get update && sudo apt-get install -y stress-ng' | ||
) | ||
logger.info(action, extra={'msg_type': 'ACTION'}) | ||
obs = runtime.run_action(action) | ||
logger.info(obs, extra={'msg_type': 'OBSERVATION'}) | ||
assert obs.exit_code == 0 | ||
|
||
for _ in range(repeat): | ||
# run stress-ng stress tests for 1 minute | ||
action = CmdRunAction(command='stress-ng --all 1 -t 30s') | ||
action.set_hard_timeout(120) | ||
logger.info(action, extra={'msg_type': 'ACTION'}) | ||
obs = runtime.run_action(action) | ||
logger.info(obs, extra={'msg_type': 'OBSERVATION'}) | ||
|
||
_close_test_runtime(runtime) | ||
|
||
|
||
def test_stress_docker_runtime_hit_memory_limits(temp_dir, runtime_cls): | ||
"""Test runtime behavior under resource constraints.""" | ||
runtime, config = _load_runtime( | ||
temp_dir, | ||
runtime_cls, | ||
docker_runtime_kwargs={ | ||
'cpu_period': 100000, # 100ms | ||
'cpu_quota': 100000, # Can use 100ms out of each 100ms period (1 CPU) | ||
'mem_limit': '4G', # 4 GB of memory | ||
'memswap_limit': '0', # No swap | ||
'mem_swappiness': 0, # Disable swapping | ||
'oom_kill_disable': False, # Enable OOM killer | ||
}, | ||
runtime_startup_env_vars={ | ||
'RUNTIME_MAX_MEMORY_GB': '3', | ||
}, | ||
) | ||
|
||
action = CmdRunAction( | ||
command='sudo apt-get update && sudo apt-get install -y stress-ng' | ||
) | ||
logger.info(action, extra={'msg_type': 'ACTION'}) | ||
obs = runtime.run_action(action) | ||
logger.info(obs, extra={'msg_type': 'OBSERVATION'}) | ||
assert obs.exit_code == 0 | ||
|
||
action = CmdRunAction( | ||
command='stress-ng --vm 1 --vm-bytes 6G --timeout 30s --metrics' | ||
) | ||
action.set_hard_timeout(120) | ||
logger.info(action, extra={'msg_type': 'ACTION'}) | ||
obs = runtime.run_action(action) | ||
logger.info(obs, extra={'msg_type': 'OBSERVATION'}) | ||
assert 'aborted early, out of system resources' in obs.content | ||
assert obs.exit_code == 3 # OOM killed! | ||
|
||
_close_test_runtime(runtime) | ||
|
||
|
||
def test_stress_docker_runtime_within_memory_limits(temp_dir, runtime_cls): | ||
"""Test runtime behavior under resource constraints.""" | ||
runtime, config = _load_runtime( | ||
temp_dir, | ||
runtime_cls, | ||
docker_runtime_kwargs={ | ||
'cpu_period': 100000, # 100ms | ||
'cpu_quota': 100000, # Can use 100ms out of each 100ms period (1 CPU) | ||
'mem_limit': '4G', # 4 GB of memory | ||
'memswap_limit': '0', # No swap | ||
'mem_swappiness': 0, # Disable swapping | ||
'oom_kill_disable': False, # Enable OOM killer | ||
}, | ||
runtime_startup_env_vars={ | ||
'RUNTIME_MAX_MEMORY_GB': '7', | ||
}, | ||
) | ||
|
||
action = CmdRunAction( | ||
command='sudo apt-get update && sudo apt-get install -y stress-ng' | ||
) | ||
logger.info(action, extra={'msg_type': 'ACTION'}) | ||
obs = runtime.run_action(action) | ||
logger.info(obs, extra={'msg_type': 'OBSERVATION'}) | ||
assert obs.exit_code == 0 | ||
|
||
action = CmdRunAction( | ||
command='stress-ng --vm 1 --vm-bytes 6G --timeout 30s --metrics' | ||
) | ||
action.set_hard_timeout(120) | ||
logger.info(action, extra={'msg_type': 'ACTION'}) | ||
obs = runtime.run_action(action) | ||
logger.info(obs, extra={'msg_type': 'OBSERVATION'}) | ||
assert obs.exit_code == 0 | ||
|
||
_close_test_runtime(runtime) |
This file was deleted.
Oops, something went wrong.