You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by jp...@apache.org on 2014/09/06 22:35:19 UTC
[2/2] git commit: TS-2736: detect max file limit in common code
TS-2736: detect max file limit in common code
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/4a1d1781
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/4a1d1781
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/4a1d1781
Branch: refs/heads/master
Commit: 4a1d178189d0c86ac69d8e82580535416ae9a138
Parents: a4d903c
Author: James Peach <jp...@apache.org>
Authored: Sat Sep 6 12:51:21 2014 -0700
Committer: James Peach <jp...@apache.org>
Committed: Sat Sep 6 12:51:21 2014 -0700
----------------------------------------------------------------------
cmd/traffic_manager/traffic_manager.cc | 27 +++++++++----------
lib/ts/ink_sys_control.cc | 28 ++++++++++++++++++--
lib/ts/ink_sys_control.h | 10 +------
proxy/Main.cc | 41 +++++++++++++++--------------
4 files changed, 60 insertions(+), 46 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/4a1d1781/cmd/traffic_manager/traffic_manager.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_manager/traffic_manager.cc b/cmd/traffic_manager/traffic_manager.cc
index 93bbbd2..087795a 100644
--- a/cmd/traffic_manager/traffic_manager.cc
+++ b/cmd/traffic_manager/traffic_manager.cc
@@ -295,6 +295,7 @@ static void
set_process_limits(int fds_throttle)
{
struct rlimit lim;
+ rlim_t maxfiles;
// Set needed rlimits (root)
ink_max_out_rlimit(RLIMIT_NOFILE, true, false);
@@ -305,32 +306,28 @@ set_process_limits(int fds_throttle)
ink_max_out_rlimit(RLIMIT_RSS, true, true);
#endif
-#if defined(linux)
- float file_max_pct = 0.9;
- FILE *fd;
+ maxfiles = ink_get_max_files();
+ if (maxfiles != RLIM_INFINITY) {
+ float file_max_pct = 0.9;
- if ((fd = fopen("/proc/sys/fs/file-max","r"))) {
- ATS_UNUSED_RETURN(fscanf(fd, "%lu", &lim.rlim_max));
- fclose(fd);
REC_ReadConfigFloat(file_max_pct, "proxy.config.system.file_max_pct");
- lim.rlim_cur = lim.rlim_max = static_cast<rlim_t>(lim.rlim_max * file_max_pct);
- if (!setrlimit(RLIMIT_NOFILE, &lim) && !getrlimit(RLIMIT_NOFILE, &lim)) {
+ if (file_max_pct > 1.0) {
+ file_max_pct = 1.0;
+ }
+
+ lim.rlim_cur = lim.rlim_max = static_cast<rlim_t>(maxfiles * file_max_pct);
+ if (setrlimit(RLIMIT_NOFILE, &lim) == 0 && getrlimit(RLIMIT_NOFILE, &lim) == 0) {
fds_limit = (int) lim.rlim_cur;
syslog(LOG_NOTICE, "NOTE: RLIMIT_NOFILE(%d):cur(%d),max(%d)",RLIMIT_NOFILE, (int)lim.rlim_cur, (int)lim.rlim_max);
- } else {
- syslog(LOG_NOTICE, "NOTE: Unable to set RLIMIT_NOFILE(%d):cur(%d),max(%d)", RLIMIT_NOFILE, (int)lim.rlim_cur, (int)lim.rlim_max);
}
- } else {
- syslog(LOG_NOTICE, "NOTE: Unable to open /proc/sys/fs/file-max");
}
-#endif // linux
- if (!getrlimit(RLIMIT_NOFILE, &lim)) {
+ if (getrlimit(RLIMIT_NOFILE, &lim) == 0) {
if (fds_throttle > (int) (lim.rlim_cur + FD_THROTTLE_HEADROOM)) {
lim.rlim_cur = (lim.rlim_max = (rlim_t) fds_throttle);
if (!setrlimit(RLIMIT_NOFILE, &lim) && !getrlimit(RLIMIT_NOFILE, &lim)) {
fds_limit = (int) lim.rlim_cur;
- syslog(LOG_NOTICE, "NOTE: RLIMIT_NOFILE(%d):cur(%d),max(%d)",RLIMIT_NOFILE, (int)lim.rlim_cur, (int)lim.rlim_max);
+ syslog(LOG_NOTICE, "NOTE: RLIMIT_NOFILE(%d):cur(%d),max(%d)",RLIMIT_NOFILE, (int)lim.rlim_cur, (int)lim.rlim_max);
}
}
}
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/4a1d1781/lib/ts/ink_sys_control.cc
----------------------------------------------------------------------
diff --git a/lib/ts/ink_sys_control.cc b/lib/ts/ink_sys_control.cc
index d04d2f4..03a6bc9 100644
--- a/lib/ts/ink_sys_control.cc
+++ b/lib/ts/ink_sys_control.cc
@@ -21,9 +21,9 @@
limitations under the License.
*/
-#include "ink_sys_control.h"
-#include "ink_platform.h"
+#include "ink_defs.h"
#include "ink_assert.h"
+#include "ink_sys_control.h"
rlim_t
ink_max_out_rlimit(int which, bool max_it, bool unlim_it)
@@ -63,3 +63,27 @@ ink_max_out_rlimit(int which, bool max_it, bool unlim_it)
ink_release_assert(getrlimit(MAGIC_CAST(which), &rl) >= 0);
return rl.rlim_cur;
}
+
+rlim_t
+ink_get_max_files()
+{
+ FILE *fd;
+ struct rlimit lim;
+
+ // Linux-only ...
+ if ((fd = fopen("/proc/sys/fs/file-max","r"))) {
+ uint64_t fmax;
+ if (fscanf(fd, "%" PRIu64 "", &fmax) == 1) {
+ fclose(fd);
+ return static_cast<rlim_t>(fmax);
+ }
+
+ fclose(fd);
+ }
+
+ if (getrlimit(RLIMIT_NOFILE, &lim) == 0) {
+ return lim.rlim_max;
+ }
+
+ return RLIM_INFINITY;
+}
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/4a1d1781/lib/ts/ink_sys_control.h
----------------------------------------------------------------------
diff --git a/lib/ts/ink_sys_control.h b/lib/ts/ink_sys_control.h
index ad562d7..15e2b2c 100644
--- a/lib/ts/ink_sys_control.h
+++ b/lib/ts/ink_sys_control.h
@@ -26,15 +26,7 @@
#include <sys/resource.h>
-#ifdef __cplusplus
-extern "C"
-{
-#endif /* __cplusplus */
-
rlim_t ink_max_out_rlimit(int which, bool max_it=true, bool unlim_it=true);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
+rlim_t ink_get_max_files();
#endif /*_INK_SYS_CONTROL_H*/
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/4a1d1781/proxy/Main.cc
----------------------------------------------------------------------
diff --git a/proxy/Main.cc b/proxy/Main.cc
index 02ad7de..1696151 100644
--- a/proxy/Main.cc
+++ b/proxy/Main.cc
@@ -796,53 +796,54 @@ init_core_size()
static void
adjust_sys_settings(void)
{
-#if defined(linux)
struct rlimit lim;
- int mmap_max = -1;
int fds_throttle = -1;
- float file_max_pct = 0.9;
- FILE *fd;
+ rlim_t maxfiles;
// TODO: I think we might be able to get rid of this?
+#if defined(ATS_MMAP_MAX)
+ int mmap_max = -1;
+
REC_ReadConfigInteger(mmap_max, "proxy.config.system.mmap_max");
if (mmap_max >= 0)
ats_mallopt(ATS_MMAP_MAX, mmap_max);
+#endif
+
+ maxfiles = ink_get_max_files();
+ if (maxfiles != RLIM_INFINITY) {
+ float file_max_pct = 0.9;
- if ((fd = fopen("/proc/sys/fs/file-max","r"))) {
- ATS_UNUSED_RETURN(fscanf(fd, "%" PRIu64 "", &lim.rlim_max));
- fclose(fd);
REC_ReadConfigFloat(file_max_pct, "proxy.config.system.file_max_pct");
- lim.rlim_cur = lim.rlim_max = static_cast<rlim_t>(lim.rlim_max * file_max_pct);
- if (!setrlimit(RLIMIT_NOFILE, &lim) && !getrlimit(RLIMIT_NOFILE, &lim)) {
+ if (file_max_pct > 1.0) {
+ file_max_pct = 1.0;
+ }
+
+ lim.rlim_cur = lim.rlim_max = static_cast<rlim_t>(maxfiles * file_max_pct);
+ if (setrlimit(RLIMIT_NOFILE, &lim) == 0 && getrlimit(RLIMIT_NOFILE, &lim) == 0) {
fds_limit = (int) lim.rlim_cur;
syslog(LOG_NOTICE, "NOTE: RLIMIT_NOFILE(%d):cur(%d),max(%d)",RLIMIT_NOFILE, (int)lim.rlim_cur, (int)lim.rlim_max);
- } else {
- syslog(LOG_NOTICE, "NOTE: Unable to set RLIMIT_NOFILE(%d):cur(%d),max(%d)", RLIMIT_NOFILE, (int)lim.rlim_cur, (int)lim.rlim_max);
}
- } else {
- syslog(LOG_NOTICE, "NOTE: Unable to open /proc/sys/fs/file-max");
}
REC_ReadConfigInteger(fds_throttle, "proxy.config.net.connections_throttle");
- if (!getrlimit(RLIMIT_NOFILE, &lim)) {
+ if (getrlimit(RLIMIT_NOFILE, &lim) == 0) {
if (fds_throttle > (int) (lim.rlim_cur + THROTTLE_FD_HEADROOM)) {
lim.rlim_cur = (lim.rlim_max = (rlim_t) fds_throttle);
- if (!setrlimit(RLIMIT_NOFILE, &lim) && !getrlimit(RLIMIT_NOFILE, &lim)) {
+ if (setrlimit(RLIMIT_NOFILE, &lim) == 0 && getrlimit(RLIMIT_NOFILE, &lim) == 0) {
fds_limit = (int) lim.rlim_cur;
syslog(LOG_NOTICE, "NOTE: RLIMIT_NOFILE(%d):cur(%d),max(%d)",RLIMIT_NOFILE, (int)lim.rlim_cur, (int)lim.rlim_max);
}
}
}
- ink_max_out_rlimit(RLIMIT_STACK,true,true);
- ink_max_out_rlimit(RLIMIT_DATA,true,true);
+ ink_max_out_rlimit(RLIMIT_STACK, true, true);
+ ink_max_out_rlimit(RLIMIT_DATA, true, true);
ink_max_out_rlimit(RLIMIT_FSIZE, true, false);
+
#ifdef RLIMIT_RSS
- ink_max_out_rlimit(RLIMIT_RSS,true,true);
+ ink_max_out_rlimit(RLIMIT_RSS, true, true);
#endif
-
-#endif // linux check
}
struct ShowStats: public Continuation