You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by se...@apache.org on 2017/02/14 21:05:39 UTC

[1/3] incubator-trafodion git commit: [TRAFODION-2478] Reduce the number of memory monitoring threads in Trafodion SQL processes

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 <se...@esgyn.com>
Authored: Fri Feb 10 23:56:56 2017 +0000
Committer: selvaganesang <se...@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);


[3/3] incubator-trafodion git commit: Merge [TRAFODION-2478] PR 953 Reduce the number of memory monitoring threads in Trafodion

Posted by se...@apache.org.
Merge [TRAFODION-2478] PR 953 Reduce the number of memory monitoring threads in Trafodion


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

Branch: refs/heads/master
Commit: f6f4402b5a1438b96f551968b9c7371d0d2e2c29
Parents: 5881cf1 8ba597f
Author: selvaganesang <se...@apache.org>
Authored: Tue Feb 14 21:04:54 2017 +0000
Committer: selvaganesang <se...@apache.org>
Committed: Tue Feb 14 21:04:54 2017 +0000

----------------------------------------------------------------------
 core/sql/bin/ex_esp_main.cpp       | 18 ++++++++-----
 core/sql/cli/Globals.cpp           | 24 ++++++++---------
 core/sql/cli/memorymonitor.cpp     | 47 ++++++++++++++++++---------------
 core/sql/cli/memorymonitor.h       | 17 +++++-------
 core/sql/executor/ex_hash_grby.h   |  3 ---
 core/sql/runtimestats/SqlStats.cpp | 12 +++++++++
 core/sql/runtimestats/SqlStats.h   |  7 +++--
 7 files changed, 73 insertions(+), 55 deletions(-)
----------------------------------------------------------------------



[2/3] incubator-trafodion git commit: [TRAFODION-2478] Reduce the number of memory monitoring threads in Trafodion SQL processes

Posted by se...@apache.org.
[TRAFODION-2478] Reduce the number of memory monitoring threads in Trafodion SQL processes

Rework as per the review comments


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

Branch: refs/heads/master
Commit: 8ba597f3d081737e9e62bfdbc861d2bba7bd0a36
Parents: 3d7df2d
Author: selvaganesang <se...@esgyn.com>
Authored: Fri Feb 10 23:56:56 2017 +0000
Committer: selvaganesang <se...@esgyn.com>
Committed: Tue Feb 14 00:06:28 2017 +0000

----------------------------------------------------------------------
 core/sql/bin/ex_esp_main.cpp   |  5 +++--
 core/sql/cli/memorymonitor.cpp | 29 ++++++++++++++---------------
 core/sql/cli/memorymonitor.h   | 17 +++++++----------
 3 files changed, 24 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/8ba597f3/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 d8bb1eb..b377c63 100644
--- a/core/sql/bin/ex_esp_main.cpp
+++ b/core/sql/bin/ex_esp_main.cpp
@@ -364,10 +364,11 @@ Int32 runESP(Int32 argc, char** argv, GuaReceiveFastStart *guaReceiveFastStart)
      // Start the  memory monitor for dynamic memory management
      Lng32 memMonitorWindowSize = 10;
      Lng32 memMonitorSampleInterval = 10;
-     MemoryMonitor memMonitor(memMonitorWindowSize,
+     MemoryMonitor *memMonitor = new (espExecutorHeap) 
+                           MemoryMonitor(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

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/8ba597f3/core/sql/cli/memorymonitor.cpp
----------------------------------------------------------------------
diff --git a/core/sql/cli/memorymonitor.cpp b/core/sql/cli/memorymonitor.cpp
index b53b3d6..33abc00 100644
--- a/core/sql/cli/memorymonitor.cpp
+++ b/core/sql/cli/memorymonitor.cpp
@@ -59,6 +59,7 @@ extern "C" Lng32 __stdcall
 PdhOpenQuery (LPCSTR  szD, DWORD  dw, HQUERY  *phQ );
 #endif
 
+#define FREAD_BUFFER_SIZE 2048
 
 //SQ_LINUX #ifdef NA_WINNT
 
@@ -66,7 +67,7 @@ NABoolean MemoryMonitor::threadIsCreated_ = 0;
 HANDLE MemoryMonitor::updateThread_ = (HANDLE) 0;
 ULng32 MemoryMonitor::threadId_ = 0;
 
-DWORD WINAPI memMonitorUpdateThread(void * param) {
+DWORD WINAPI MemoryMonitor::memMonitorUpdateThread(void * param) {
   // params points to the memory monitor object
   MemoryMonitor *memMonitor = (MemoryMonitor*) param;
   Lng32 sleepTime = memMonitor->getSampleInterval();
@@ -102,18 +103,17 @@ MemoryMonitor::MemoryMonitor(Lng32 windowSize,
 {
   // if the windowSize is 0, we do not need memory monitor.
   assert(windowSize);
-  char buffer[2048];
+  char buffer[FREAD_BUFFER_SIZE+1];
   char *currPtr;
-  size_t bytesRead;
+  size_t bytesRead = 0;
   fd_meminfo_ = fopen("/proc/meminfo", "r");
   if (fd_meminfo_) {
-    bytesRead = fread(buffer, 1, 2048, fd_meminfo_);
+    bytesRead = fread(buffer, 1, FREAD_BUFFER_SIZE, fd_meminfo_);
     if (ferror(fd_meminfo_))
        assert(false); 
     if (feof(fd_meminfo_))
        clearerr(fd_meminfo_); 
-    else
-       buffer[bytesRead] = '\0';
+    buffer[bytesRead] = '\0';
     currPtr = strstr(buffer, "MemTotal");
     if (currPtr) {
       sscanf(currPtr, "%*s " PF64 " kB", &memTotal_);
@@ -152,7 +152,7 @@ MemoryMonitor::MemoryMonitor(Lng32 windowSize,
     {
       // and finally start the update thread
       updateThread_ = CreateNewThread(
-                           &memMonitorUpdateThread, // Thread func
+                           &MemoryMonitor::memMonitorUpdateThread, // Thread func
                            this );   // Argument for thread
       threadIsCreated_ = TRUE;
     }
@@ -222,19 +222,18 @@ void MemoryMonitor::update(float &scale) {
         Int32 success = fseek(fd_meminfo_, 0, SEEK_SET);
         if (success != 0)
                 return;
-	char buffer[4096];
+	char buffer[FREAD_BUFFER_SIZE+1];
 	Int64 memFree = -1, memCommitAS = 0;
 	Int64 pgpgout = -1, pgpgin = -1;
-	size_t bytesRead;
+	size_t bytesRead = 0;
 	char * currPtr;
-        bytesRead = fread(buffer, 1, 2048, fd_meminfo_);
+        bytesRead = fread(buffer, 1, FREAD_BUFFER_SIZE, fd_meminfo_);
         // Make sure there wasn't an error (next fseek will clear eof)
         if (ferror(fd_meminfo_))
            assert(false); 
         if (feof(fd_meminfo_))
            clearerr(fd_meminfo_); 
-        else
-           buffer[bytesRead] = '\0';
+        buffer[bytesRead] = '\0';
         currPtr = strstr(buffer, "MemFree");
 	if (currPtr) sscanf(currPtr, "%*s " PF64 " kB", &memFree);
         currPtr = strstr(buffer, "Committed_AS");
@@ -268,13 +267,13 @@ void MemoryMonitor::update(float &scale) {
 		pressure_ = 0;
 		return;
 	}
-	bytesRead = fread(buffer, 1, 2048, fd_vmstat_);
+        bytesRead = 0;
+	bytesRead = fread(buffer, 1, FREAD_BUFFER_SIZE, fd_vmstat_);
         if (ferror(fd_vmstat_))
            assert(false); 
         if (feof(fd_vmstat_))
            clearerr(fd_vmstat_); 
-        else
-           buffer[bytesRead] = '\0';
+        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/8ba597f3/core/sql/cli/memorymonitor.h
----------------------------------------------------------------------
diff --git a/core/sql/cli/memorymonitor.h b/core/sql/cli/memorymonitor.h
index 9ddefc0..fe109e1 100644
--- a/core/sql/cli/memorymonitor.h
+++ b/core/sql/cli/memorymonitor.h
@@ -50,7 +50,8 @@
 // NT performance data helper DLL.
 
 // The memory monitor itself. There is one instance of MemoryMonitor per
-// process (executor, ESP, or external sort process)
+// node. The MXSSCP process on the node creates a thread to constantly update
+// the MemoryMonitor object values
 class MemoryMonitor : public NABasicObject {
 public:
   // windowSize is the number of entries in the slinding window  we keep
@@ -59,19 +60,11 @@ public:
   MemoryMonitor(Lng32 windowSize, Lng32 sampleInterval, CollHeap *heap);
   ~MemoryMonitor();
 
-//SQ_LINUX #ifdef NA_WINNT
-
   // calculate the memory pressure indicator. This indicator has a value between 0
   // (no pressure) and 99 (system is in deep, deep trouble). It is up to the
   // caller to decide on the action to take based on this value
- Lng32 memoryPressure();
-
-  // explicitly update the performance counters in the MemoryMonitor.
-  // Whenever an operator changed its memory consumption significantly, the
-  // counters should be updated to reflect the change
-  void update(float &scale);
+  Lng32 memoryPressure();
 
-  void updatePageFaultRate(Int64 pageFaultValue);
   inline float getPageFaultRate() {  return pageFaultRate_; }
 
   inline Lng32 getSampleInterval() const { return sampleInterval_; };
@@ -83,6 +76,10 @@ public:
 
   inline void setEnable(NABoolean b) { enable_ = b; }
   Int64 availablePhyMemKb() { return memFree_; }
+  static DWORD WINAPI memMonitorUpdateThread(void * param);
+private:
+  void update(float &scale);
+  void updatePageFaultRate(Int64 pageFaultValue);
 
 private: