]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add mds_max_mem conf item, hook to check memory utilization
authorSage Weil <sage@newdream.net>
Wed, 15 Apr 2009 23:14:10 +0000 (16:14 -0700)
committerSage Weil <sage@newdream.net>
Wed, 15 Apr 2009 23:14:10 +0000 (16:14 -0700)
src/config.cc
src/config.h
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/MDS.cc

index 04d04025b658f7f9bf0e42193987376e2ad810de..b0aaf0df9395f240007c65febacab756805c1855 100644 (file)
@@ -420,6 +420,7 @@ static struct config_option config_optionsp[] = {
        OPTION(journaler_batch_max, 0, OPT_LONGLONG, 0),  // max bytes we'll delay flushing; disable, for now....
        OPTION(mds_cache_size, 0, OPT_INT, 300000),
        OPTION(mds_cache_mid, 0, OPT_FLOAT, .7),
+       OPTION(mds_mem_max, 0, OPT_INT, 1048576),        // KB
        OPTION(mds_decay_halflife, 0, OPT_FLOAT, 5),
        OPTION(mds_beacon_interval, 0, OPT_FLOAT, 4),
        OPTION(mds_beacon_grace, 0, OPT_FLOAT, 15),
index 87b9f33667907a3c41833a4f779e0ad03835221e..c422f1114bb25efbc709dfe772a34cebed072597 100644 (file)
@@ -183,6 +183,7 @@ struct md_config_t {
   // mds
   int   mds_cache_size;
   float mds_cache_mid;
+  int   mds_mem_max;
   
   float mds_decay_halflife;
 
index cf7f0b84d5301aa254579841ee158eb90287c364..8eb2e90e55df40360ee5fe8185336679c789d2d1 100644 (file)
@@ -5095,6 +5095,41 @@ void MDCache::trim_client_leases()
 }
 
 
+void MDCache::check_memory_usage()
+{
+  ifstream f("/proc/self/status");
+  if (!f.is_open()) {
+    dout(0) << "check_memory_usage unable to open /proc/self/status" << dendl;
+    return;
+  }
+
+  int vmsize;
+  int vmrss;
+
+  while (!f.eof()) {
+    string line;
+    getline(f, line);
+    
+    if (strncmp(line.c_str(), "VmSize:", 7) == 0)
+      vmsize = atoi(line.c_str() + 10);
+    else if (strncmp(line.c_str(), "VmRSS:", 6) == 0)
+      vmrss = atoi(line.c_str() + 10);
+  }
+  
+  dout(10) << "check_memory_usage size " << vmsize << ", rss " << vmrss
+          << ", max " << g_conf.mds_mem_max
+          << dendl;
+
+
+  // check client caps
+  float caps_per_inode = (float)num_caps / (float)inode_map.size();
+  //float cap_rate = (float)num_inodes_with_caps / (float)inode_map.size();
+
+  dout(10) << " " << num_inodes_with_caps << " / " << inode_map.size() << " inodes have caps" << dendl;
+  dout(10) << " " << num_caps << " caps, " << caps_per_inode << " caps per inode" << dendl;
+
+}
+
 
 void MDCache::remove_client_cap(CInode *in, int client, bool eval)
 {
index 2fe5e7260bb898812c5f2a7828507e884456a618..76f30ab01b6bbe7e0f0975496c88dc47ee4dcf19 100644 (file)
@@ -427,8 +427,6 @@ public:
     r->ttl = ttl;
   }
 
-  void trim_client_leases();
-
   // -- client caps --
   __u64              last_cap_id;
   
@@ -775,6 +773,9 @@ public:
   void send_expire_messages(map<int, MCacheExpire*>& expiremap);
   void trim_non_auth();      // trim out trimmable non-auth items
 
+  void trim_client_leases();
+  void check_memory_usage();
+
   // shutdown
   void shutdown_start();
   void shutdown_check();
index 8df4ced4655b2e8ca5eb7c4969e6fb5d01da602f..f03ed4d0f0ca7c403498ca16c16f9d0401d1d32a 100644 (file)
@@ -393,6 +393,7 @@ void MDS::tick()
   if (is_active() || is_stopping()) {
     mdcache->trim();
     mdcache->trim_client_leases();
+    mdcache->check_memory_usage();
     mdlog->trim();  // NOT during recovery!
   }