Repository: incubator-trafodion
Updated Branches:
  refs/heads/master 5881cf1c5 -> f6f4402b5


[TRAFODION-2478] Reduce the number of memory monitoring threads in Trafodion 
SQL processes

The memory monitor thread is now moved to mxsscp process and the collected data 
is
stored in RMS shared segment. All SQL proceses have access to it.


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/3d7df2d2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/3d7df2d2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/3d7df2d2

Branch: refs/heads/master
Commit: 3d7df2d24db818ade2c94d58ed9cd01c1c43f847
Parents: 554cd32
Author: selvaganesang <selva.govindara...@esgyn.com>
Authored: Fri Feb 10 23:56:56 2017 +0000
Committer: selvaganesang <selva.govindara...@esgyn.com>
Committed: Sat Feb 11 01:53:02 2017 +0000

----------------------------------------------------------------------
 core/sql/bin/ex_esp_main.cpp       | 17 ++++++++++-------
 core/sql/cli/Globals.cpp           | 24 +++++++++++------------
 core/sql/cli/memorymonitor.cpp     | 34 +++++++++++++++++++--------------
 core/sql/executor/ex_hash_grby.h   |  3 ---
 core/sql/runtimestats/SqlStats.cpp | 12 ++++++++++++
 core/sql/runtimestats/SqlStats.h   |  7 +++++--
 6 files changed, 59 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3d7df2d2/core/sql/bin/ex_esp_main.cpp
----------------------------------------------------------------------
diff --git a/core/sql/bin/ex_esp_main.cpp b/core/sql/bin/ex_esp_main.cpp
index 49d0500..d8bb1eb 100644
--- a/core/sql/bin/ex_esp_main.cpp
+++ b/core/sql/bin/ex_esp_main.cpp
@@ -357,15 +357,18 @@ Int32 runESP(Int32 argc, char** argv, GuaReceiveFastStart 
*guaReceiveFastStart)
   cliGlobals->initiateDefaultContext();
   NAHeap *espIpcHeap = cliGlobals->getIpcHeap();
   IpcEnvironment *ipcEnvPtr = cliGlobals->getEnvironment();
-  //
-  // Start the  memory monitor for dynamic memory management
-  Lng32 memMonitorWindowSize = 10;
-  Lng32 memMonitorSampleInterval = 10;
-  MemoryMonitor memMonitor(memMonitorWindowSize,
+  if (statsGlobals != NULL)
+     cliGlobals->setMemoryMonitor(statsGlobals->getMemoryMonitor());
+  else 
+  {
+     // Start the  memory monitor for dynamic memory management
+     Lng32 memMonitorWindowSize = 10;
+     Lng32 memMonitorSampleInterval = 10;
+     MemoryMonitor memMonitor(memMonitorWindowSize,
                            memMonitorSampleInterval,
                            espExecutorHeap);
-  cliGlobals->setMemoryMonitor(&memMonitor);
-
+     cliGlobals->setMemoryMonitor(&memMonitor);
+  }
   // After CLI globals are initialized but before we begin ESP message
   // processing, have the CLI context set its user identity based on
   // the OS user identity.

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3d7df2d2/core/sql/cli/Globals.cpp
----------------------------------------------------------------------
diff --git a/core/sql/cli/Globals.cpp b/core/sql/cli/Globals.cpp
index 28b970e..95fb000 100644
--- a/core/sql/cli/Globals.cpp
+++ b/core/sql/cli/Globals.cpp
@@ -235,19 +235,7 @@ void CliGlobals::init( NABoolean espProcess,
   if (! espProcess)
   {
     // Create the process global ARKCMP server.
-    // In R1.8, Each context has its own mxcmp.
     sharedArkcmp_ = NULL;
-
-    //sharedArkcmp_->setShared(FALSE);
-    // create the process global memory monitor. For now with
-    // defaults of 10 window entries and sampling every 1 second
-    Lng32 memMonitorWindowSize = 10;
-    Lng32 memMonitorSampleInterval = 1; // reduced from 10 (for M5 - May 2011)
-    memMonitor_ = new(&executorMemory_) MemoryMonitor(memMonitorWindowSize,
-                                                     memMonitorSampleInterval,
-                                                     &executorMemory_);
-
-    //    nextUniqueContextHandle = 2000;
     nextUniqueContextHandle = DEFAULT_CONTEXT_HANDLE;
 
     arlibHeap_ = new (&executorMemory_) NAHeap("MXARLIB Cache Heap",
@@ -322,6 +310,18 @@ void CliGlobals::init( NABoolean espProcess,
     capacities_.setHeap(defaultContext_->exCollHeap());
     freespaces_.setHeap(defaultContext_->exCollHeap());
     largestFragments_.setHeap(defaultContext_->exCollHeap());
+    if (statsGlobals_ != NULL) 
+       memMonitor_ = statsGlobals_->getMemoryMonitor();
+    else
+    {
+       // create the process global memory monitor. For now with
+       // defaults of 10 window entries and sampling every 1 second
+       Lng32 memMonitorWindowSize = 10;
+       Lng32 memMonitorSampleInterval = 1; // reduced from 10 (for M5 - May 
2011)
+       memMonitor_ = new (&executorMemory_) MemoryMonitor(memMonitorWindowSize,
+                                                     memMonitorSampleInterval,
+                                                     &executorMemory_);
+    }
   } // (!espProcess)
 
   else

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3d7df2d2/core/sql/cli/memorymonitor.cpp
----------------------------------------------------------------------
diff --git a/core/sql/cli/memorymonitor.cpp b/core/sql/cli/memorymonitor.cpp
index f9d4af2..b53b3d6 100644
--- a/core/sql/cli/memorymonitor.cpp
+++ b/core/sql/cli/memorymonitor.cpp
@@ -102,12 +102,18 @@ MemoryMonitor::MemoryMonitor(Lng32 windowSize,
 {
   // if the windowSize is 0, we do not need memory monitor.
   assert(windowSize);
-  char buffer[1024];
+  char buffer[2048];
   char *currPtr;
   size_t bytesRead;
   fd_meminfo_ = fopen("/proc/meminfo", "r");
   if (fd_meminfo_) {
-    bytesRead = fread(buffer, 1, 1024, fd_meminfo_);
+    bytesRead = fread(buffer, 1, 2048, fd_meminfo_);
+    if (ferror(fd_meminfo_))
+       assert(false); 
+    if (feof(fd_meminfo_))
+       clearerr(fd_meminfo_); 
+    else
+       buffer[bytesRead] = '\0';
     currPtr = strstr(buffer, "MemTotal");
     if (currPtr) {
       sscanf(currPtr, "%*s " PF64 " kB", &memTotal_);
@@ -223,12 +229,12 @@ void MemoryMonitor::update(float &scale) {
        char * currPtr;
         bytesRead = fread(buffer, 1, 2048, fd_meminfo_);
         // Make sure there wasn't an error (next fseek will clear eof)
-        if (!feof(fd_meminfo_))// Make sure there wasn't an error
-        {
-               scale = 6;
-               pressure_ = 0;
-               return;
-        }
+        if (ferror(fd_meminfo_))
+           assert(false); 
+        if (feof(fd_meminfo_))
+           clearerr(fd_meminfo_); 
+        else
+           buffer[bytesRead] = '\0';
         currPtr = strstr(buffer, "MemFree");
        if (currPtr) sscanf(currPtr, "%*s " PF64 " kB", &memFree);
         currPtr = strstr(buffer, "Committed_AS");
@@ -263,12 +269,12 @@ void MemoryMonitor::update(float &scale) {
                return;
        }
        bytesRead = fread(buffer, 1, 2048, fd_vmstat_);
-        if (!feof(fd_vmstat_))
-        {
-               scale = 6;
-               pressure_ = 0;
-               return;
-        }
+        if (ferror(fd_vmstat_))
+           assert(false); 
+        if (feof(fd_vmstat_))
+           clearerr(fd_vmstat_); 
+        else
+           buffer[bytesRead] = '\0';
         currPtr = strstr(buffer, "pgpgin");
        if (currPtr) sscanf(currPtr, "%*s " PF64 " kB", &pgpgin);
         currPtr = strstr(buffer, "pgpgout");

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3d7df2d2/core/sql/executor/ex_hash_grby.h
----------------------------------------------------------------------
diff --git a/core/sql/executor/ex_hash_grby.h b/core/sql/executor/ex_hash_grby.h
index 6e56fdb..6d80463 100644
--- a/core/sql/executor/ex_hash_grby.h
+++ b/core/sql/executor/ex_hash_grby.h
@@ -65,9 +65,6 @@ class ex_hash_grby_tdb;
 // Classes referenced in this file
 // -----------------------------------------------------------------------
 class ex_tcb;
-#ifndef __EID
-class memoryMonitor;
-#endif
 
 // -----------------------------------------------------------------------
 // ex_hash_grby_tdb

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3d7df2d2/core/sql/runtimestats/SqlStats.cpp
----------------------------------------------------------------------
diff --git a/core/sql/runtimestats/SqlStats.cpp 
b/core/sql/runtimestats/SqlStats.cpp
index 61d9e5a..33ac7de 100644
--- a/core/sql/runtimestats/SqlStats.cpp
+++ b/core/sql/runtimestats/SqlStats.cpp
@@ -134,6 +134,7 @@ void StatsGlobals::init()
   else
     myNodeName[0] = '\0';
   rmsStats_->setNodeName(myNodeName);
+  createMemoryMonitor();
   releaseStatsSemaphore(semId, GetCliGlobals()->myPin(), savedPriority,
             savedStopMode);
   sem_close((sem_t *)semId);
@@ -1688,6 +1689,17 @@ StatsGlobals * shareStatsSegment(Int32 &shmid, NABoolean 
checkForSSMP)
   return statsGlobals;
 }
 
+void StatsGlobals::createMemoryMonitor() 
+{
+
+   // defaults of 10 window entries and sampling every 1 second
+   Lng32 memMonitorWindowSize = 10;
+   Lng32 memMonitorSampleInterval = 1; // reduced from 10 (for M5 - May 2011)
+   memMonitor_ = new (&statsHeap_) MemoryMonitor(memMonitorWindowSize,
+                                                      memMonitorSampleInterval,
+                                                      &statsHeap_);
+}
+
 short getMasterCpu(char *uniqueStmtId, Lng32 uniqueStmtIdLen, char *nodeName, 
short maxLen, short &cpu)
 {
   Int32 nodeNumber = 0;

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3d7df2d2/core/sql/runtimestats/SqlStats.h
----------------------------------------------------------------------
diff --git a/core/sql/runtimestats/SqlStats.h b/core/sql/runtimestats/SqlStats.h
index 849a3b5..18e673b 100644
--- a/core/sql/runtimestats/SqlStats.h
+++ b/core/sql/runtimestats/SqlStats.h
@@ -62,12 +62,14 @@ class RecentSikey;
 class StatsGlobals;
 class ExOperStats;
 class ExProcessStats;
+class MemoryMonitor;
 
 #ifndef __EID
 #include "rts_msg.h"
 #endif
 #include "ComTdb.h"
 #include "SQLCLIdev.h"
+#include "memorymonitor.h"
 
 #define MAX_PID_ARRAY_SIZE 65536
 
@@ -477,7 +479,6 @@ public:
       { abortedSemPid_ = semPid_; }
   Int64 getNewestRevokeTimestamp() const { return newestRevokeTimestamp_; }
   void cleanupOldSikeys(Int64 gcInterval);
-#ifndef __EID
   Lng32 getSecInvalidKeys(
                           CliGlobals * cliGlobals,
                           Int64 lastCallTimestamp,
@@ -487,7 +488,8 @@ public:
 
   void mergeNewSikeys(Int32 numSikeys, 
                     SQL_QIKEY sikeys[]);
-#endif
+  MemoryMonitor *getMemoryMonitor() { return memMonitor_; }
+  void createMemoryMonitor();
 
   void init();
   NABoolean isShmDirty() { return isBeingUpdated_; }
@@ -543,6 +545,7 @@ private:
   pid_t pidToCheck_;
   pid_t maxPid_;
   Int64 ssmpDumpedTimestamp_;
+  MemoryMonitor *memMonitor_;
 };
 StatsGlobals * shareStatsSegment(Int32 &shmid, NABoolean checkForSSMP = TRUE);
 short getMasterCpu(char *uniqueStmtId, Lng32 uniqueStmtIdLen, char *nodeName, 
short maxLen, short &cpu);

Reply via email to