You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by mi...@apache.org on 2024/01/08 19:06:36 UTC
(impala) 01/04: IMPALA-12643 (part 1): Limit memory consumption for resolve_minidumps.py
This is an automated email from the ASF dual-hosted git repository.
michaelsmith pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/impala.git
commit c0a015fdac677c51b6d0e0f8511cc29eb2f8f304
Author: Joe McDonnell <jo...@cloudera.com>
AuthorDate: Fri Dec 15 16:55:32 2023 -0800
IMPALA-12643 (part 1): Limit memory consumption for resolve_minidumps.py
On some platforms (Centos 7), resolve_minidumps.py's call to
minidump_stackwalk goes haywire and uses all the system memory
until it gets OOM killed. Some library must have corrupt
symbols, etc. As a workaround, this detects whether the
prlimit utility is present and uses this to run minidump_stackwalk
with a 4GB limit on virtual memory. This kills the process
earlier and avoids using all system memory.
Testing:
- Verified that bin/jenkins/finalize.sh uses resolve_minidumps.py
on a Redhat 8 Jenkins job (and it works)
- Verified that bin/jenkins/finalize.sh works properly on
my Ubuntu 20 box
- Ran a Jenkins job on Centos 7 and verified that the prlimit
code kills minidump_stackwalk when it uses 4GB of memory.
Change-Id: I4db8facb8a037327228c3714e047e0d1f0fe1d94
Reviewed-on: http://gerrit.cloudera.org:8080/20862
Reviewed-by: Michael Smith <mi...@cloudera.com>
Tested-by: Joe McDonnell <jo...@cloudera.com>
---
bin/resolve_minidumps.py | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/bin/resolve_minidumps.py b/bin/resolve_minidumps.py
index e3f00be70..f410fabcf 100755
--- a/bin/resolve_minidumps.py
+++ b/bin/resolve_minidumps.py
@@ -32,7 +32,7 @@
# that were used by the binary. It gets the symbols for all
# those libraries and resolves the minidump.
#
-# Usage: resolve_minidump.py --minidump_file [file] --output_file [file]
+# Usage: resolve_minidumps.py --minidump_file [file] --output_file [file]
# (optional -v or --verbose for more output)
import errno
@@ -288,9 +288,22 @@ def dump_symbols_for_all_modules(dump_syms, objcopy, module_list, out_dir):
def resolve_minidump(minidump_stackwalk, minidump_path, symbol_dir, verbose, out_file):
+ minidump_stackwalk_cmd = [minidump_stackwalk, minidump_path, symbol_dir]
+ # There are circumstances where the minidump_stackwalk can go wrong and become
+ # a runaway process capable of using all system memory. If the prlimit utility
+ # is present, we use it to apply a limit on the memory consumption.
+ #
+ # See if we have the prlimit utility
+ check_prlimit = subprocess.run(["prlimit", "-V"], stdout=subprocess.DEVNULL,
+ stderr=subprocess.DEVNULL)
+ if check_prlimit.returncode == 0:
+ # The prlimit utility is available, so wrap the minidump_stackwalk command
+ # to apply a 4GB limit on virtual memory. In normal operations, 4G is plenty.
+ prlimit_wrapper = ["prlimit", "--as={0}".format(4 * 1024 * 1024 * 1024)]
+ minidump_stackwalk_cmd = prlimit_wrapper + minidump_stackwalk_cmd
with open(out_file, "w") as out_f:
stderr_output = None if verbose else subprocess.DEVNULL
- subprocess.run([minidump_stackwalk, minidump_path, symbol_dir], stdout=out_f,
+ subprocess.run(minidump_stackwalk_cmd, stdout=out_f,
stderr=stderr_output, check=True)