1
1

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.
Этот коммит содержится в:
Ralph Castain 2007-04-23 18:53:47 +00:00
родитель 18b2dca51c
Коммит 1682a72d34
4 изменённых файлов: 172 добавлений и 0 удалений

Просмотреть файл

@ -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 Обычный файл
Просмотреть файл

@ -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 Обычный файл
Просмотреть файл

@ -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 */