35 #define FAST_FD_COUNT 1 36 #define CHECK_FD_WITH_POLL 0 45 static long fd_last = 0;
46 static long fd_open = 0;
47 static long fd_idle = 0;
49 static rlim_t fd_max = 0;
51 static rlim_t fd_soft = 0;
52 static rlim_t fd_hard = 0;
55 static rlim_t fd_cur = 0;
57 static pthread_mutex_t st_mutex = PTHREAD_MUTEX_INITIALIZER;
60 #define POLL_IN_USE (POLLIN | POLLOUT | POLLPRI | POLLHUP) 69 fdwalk_count(
void *count,
int fd)
71 int *n = (
int *) count;
84 time_t now = time(NULL);
86 long lsoft, lhard, nb_idle, nb_used;
93 if (getrlimit(RLIMIT_NOFILE, &rlp) == 0) {
94 fd_max = rlp.rlim_cur;
96 fd_max = sysconf(_SC_OPEN_MAX);
102 nb_used = nb_idle = 0;
109 (void) fdwalk(fdwalk_count, &nb_used);
114 nb_idle = fd_last - nb_used;
121 nb_used = nb_idle = 0;
122 for (i = fd_max - 1; i >= 0; i--) {
123 #if CHECK_FD_WITH_POLL == 1 135 #if CHECK_FD_WITH_POLL == 1 137 ufds.events = POLLIN | POLLOUT;
140 r = poll(&ufds, 1, 0);
142 if ((r < 0) && (errno == EBADF)) {
151 if ((r > 0) && ((ufds.revents & POLLNVAL) != 0)) {
161 if (fstat(i, &buf) == 0)
176 ZE_MessageInfo(10,
" FD : open=[%d] idle=[%d] now=[%ld]", fd_open, fd_idle,
192 long nb_idle, nb_open;
208 if (nb_idle < lhard) {
210 (
long) fd_open, (
long) fd_max);
213 if (nb_idle < lsoft) {
215 (
long) fd_open, (
long) fd_max);
219 if (nb_open + lhard > fd_max) {
221 (
long) fd_open, (
long) fd_max);
225 if (nb_open + lsoft > fd_max) {
227 (
long) fd_open, (
long) fd_max);
253 if (getrlimit(RLIMIT_NOFILE, &rlp) == 0) {
255 fd_soft = rlp.rlim_cur;
257 fd_hard = rlp.rlim_max;
263 if (strlim != NULL) {
264 if (strcasecmp(strlim,
"DEFAULT") == 0)
267 if (strcasecmp(strlim,
"MAX") == 0) {
277 if (errno == ERANGE || errno == EINVAL || n <= 0 || n > fd_hard)
284 if (fd_conf > fd_hard) {
285 ZE_MessageInfo(0,
"Can't set file descriptor limit greater than %ld",
290 if ((fd_conf > 1) && (fd_conf <
ZE_NOFILE)) {
306 ZE_MessageInfo(11,
"Will set file descriptor limit to %ld [%ld,%ld]",
307 (
long) fd_cur, (
long) fd_soft, (
long) fd_hard);
311 "May not set file descriptor limit to more than FD_SETSIZE");
315 rlp.rlim_cur = fd_cur;
316 if (setrlimit(RLIMIT_NOFILE, &rlp) != 0) {
319 ZE_MessageInfo(11,
"RLIMIT_NOFILE set to %ld files", (
long) rlp.rlim_cur);
322 "File descriptors thresholds set to : soft=[%ld] - hard=[%ld]",
323 (
long) (fd_cur - lsoft), (
long) (fd_cur - lhard));
343 if (getrlimit(RLIMIT_CORE, &rlp) == 0) {
344 rlp.rlim_cur = (enable ? 32000000 : 0);
346 if (setrlimit(RLIMIT_CORE, &rlp) != 0) {
350 ZE_MessageInfo(9,
"RLIMIT_CORE set to %ld bytes", (
long) rlp.rlim_cur);
376 memset(&usage, 0,
sizeof (usage));
377 r = getrusage(RUSAGE_SELF, &usage);
384 ru_maxrss = usage.ru_maxrss;
385 ru_ixrss = usage.ru_ixrss;
386 ru_idrss = usage.ru_idrss;
387 ru_isrss = usage.ru_isrss;
389 ZE_MessageInfo(9,
"* RESOURCE CHECK : ru_maxrss = %10ld", ru_maxrss);
390 ZE_MessageInfo(9,
"* RESOURCE CHECK : ru_ixrss = %10ld", ru_ixrss);
391 ZE_MessageInfo(9,
"* RESOURCE CHECK : ru_idrss = %10ld", ru_idrss);
392 ZE_MessageInfo(9,
"* RESOURCE CHECK : ru_isrss = %10ld", ru_isrss);
#define CF_FILE_DESCRIPTORS
#define MUTEX_UNLOCK(mutex)
#define MUTEX_LOCK(mutex)
long zeStr2long(char *s, int *error, long dval)
#define CF_USE_SELECT_LIMIT
#define ZE_MessageInfo(level,...)
#define ZE_LogSysError(...)
#define CF_FD_FREE_HARD_LIMIT
char * cf_get_str(int id)
#define ZE_LogMsgWarning(level,...)
#define CF_FD_FREE_SOFT_LIMIT