Add ability to read system limits on number of children, open files, and file size from the local OS - to be used in failed-to-start scenarios
This commit was SVN r14476.
Этот коммит содержится в:
родитель
18b2dca51c
Коммит
1682a72d34
@ -45,6 +45,7 @@
|
||||
#include "opal/util/error.h"
|
||||
#include "opal/util/stacktrace.h"
|
||||
#include "opal/util/keyval_parse.h"
|
||||
#include "opal/util/sys_limits.h"
|
||||
|
||||
|
||||
bool opal_init_only = true;
|
||||
@ -189,6 +190,11 @@ opal_init_util(void)
|
||||
goto return_error;
|
||||
}
|
||||
|
||||
if (OPAL_SUCCESS != (ret = opal_util_init_sys_limits())) {
|
||||
error = "opal_util_init_sys_limits";
|
||||
goto return_error;
|
||||
}
|
||||
|
||||
return OPAL_SUCCESS;
|
||||
|
||||
return_error:
|
||||
|
@ -54,6 +54,7 @@ headers = \
|
||||
show_help_lex.h \
|
||||
stacktrace.h \
|
||||
strncpy.h \
|
||||
sys_limits.h \
|
||||
trace.h
|
||||
|
||||
libopalutil_la_SOURCES = \
|
||||
@ -84,6 +85,7 @@ libopalutil_la_SOURCES = \
|
||||
show_help_lex.l \
|
||||
stacktrace.c \
|
||||
strncpy.c \
|
||||
sys_limits.c \
|
||||
trace.c
|
||||
libopalutil_la_LIBADD = \
|
||||
keyval/libopalutilkeyval.la
|
||||
|
108
opal/util/sys_limits.c
Обычный файл
108
opal/util/sys_limits.c
Обычный файл
@ -0,0 +1,108 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*
|
||||
* This file is only here because some platforms have a broken strncpy
|
||||
* (e.g., Itanium with RedHat Advanced Server glibc).
|
||||
*/
|
||||
|
||||
#include "opal_config.h"
|
||||
|
||||
#include <errno.h>
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_RESOURCE_H
|
||||
#include <sys/resource.h>
|
||||
#endif
|
||||
|
||||
#include "opal/mca/base/mca_base_param.h"
|
||||
|
||||
#include "opal/util/sys_limits.h"
|
||||
|
||||
|
||||
/*
|
||||
* Create and initialize storage for the system limits
|
||||
*/
|
||||
OPAL_DECLSPEC opal_sys_limits_t opal_sys_limits = {
|
||||
/* initialized = */ false,
|
||||
/* num_files = */ -1,
|
||||
/* num_procs = */ -1,
|
||||
/* file_size = */ 0
|
||||
};
|
||||
|
||||
int opal_util_init_sys_limits(void)
|
||||
{
|
||||
struct rlimit rlim;
|
||||
int value;
|
||||
bool set_lims;
|
||||
|
||||
mca_base_param_reg_int_name("opal", "set_max_sys_limits",
|
||||
"Set to non-zero to automatically set any system-imposed limits to the maximum allowed",
|
||||
false, false, (int)false, &value);
|
||||
set_lims = OPAL_INT_TO_BOOL(value);
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
/* George: please insert whatever is needed here someday */
|
||||
#else
|
||||
/* get/set the system limits on number of files we can have open */
|
||||
if (getrlimit (RLIMIT_NOFILE, &rlim) < 0) {
|
||||
opal_output(0, "getrlimit (RLIMIT_NOFILE) failed: %s\n", strerror(errno));
|
||||
} else {
|
||||
if (set_lims) {
|
||||
rlim.rlim_cur = rlim.rlim_max;
|
||||
if (setrlimit (RLIMIT_NOFILE, &rlim) < 0) {
|
||||
opal_output(0, "setrlimit (RLIMIT_NOFILE) failed: %s\n", strerror(errno));
|
||||
}
|
||||
}
|
||||
opal_sys_limits.num_files = rlim.rlim_cur;
|
||||
}
|
||||
|
||||
/* get/set the system limits on number of child procs we can have open */
|
||||
if (getrlimit (RLIMIT_NPROC, &rlim) < 0) {
|
||||
opal_output(0, "getrlimit (RLIMIT_NPROC) failed: %s\n", strerror(errno));
|
||||
} else {
|
||||
if (set_lims) {
|
||||
rlim.rlim_cur = rlim.rlim_max;
|
||||
if (setrlimit (RLIMIT_NPROC, &rlim) < 0) {
|
||||
opal_output(0, "setrlimit (RLIMIT_NPROC) failed: %s\n", strerror(errno));
|
||||
}
|
||||
}
|
||||
opal_sys_limits.num_procs = rlim.rlim_cur;
|
||||
}
|
||||
|
||||
/* get/set the system limits on max file size we can create */
|
||||
if (getrlimit (RLIMIT_FSIZE, &rlim) < 0) {
|
||||
opal_output(0, "getrlimit (RLIMIT_FSIZE) failed: %s\n", strerror(errno));
|
||||
} else {
|
||||
if (set_lims) {
|
||||
rlim.rlim_cur = rlim.rlim_max;
|
||||
if (setrlimit (RLIMIT_FSIZE, &rlim) < 0) {
|
||||
opal_output(0, "setrlimit (RLIMIT_FSIZE) failed: %s\n", strerror(errno));
|
||||
}
|
||||
}
|
||||
opal_sys_limits.file_size = rlim.rlim_cur;
|
||||
}
|
||||
|
||||
/* indicate we initialized the limits structure */
|
||||
opal_sys_limits.initialized = true;
|
||||
#endif
|
||||
|
||||
return OPAL_SUCCESS;
|
||||
}
|
56
opal/util/sys_limits.h
Обычный файл
56
opal/util/sys_limits.h
Обычный файл
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2006 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
#ifndef OPAL_SYS_LIMITS_H
|
||||
#define OPAL_SYS_LIMITS_H
|
||||
|
||||
#include "opal_config.h"
|
||||
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#if defined(c_plusplus) || defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* define a structure to hold the various limits we find
|
||||
* so that users can neatly access them
|
||||
*/
|
||||
typedef struct opal_sys_limits_t {
|
||||
bool initialized;
|
||||
int num_files;
|
||||
int num_procs;
|
||||
size_t file_size;
|
||||
} opal_sys_limits_t;
|
||||
|
||||
/* since we only want to do this once, we will store the
|
||||
* values in the following locations - provide access here
|
||||
*/
|
||||
OPAL_DECLSPEC extern opal_sys_limits_t opal_sys_limits;
|
||||
|
||||
/* Get the system resource limits and, if requested, set
|
||||
* them to the max allowed
|
||||
*/
|
||||
OPAL_DECLSPEC int opal_util_init_sys_limits(void);
|
||||
|
||||
#if defined(c_plusplus) || defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* OPAL_STRNCPY_H */
|
Загрузка…
Ссылка в новой задаче
Block a user