diff options
author | unknown <heikki@hundin.mysql.fi> | 2003-10-17 20:31:17 +0300 |
---|---|---|
committer | unknown <heikki@hundin.mysql.fi> | 2003-10-17 20:31:17 +0300 |
commit | 6713bb090d81a6e2b48ecf0fb28b85e0d3ae1ee1 (patch) | |
tree | d473f98277e854ae19c405a54f5e24d928c93764 /innobase | |
parent | 6795b2642b155e64e73aa7571f30b84b090c3636 (diff) | |
download | mariadb-git-6713bb090d81a6e2b48ecf0fb28b85e0d3ae1ee1.tar.gz |
thr0loc.c, srv0start.c, srv0srv.c, srv0srv.h, os0thread.h:
Reduce InnoDB memory allocation if buffer pool < 8 MB
innobase/include/os0thread.h:
Reduce InnoDB memory allocation if buffer pool < 8 MB
innobase/include/srv0srv.h:
Reduce InnoDB memory allocation if buffer pool < 8 MB
innobase/srv/srv0srv.c:
Reduce InnoDB memory allocation if buffer pool < 8 MB
innobase/srv/srv0start.c:
Reduce InnoDB memory allocation if buffer pool < 8 MB
innobase/thr/thr0loc.c:
Reduce InnoDB memory allocation if buffer pool < 8 MB
Diffstat (limited to 'innobase')
-rw-r--r-- | innobase/include/os0thread.h | 11 | ||||
-rw-r--r-- | innobase/include/srv0srv.h | 2 | ||||
-rw-r--r-- | innobase/srv/srv0srv.c | 13 | ||||
-rw-r--r-- | innobase/srv/srv0start.c | 26 | ||||
-rw-r--r-- | innobase/thr/thr0loc.c | 1 |
5 files changed, 41 insertions, 12 deletions
diff --git a/innobase/include/os0thread.h b/innobase/include/os0thread.h index 491d8866af4..554ca0563e4 100644 --- a/innobase/include/os0thread.h +++ b/innobase/include/os0thread.h @@ -15,14 +15,9 @@ Created 9/8/1995 Heikki Tuuri /* 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 can wait inside InnoDB */ -#if defined(__WIN__) || defined(__NETWARE__) -/* Create less event semaphores because Win 98/ME had difficult creating -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 + +#define OS_THREAD_MAX_N srv_max_n_threads + /* Possible fixed priorities for threads */ #define OS_THREAD_PRIORITY_NONE 100 diff --git a/innobase/include/srv0srv.h b/innobase/include/srv0srv.h index 094b95e68d3..6e47c468d26 100644 --- a/innobase/include/srv0srv.h +++ b/innobase/include/srv0srv.h @@ -87,6 +87,8 @@ extern ulint srv_max_dirty_pages_pct; extern ulint srv_force_recovery; extern ulint srv_thread_concurrency; +extern ulint srv_max_n_threads; + extern lint srv_conc_n_threads; extern ibool srv_fast_shutdown; diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index e16073c171c..2f3502f99ad 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -180,6 +180,12 @@ the user from forgetting the innodb_force_recovery keyword to my.cnf */ 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: 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 @@ -219,7 +225,7 @@ struct srv_conc_slot_struct{ UT_LIST_BASE_NODE_T(srv_conc_slot_t) srv_conc_queue; /* queue of threads 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 */ /* Number of times a thread is allowed to enter InnoDB within the same @@ -1712,6 +1718,8 @@ srv_init(void) 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++) { conc_slot = srv_conc_slots + i; conc_slot->reserved = FALSE; @@ -1758,7 +1766,7 @@ srv_conc_enter_innodb( thread */ { ibool has_slept = FALSE; - srv_conc_slot_t* slot; + srv_conc_slot_t* slot = NULL; ulint i; char err_buf[1000]; @@ -1835,6 +1843,7 @@ retry: slot = srv_conc_slots + i; if (!slot->reserved) { + break; } } diff --git a/innobase/srv/srv0start.c b/innobase/srv/srv0start.c index 5de87038bde..83cde6e6589 100644 --- a/innobase/srv/srv0start.c +++ b/innobase/srv/srv0start.c @@ -1138,10 +1138,32 @@ innobase_start_or_create_for_mysql(void) srv_file_flush_method_str); 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) { + /* Here we still have srv_pool_size counted + in kilobytes, 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 /* Note that the call srv_boot() also changes the values of srv_pool_size etc. to the units used by InnoDB internally */ - + err = srv_boot(); if (err != DB_SUCCESS) { diff --git a/innobase/thr/thr0loc.c b/innobase/thr/thr0loc.c index fbf3e3a1dad..839cb024f25 100644 --- a/innobase/thr/thr0loc.c +++ b/innobase/thr/thr0loc.c @@ -14,6 +14,7 @@ Created 10/5/1995 Heikki Tuuri #include "sync0sync.h" #include "hash0hash.h" #include "mem0mem.h" +#include "srv0srv.h" /* IMPLEMENTATION OF THREAD LOCAL STORAGE |