thr0loc.c, srv0start.c, srv0srv.c, srv0srv.h, os0thread.h, ha_innodb.cc:

  Backport from 4.1: reduce InnoDB memory consumption if buf pool < 8 MB
parent 4aedeb3a
...@@ -15,14 +15,9 @@ Created 9/8/1995 Heikki Tuuri ...@@ -15,14 +15,9 @@ Created 9/8/1995 Heikki Tuuri
/* Maximum number of threads which can be created in the program; /* Maximum number of threads which can be created in the program;
this is also the size of the wait slot array for MySQL threads which this is also the size of the wait slot array for MySQL threads which
can wait inside InnoDB */ can wait inside InnoDB */
#if defined(__WIN__) || defined(__NETWARE__)
/* Create less event semaphores because Win 98/ME had difficult creating #define OS_THREAD_MAX_N srv_max_n_threads
40000 event semaphores */
/* TODO: these just take a lot of memory on NetWare. should netware move up? */
#define OS_THREAD_MAX_N 1000
#else
#define OS_THREAD_MAX_N 10000
#endif
/* Possible fixed priorities for threads */ /* Possible fixed priorities for threads */
#define OS_THREAD_PRIORITY_NONE 100 #define OS_THREAD_PRIORITY_NONE 100
......
...@@ -80,6 +80,8 @@ extern ulint srv_max_dirty_pages_pct; ...@@ -80,6 +80,8 @@ extern ulint srv_max_dirty_pages_pct;
extern ulint srv_force_recovery; extern ulint srv_force_recovery;
extern ulint srv_thread_concurrency; extern ulint srv_thread_concurrency;
extern ulint srv_max_n_threads;
extern lint srv_conc_n_threads; extern lint srv_conc_n_threads;
extern ibool srv_fast_shutdown; extern ibool srv_fast_shutdown;
......
...@@ -142,7 +142,7 @@ byte srv_latin1_ordering[256] /* The sort order table of the latin1 ...@@ -142,7 +142,7 @@ byte srv_latin1_ordering[256] /* The sort order table of the latin1
ulint srv_pool_size = ULINT_MAX; /* size in database pages; ulint srv_pool_size = ULINT_MAX; /* size in database pages;
MySQL originally sets this MySQL originally sets this
value in megabytes */ value in bytes */
ulint srv_mem_pool_size = ULINT_MAX; /* size in bytes */ ulint srv_mem_pool_size = ULINT_MAX; /* size in bytes */
ulint srv_lock_table_size = ULINT_MAX; ulint srv_lock_table_size = ULINT_MAX;
...@@ -169,6 +169,12 @@ the user from forgetting the innodb_force_recovery keyword to my.cnf */ ...@@ -169,6 +169,12 @@ the user from forgetting the innodb_force_recovery keyword to my.cnf */
ulint srv_force_recovery = 0; ulint srv_force_recovery = 0;
/*-----------------------*/ /*-----------------------*/
/* We are prepared for a situation that we have this many threads waiting for
a semaphore inside InnoDB. innobase_start_or_create_for_mysql() sets the
value. */
ulint srv_max_n_threads = 0;
/* The following controls how many threads we let inside InnoDB concurrently: /* The following controls how many threads we let inside InnoDB concurrently:
threads waiting for locks are not counted into the number because otherwise threads waiting for locks are not counted into the number because otherwise
we could get a deadlock. MySQL creates a thread for each user session, and we could get a deadlock. MySQL creates a thread for each user session, and
...@@ -208,7 +214,7 @@ struct srv_conc_slot_struct{ ...@@ -208,7 +214,7 @@ struct srv_conc_slot_struct{
UT_LIST_BASE_NODE_T(srv_conc_slot_t) srv_conc_queue; /* queue of threads UT_LIST_BASE_NODE_T(srv_conc_slot_t) srv_conc_queue; /* queue of threads
waiting to get in */ waiting to get in */
srv_conc_slot_t srv_conc_slots[OS_THREAD_MAX_N]; /* array of wait srv_conc_slot_t* srv_conc_slots; /* array of wait
slots */ slots */
/* Number of times a thread is allowed to enter InnoDB within the same /* Number of times a thread is allowed to enter InnoDB within the same
...@@ -1694,6 +1700,8 @@ srv_init(void) ...@@ -1694,6 +1700,8 @@ srv_init(void)
UT_LIST_INIT(srv_conc_queue); UT_LIST_INIT(srv_conc_queue);
srv_conc_slots = mem_alloc(OS_THREAD_MAX_N * sizeof(srv_conc_slot_t));
for (i = 0; i < OS_THREAD_MAX_N; i++) { for (i = 0; i < OS_THREAD_MAX_N; i++) {
conc_slot = srv_conc_slots + i; conc_slot = srv_conc_slots + i;
conc_slot->reserved = FALSE; conc_slot->reserved = FALSE;
...@@ -1740,7 +1748,7 @@ srv_conc_enter_innodb( ...@@ -1740,7 +1748,7 @@ srv_conc_enter_innodb(
thread */ thread */
{ {
ibool has_slept = FALSE; ibool has_slept = FALSE;
srv_conc_slot_t* slot; srv_conc_slot_t* slot = NULL;
ulint i; ulint i;
char err_buf[1000]; char err_buf[1000];
......
...@@ -1087,6 +1087,28 @@ innobase_start_or_create_for_mysql(void) ...@@ -1087,6 +1087,28 @@ innobase_start_or_create_for_mysql(void)
return(DB_ERROR); return(DB_ERROR);
} }
/* Set the maximum number of threads which can wait for a semaphore
inside InnoDB */
#if defined(__WIN__) || defined(__NETWARE__)
/* Create less event semaphores because Win 98/ME had difficulty creating
40000 event semaphores.
Comment from Novell, Inc.: also, these just take a lot of memory on
NetWare. */
srv_max_n_threads = 1000;
#else
if (srv_pool_size >= 8 * 1024 * 1024) {
/* Here we still have srv_pool_size counted
in bytes, srv_boot converts the value to
pages; if buffer pool is less than 8 MB,
assume fewer threads. */
srv_max_n_threads = 10000;
} else {
srv_max_n_threads = 1000; /* saves several MB of memory,
especially in 64-bit
computers */
}
#endif
err = srv_boot(); err = srv_boot();
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
......
...@@ -14,6 +14,7 @@ Created 10/5/1995 Heikki Tuuri ...@@ -14,6 +14,7 @@ Created 10/5/1995 Heikki Tuuri
#include "sync0sync.h" #include "sync0sync.h"
#include "hash0hash.h" #include "hash0hash.h"
#include "mem0mem.h" #include "mem0mem.h"
#include "srv0srv.h"
/* /*
IMPLEMENTATION OF THREAD LOCAL STORAGE IMPLEMENTATION OF THREAD LOCAL STORAGE
......
...@@ -17,11 +17,6 @@ ...@@ -17,11 +17,6 @@
/* This file defines the InnoDB handler: the interface between MySQL and /* This file defines the InnoDB handler: the interface between MySQL and
InnoDB */ InnoDB */
/* TODO list for the InnoDB handler:
- Ask Monty if strings of different languages can exist in the same
database. Answer: in 4.1 yes.
*/
#ifdef __GNUC__ #ifdef __GNUC__
#pragma implementation // gcc: Class implementation #pragma implementation // gcc: Class implementation
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment