[prev in list] [next in list] [prev in thread] [next in thread] 

List:       monetdb-checkins
Subject:    MonetDB: default - Take into account all outstanding memory limi...
From:       Martin_Kersten <commits+mk=cwi.nl () monetdb ! org>
Date:       2021-05-28 7:37:15
Message-ID: hg.b077db99e2e3.1622187435.-7512121813876574003 () monetdb-vm0 ! spin-off ! cwi ! nl
[Download RAW message or body]

Changeset: b077db99e2e3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b077db99e2e3
Modified Files:
	monetdb5/mal/mal_client.c
	monetdb5/mal/mal_client.h
	monetdb5/modules/mal/clients.c
	monetdb5/optimizer/opt_mitosis.c
Branch: default
Log Message:

Take into account all outstanding memory limits of active clients
to determine their fare share. If ony thread claims all, then
the remaining threads also receive their fair portion.


diffs (127 lines):

diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -515,6 +515,30 @@ MCactiveClients(void)
 	return active;
 }
 
+/* To determine the average memory claims for assignment, we should calculate the outstanding claims*/
+/* This only concerns active clients and if one query claims all, then all should be divided equally */
+
+size_t
+MCmemoryClaim(void)
+{
+	size_t claim = 0;
+	int active = 1;
+
+	Client cntxt = mal_clients;
+
+	for(cntxt = mal_clients;  cntxt<mal_clients+MAL_MAXCLIENTS; cntxt++)
+	if( cntxt->idle == 0 && cntxt->mode == RUNCLIENT){
+		if(cntxt->memorylimit){
+			claim += cntxt->memorylimit;
+			active ++;
+		} else
+			return GDK_mem_maxsize;
+	}
+	if(active == 0 ||  claim  * LL_CONSTANT(1048576) >= GDK_mem_maxsize)
+		return GDK_mem_maxsize;
+	return claim * LL_CONSTANT(1048576);
+}
+
 void
 MCcloseClient(Client c)
 {
diff --git a/monetdb5/mal/mal_client.h b/monetdb5/mal/mal_client.h
--- a/monetdb5/mal/mal_client.h
+++ b/monetdb5/mal/mal_client.h
@@ -192,6 +192,7 @@ mal_export Client  MCinitClient(oid user
 mal_export Client  MCforkClient(Client father);
 mal_export void	   MCstopClients(Client c);
 mal_export int	   MCactiveClients(void);
+mal_export size_t  MCmemoryClaim(void);
 mal_export void    MCcloseClient(Client c);
 mal_export str     MCsuspendClient(int id);
 mal_export str     MCawakeClient(int id);
diff --git a/monetdb5/modules/mal/clients.c b/monetdb5/modules/mal/clients.c
--- a/monetdb5/modules/mal/clients.c
+++ b/monetdb5/modules/mal/clients.c
@@ -307,6 +307,9 @@ CLTsetmemorylimit(Client cntxt, MalBlkPt
 		limit = *getArgReference_int(stk,pci,1);
 	}
 
+	if( limit > (int)(GDK_mem_maxsize / LL_CONSTANT(1048576)) )
+		throw(MAL,"clients.setmemorylimit","Memory claim beyond physical memory ");
+
 	if( idx < 0 || idx > MAL_MAXCLIENTS)
 		throw(MAL,"clients.setmemorylimit","Illegal session id");
 	if( is_int_nil(limit))
diff --git a/monetdb5/optimizer/opt_mitosis.c b/monetdb5/optimizer/opt_mitosis.c
--- a/monetdb5/optimizer/opt_mitosis.c
+++ b/monetdb5/optimizer/opt_mitosis.c
@@ -19,10 +19,9 @@ OPTmitosisImplementation(Client cntxt, M
 	str schema = 0, table = 0;
 	BUN r = 0, rowcnt = 0;    /* table should be sizeable to consider parallel execution*/
 	InstrPtr q, *old, target = 0;
-	size_t argsize = 6 * sizeof(lng), m = 0;
+	size_t argsize = 6 * sizeof(lng), m = 0, memclaim;
 	/*     estimate size per operator estimate:   4 args + 2 res*/
 	int threads = GDKnr_threads ? GDKnr_threads : 1;
-	int activeClients;
 	char buf[256];
 	lng usec = GDKusec();
 	str msg = MAL_SUCCEED;
@@ -143,36 +142,44 @@ OPTmitosisImplementation(Client cntxt, M
 	 * because all user together are responsible for resource contentions
 	 */
 	cntxt->idle = 0; // this one is definitely not idle
-	activeClients = MCactiveClients();
 
 /* This code was used to experiment with block sizes, mis-using the memorylimit  variable
 	if (cntxt->memorylimit){
 		// the new mitosis scheme uses a maximum chunck size in MB from the client context
-		m = (size_t) ((cntxt->memorylimit * 1024 *1024) / row_size);
+		m = (size_t) ((cntxt->memorylimit *  LL_CONSTANT(1048576)) / row_size);
 		pieces = (int) (rowcnt / m + (rowcnt - m * pieces > 0));
 	}
 	if (cntxt->memorylimit == 0 || pieces <= 1){
 */
 	if (pieces <= 1){
-		/* We haven't assigned the number of pieces.*/
+		/* We haven't assigned the number of pieces.
+		 * Determine the memory available for this client
+		 */
 
-		/* respect the memory limit size set for the user */
+		/* respect the memory limit size set for the user 
+		* and determine the column slice size 
+		*/
 		if( cntxt->memorylimit)
-			m = cntxt->memorylimit * 1024 *1024 / argsize;
-		else
-			m = GDK_mem_maxsize / argsize;
+			m = cntxt->memorylimit *  LL_CONSTANT(1048576) / argsize;
+		else {
+			memclaim= MCmemoryClaim();
+			if(memclaim == GDK_mem_maxsize){
+				m = GDK_mem_maxsize / MCactiveClients()/ argsize;
+			} else
+				m = (GDK_mem_maxsize - memclaim) / argsize;
+		}
 
 		/* if data exceeds memory size,
 		 * i.e., (rowcnt*argsize > GDK_mem_maxsize),
 		 * i.e., (rowcnt > GDK_mem_maxsize/argsize = m) */
-		if (rowcnt > m && m / threads / activeClients > 0) {
+		if (rowcnt > m && m / threads > 0) {
 			/* create |pieces| > |threads| partitions such that
 			 * |threads| partitions at a time fit in memory,
 			 * i.e., (threads*(rowcnt/pieces) <= m),
 			 * i.e., (rowcnt/pieces <= m/threads),
 			 * i.e., (pieces => rowcnt/(m/threads))
 			 * (assuming that (m > threads*MINPARTCNT)) */
-			pieces = (int) (rowcnt / (m / threads / activeClients)) + 1;
+			pieces = (int) (rowcnt / (m / threads)) + 1;
 		} else if (rowcnt > MINPARTCNT) {
 		/* exploit parallelism, but ensure minimal partition size to
 		 * limit overhead */
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic