From: Date: July 3 2008 7:28pm Subject: Re: mutex contention for the query cache List-Archive: http://lists.mysql.com/internals/35778 Message-Id: MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Things have changed from 5.0.37 to 5.0.62. Someone added spin lock behavior for non-windows platforms. Work is still done to initialize the search key after the lock is obtained. But that work does not include memory allocation. Any chance the inlined spin lock can get put into a class so we have some chance of reuse? From Query_cache::send_result_to_client(): #ifdef __WIN__ STRUCT_LOCK(&structure_guard_mutex); #else stop_time= my_clock()+(ulong)lock_time_treshold*CLOCKS_PER_SEC; while ((lock_status= pthread_mutex_trylock(&structure_guard_mutex)) == EBUSY && spin_count < spin_treshold && new_time < stop_time) { spin_count++; if (spin_count%5) new_time= my_clock(); my_sleep(0); } if (lock_status != 0) { /* Query cache is too busy doing something else. Fall back on ordinary statement execution. We also mark this query as unsafe to cache because otherwise this thread will still be halted when the result set is stored to the cache. */ thd->lex->safe_to_cache_query= FALSE; goto err; } #endif On Thu, Jul 3, 2008 at 10:20 AM, MARK CALLAGHAN wrote: > The query cache has a mutex that is locked while it is searched. This > is not a spin lock, so many threads will go to sleep when there is > contention. And it is made worse because work is done to create the > search key in Query_cache::send_result_to_client() (work == memory > allocation and other byte copying) after the mutex is locked. > > Are there plans to fix this? > I don't have benchmark results (yet), but I am willing to bet that > this is a problem. > > -- > Mark Callaghan > mdcallag@stripped > -- Mark Callaghan mdcallag@stripped