diff options
author | unknown <monty@hundin.mysql.fi> | 2002-10-13 23:42:37 +0300 |
---|---|---|
committer | unknown <monty@hundin.mysql.fi> | 2002-10-13 23:42:37 +0300 |
commit | 61632073ac9473e00d5e0c88078880d3af575828 (patch) | |
tree | 3cc59185e6ff0b8119c4cf1fa01af1f80c80c7c5 | |
parent | 8926c0bc3817150d00a1906e07a6e6b469c4c696 (diff) | |
download | mariadb-git-61632073ac9473e00d5e0c88078880d3af575828.tar.gz |
Allocate HEAP blocks in smaller blocks to get better memory utilization and more speed when used with safemalloc.
Don't initalize memory areas when run with --skip-safemalloc.
Docs/manual.texi:
ChangeLog
heap/heapdef.h:
Allocate HEAP blocks in smaller blocks to get better memory utilization and more speed when used with safemalloc.
heap/hp_open.c:
Allocate HEAP blocks in smaller blocks to get better memory utilization and more speed when used with safemalloc.
mysys/safemalloc.c:
Don't initalize memory areas when run with --skip-safemalloc.
This can in some cases increase speed with 20 times when debugging
-rw-r--r-- | Docs/manual.texi | 4 | ||||
-rw-r--r-- | heap/heapdef.h | 11 | ||||
-rw-r--r-- | heap/hp_open.c | 10 | ||||
-rw-r--r-- | mysys/safemalloc.c | 7 |
4 files changed, 25 insertions, 7 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi index 21bab5ea6e4..86b19c0ff33 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -46929,10 +46929,12 @@ not yet 100% confident in this code. @node News-3.23.54, News-3.23.53, News-3.23.x, News-3.23.x @appendixsubsec Changes in release 3.23.54 @itemize +@item Fixed reference to freed memory when doing complicated @code{GROUP BY ... ORDER BY} queries. Symptom was that @code{mysqld} died in function @code{send_fields}. -queries. +@item +Allocate heap rows in smaller blocks to get better memory usage. @end itemize @node News-3.23.53, News-3.23.52, News-3.23.54, News-3.23.x diff --git a/heap/heapdef.h b/heap/heapdef.h index 938cb55c0eb..6b85e234c5e 100644 --- a/heap/heapdef.h +++ b/heap/heapdef.h @@ -22,6 +22,17 @@ #endif #include "heap.h" /* Structs & some defines */ +/* + When allocating keys /rows in the internal block structure, do it + within the following boundaries. + + The challenge is to find the balance between allocate as few blocks + as possible and keep memory consumption down. +*/ + +#define HP_MIN_RECORDS_IN_BLOCK 16 +#define HP_MAX_RECORDS_IN_BLOCK 8192 + /* Some extern variables */ extern LIST *heap_open_list,*heap_share_list; diff --git a/heap/hp_open.c b/heap/hp_open.c index 692142de14a..e0615879193 100644 --- a/heap/hp_open.c +++ b/heap/hp_open.c @@ -157,8 +157,14 @@ static void init_block(HP_BLOCK *block, uint reclength, ulong min_records, max_records=1000; /* As good as quess as anything */ recbuffer=(uint) (reclength+sizeof(byte**)-1) & ~(sizeof(byte**)-1); records_in_block=max_records/10; - if (records_in_block < 10 && max_records) - records_in_block=10; + if (records_in_block < HP_MIN_RECORDS_IN_BLOCK && max_records) + records_in_block= HP_MIN_RECORDS_IN_BLOCK; + /* + Don't allocate too many rows at one time too keep memory consumption + done when we don't need it. + */ + if (records_in_block > HP_MAX_RECORDS_IN_BLOCK) + records_in_block= HP_MAX_RECORDS_IN_BLOCK; if (!records_in_block || records_in_block*recbuffer > (my_default_record_cache_size-sizeof(HP_PTRS)*HP_MAX_LEVELS)) records_in_block=(my_default_record_cache_size-sizeof(HP_PTRS)* diff --git a/mysys/safemalloc.c b/mysys/safemalloc.c index 34fcfff756c..0bf9341e3c1 100644 --- a/mysys/safemalloc.c +++ b/mysys/safemalloc.c @@ -194,9 +194,7 @@ gptr _mymalloc (uint uSize, const char *sFile, uint uLine, myf MyFlags) pthread_mutex_unlock(&THR_LOCK_malloc); /* Set the memory to the aribtrary wierd value */ -#ifdef HAVE_purify - if (MyFlags & MY_ZEROFILL) -#endif + if ((MyFlags & MY_ZEROFILL) || !sf_malloc_quick) bfill(&pTmp -> aData[sf_malloc_prehunc],uSize, (char) (MyFlags & MY_ZEROFILL ? 0 : ALLOC_VAL)); /* Return a pointer to the real data */ @@ -315,7 +313,8 @@ void _myfree (gptr pPtr, const char *sFile, uint uLine, myf myflags) #ifndef HAVE_purify /* Mark this data as free'ed */ - bfill(&pRec->aData[sf_malloc_prehunc],pRec->uDataSize,(pchar) FREE_VAL); + if (!sf_malloc_quick) + bfill(&pRec->aData[sf_malloc_prehunc],pRec->uDataSize,(pchar) FREE_VAL); #endif *((long*) ((char*) &pRec -> lSpecialValue+sf_malloc_prehunc)) = ~MAGICKEY; |