<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Transactions on InnoDB &#187; Performance</title>
	<atom:link href="http://blogs.innodb.com/wp/tag/performance/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.innodb.com/wp</link>
	<description>&#34;The word&#34; about InnoDB Products and Technology</description>
	<lastBuildDate>Fri, 23 Dec 2011 11:17:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Improving InnoDB memory usage</title>
		<link>http://blogs.innodb.com/wp/2011/12/improving-innodb-memory-usage/</link>
		<comments>http://blogs.innodb.com/wp/2011/12/improving-innodb-memory-usage/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 18:08:42 +0000</pubDate>
		<dc:creator>Vasil Dimov</dc:creator>
				<category><![CDATA[Bug fix]]></category>
		<category><![CDATA[InnoDB Builtin]]></category>
		<category><![CDATA[InnoDB Plugin]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[fragmentation]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[leak]]></category>
		<category><![CDATA[Memory]]></category>
		<category><![CDATA[oom]]></category>

		<guid isPermaLink="false">http://blogs.innodb.com/wp/?p=1510</guid>
		<description><![CDATA[Last month we did a few improvements in InnoDB memory usage. We solved a challenging issue about how InnoDB uses memory in certain places of the code. The symptom of the issue was that under a certain workloads the memory used by InnoDB kept growing infinitely, until OOM killer kicked in. It looked like a [...]]]></description>
			<content:encoded><![CDATA[<p>Last month we did a few improvements in InnoDB memory usage. We solved a challenging issue about how InnoDB uses memory in certain places of the code.</p>
<p>The symptom of the issue was that under a certain workloads the memory used by InnoDB kept growing infinitely, until <a href="http://en.wikipedia.org/wiki/Out_of_memory" title="OOM killer" target="_blank">OOM killer</a> kicked in. It looked like a memory leak, but <a href="http://valgrind.org/" title="Valgrind" target="_blank">Valgrind</a> wasn&#8217;t reporting any leaks and the issue was not reproducible on FreeBSD &#8211; it only happened on Linux (see <a href="http://bugs.mysql.com/57480" title="Bug#57480" target="_blank">Bug#57480</a>). Especially the latest fact lead us to think that there is something in the InnoDB memory usage pattern that reveals a nasty side of the otherwise good-natured Linux&#8217;s memory manager.</p>
<p>It turned out to be an interesting <a href="http://en.wikipedia.org/wiki/Fragmentation_(computing)" title="memory fragmentation" target="_blank">memory fragmentation</a> caused by a storm of malloc/free calls of various sizes. We had to track and analyze <strong>each</strong> call to malloc during the workload, including the code path that lead to it. We collected a huge set of analysis data &#8211; some code paths were executed many 10&#8217;000s of times! A hurricane of allocations and deallocations! We looked at the hottest ones hoping that some of them are not necessary, can be eliminated, avoided, minimized or stuck together. Luckily there were plenty of them!</p>
<p>After an extensive testing we did a numerous improvements, allocating the smallest chunks of the memory from the stack instead of from the heap, grouping allocations together where possible, removing unnecessary allocations altogether, estimating exactly how much memory will be consumed by a given operation and allocating it in advance and others and others and others.</p>
<p>This not only fixed <a href="http://bugs.mysql.com/57480" title="Bug#57480" target="_blank">Bug#57480</a> but improved InnoDB memory usage in general.</p>
<p><span id="more-1510"></span></p>
<p>Note: the fix is not in the 5.6.4 release.</p>
<p>Continues with some numbers <a href="http://blogs.innodb.com/wp/2011/12/improving-innodb-memory-usage-continued/">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.innodb.com/wp/2011/12/improving-innodb-memory-usage/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Better scaling of read-only workloads</title>
		<link>http://blogs.innodb.com/wp/2011/12/better-scaling-of-read-only-workloads/</link>
		<comments>http://blogs.innodb.com/wp/2011/12/better-scaling-of-read-only-workloads/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 17:55:12 +0000</pubDate>
		<dc:creator>Sunny Bains</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[auto commit]]></category>
		<category><![CDATA[read only]]></category>
		<category><![CDATA[Transactions]]></category>

		<guid isPermaLink="false">http://blogs.innodb.com/wp/?p=1500</guid>
		<description><![CDATA[The problem and its cause There have been several complaints over the years about InnoDB&#8217;s inability to scale beyond 256 connections. One of the main issues behind this scalability bottleneck was the read view creation that is required for MVCC (Multi Version Concurrency Control) to work. When the user starts a transaction this is what [...]]]></description>
			<content:encoded><![CDATA[<p><strong>The problem and its cause<br />
</strong></p>
<p>There have been several complaints over the years about InnoDB&#8217;s inability to scale beyond 256 connections. One of the main issues behind this scalability bottleneck was the read view creation that is required for MVCC (Multi Version Concurrency Control) to work. When the user starts a transaction this is what InnoDB does under the hood:</p>
<ul>
<li>Create or reuse a transaction instance &#8211; usually it is reused, the transactions are reused from a pool (trx_sys_t::mysql_trx_list).</li>
<li>Initialize the transaction start time and assign a rollback segment</li>
<li>Append the transaction to an active  transaction list ordered on trx_t::id in descending order</li>
</ul>
<p>The append to  the trx_sys_t::trx_list and corresponding remove during commit is covered by trx_sys_t::mutex. After the transaction is &#8220;started&#8221; and if the transaction has an isolation greater than or equal to <strong>REPEATABLE-READ</strong> then before the first record/row is accessed by the transaction, InnoDB creates a view (snapshot) of the running system state. It does this by examining the transactions that are active at the time of the MVCC snapshot, so that their changes can be excluded from the creating transaction&#8217;s read view. This read view creation is also covered by the trx_sys_t::mutex. As the number of active transactions in the system increases this read view creation takes longer and longer. This increases the wait times on the trx_sys_t::mutex (during transaction start and commit) and once threads are forced to wait on a condition variable (in contrast to simply spinning while waiting for the mutex) the system throughput drops dramatically.</p>
<p><strong>The solution</strong></p>
<p>While investigating this problem there were two observations that I made:<span id="more-1500"></span></p>
<ul>
<li>Read only transactions should not be considered in the MVCC snapshot</li>
<li>Auto commit non-locking read-only selects should not be in the trx_sys_t::trx_list at all</li>
</ul>
<p>For the first to work we need to tag the transactions as<strong> READ ONLY</strong> when the transaction is started e.g.,</p>
<ul>
<li><strong>      START TRANSACTION READ ONLY;</strong></li>
</ul>
<p><strong></strong>I will not be discussing this functionality in this blog because the syntax for this doesn&#8217;t exist in MySQL (yet). However, the functionality exists in InnoDB to handle this case and is  in the 5.6.4 release. Once the above syntax exists, InnoDB can take advantage of the new syntax trivially. What I want to talk about is the second case. This special case can be detected by InnoDB using existing state information and handled transparently without any syntax change in user applications and is fully functional in the 5.6.4 release.</p>
<p><strong>InnoDB transaction life cycle redesign</strong></p>
<p>Split the trx_sys_t::trx_list (the active transactions list) into two, trx_sys_t::ro_trx_list and trx_sys_t::rw_trx_list. Only transactions that are in the trx_sys_t::rw_trx_list are taken into consideration when creating the MVCC snapshot. For a read-only heavy work load the benefits are obvious,  the smaller size of the RW active transaction list makes the read view creation for MVCC (and purge) very fast. For auto-commit read-only non-locking selects the additional benefit is that we don&#8217;t need to acquire the trx_sys_t::mutex at all because we don&#8217;t put them on the active list. This removes the bottleneck around the trx_sys_t::mutex and improves concurrency and scalability.</p>
<p>Auto-commit read-only non-locking transactions go from state NOT STARTED -&gt; ACTIVE -&gt; NOT STARTED, in contrast to locking read-only (and read-write) transactions which go from state NOT STARTED -&gt; ACTIVE -&gt; COMMIT TO MEMORY -&gt; NOT STARTED. The additional advantage in skipping the COMMIT TO MEMORY state is that we know that they cannot acquire any locks and therefore it is pointless to acquire the lock_sys_t::mutex and attempt lock release. Also, during COMMIT because they are not on any active transaction list we don&#8217;t need to acquire the trx_sys_t::mutex to remove them from the list, improving concurrency and performance further.</p>
<p><strong>Changes to transaction state visibility</strong></p>
<p>Currently (5.6.4) doesn&#8217;t display the auto-commit read-only non-locking selects in &#8220;<strong>SHOW ENGINE INNODB STATUS</strong>&#8220;, however they are visible in the <strong>INFORMATION_SCHEMA.innodb_trx</strong> table. The innodb_trx table has two new fields that can be queried to determine whether  a transaction is tagged as a read-only transaction and additionally whether it qualifies for the special handling of auto-commit read-only non-locking select. The new fields are:</p>
<ul>
<li>trx_read_only &#8211; 0 or 1 (INT)</li>
<li>trx_autocommit_non_locking &#8211; 0 or 1 (INT)</li>
</ul>
<p>Some additional minor tweaks, read-only transactions aren&#8217;t assigned a rollback segment and if they are flagged as autocommit non-locking selects then we only set the start time once every 32 times, his reduces the overhead of a system call.</p>
<p><strong>Test results</strong></p>
<p>These tests were run by Alexey Stroganov (a.k.a Ranger) using Sysbench (with &#8211;oltp-skip-trx=on), wl6046 refers to the internal worklog number of this performance fix. Note how InnoDB scales easily up to 4K threads on the 24 host and 1.5K threads on the 8 core host, there is very little (negligible) drop in the TPS as the number of threads is cranked up. In particular note how the peak TPS on the 24 core host is nearly double <img src='http://blogs.innodb.com/wp/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h5>Test POINT_SELECT</h5>
<ul>
<li>QUERY <strong>- SELECT c FROM sbtest</strong><strong> WHERE id=N</strong></li>
</ul>
<p><a href="http://blogs.innodb.com/wp/wp-content/uploads/2011/12/POINT_SELECT_5.6.4.pan01.wl6046-linux_x86_64-std-1m_InnoDB_v1.02.png"><img class="size-full wp-image-1543 alignnone" title="POINT_SELECT 8 core host" src="http://blogs.innodb.com/wp/wp-content/uploads/2011/12/POINT_SELECT_5.6.4.pan01.wl6046-linux_x86_64-std-1m_InnoDB_v1.02.png" alt="" width="498" height="339" /></a></p>
<p><a href="http://blogs.innodb.com/wp/wp-content/uploads/2011/12/POINT_SELECT_5.6.4.caneland.wl6046-linux_x86_64-std-1m_InnoDB_v1.021.png"><img class="alignnone size-full wp-image-1547" title="POINT_SELECT 24 core host" src="http://blogs.innodb.com/wp/wp-content/uploads/2011/12/POINT_SELECT_5.6.4.caneland.wl6046-linux_x86_64-std-1m_InnoDB_v1.021.png" alt="" width="498" height="339" /></a><br />
<strong>Test SIMPLE_RANGES</strong></p>
<ul>
<li>QUERY<strong> &#8211; SELECT c FROM sbtest WHERE id BETWEEN N AND M</strong></li>
</ul>
<p><a href="http://blogs.innodb.com/wp/wp-content/uploads/2011/12/SELECT_SIMPLE_RANGES_5.6.4.pan01.wl6046-linux_x86_64-std-1m_InnoDB_v1.02.png"><img class="alignnone size-full wp-image-1546" title="SELECT_SIMPLE_RANGES 8 core host" src="http://blogs.innodb.com/wp/wp-content/uploads/2011/12/SELECT_SIMPLE_RANGES_5.6.4.pan01.wl6046-linux_x86_64-std-1m_InnoDB_v1.02.png" alt="" width="498" height="339" /></a></p>
<p><a href="http://blogs.innodb.com/wp/wp-content/uploads/2011/12/SELECT_SIMPLE_RANGES_5.6.4.caneland.wl6046-linux_x86_64-std-1m_InnoDB_v1.02.png"><img class="alignnone size-full wp-image-1548" title="SELECT_SIMPLE_RANGES 24 core host" src="http://blogs.innodb.com/wp/wp-content/uploads/2011/12/SELECT_SIMPLE_RANGES_5.6.4.caneland.wl6046-linux_x86_64-std-1m_InnoDB_v1.02.png" alt="" width="498" height="339" /></a></p>
<p>The same result for SIMPLE RANGES, at lower thread levels 5.6 has less TPS than 5.5 on the 8 core host however that is due to another known and unrelated issue that is currently being worked on actively.</p>
<p><strong>Conclusion</strong></p>
<p>This is a significant step forward in InnoDB read-only performance and will allow InnoDB to scale up to a very high number of concurrent queries and take advantage of greater number of processors with the improved parallelism. Note: mixed workloads with a read-only heavy component will also benefit from this improvement. Currently, only if the read-only transactions are auto-commit non-locking selects. The better news is that with this split of the active transaction list into two, we can now optimize deadlock detection, lock release and transaction scheduling around lock grants and waits, stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.innodb.com/wp/2011/12/better-scaling-of-read-only-workloads/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>InnoDB 5.6.4 supports databases with 4k and 8k page sizes</title>
		<link>http://blogs.innodb.com/wp/2011/12/innodb-5-6-4-supports-4k-8k-page-sizes/</link>
		<comments>http://blogs.innodb.com/wp/2011/12/innodb-5-6-4-supports-4k-8k-page-sizes/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 17:00:24 +0000</pubDate>
		<dc:creator>Kevin Lewis</dc:creator>
				<category><![CDATA[Feature]]></category>
		<category><![CDATA[16k]]></category>
		<category><![CDATA[4k]]></category>
		<category><![CDATA[5.6.4]]></category>
		<category><![CDATA[8k]]></category>
		<category><![CDATA[Antelope]]></category>
		<category><![CDATA[Barracuda]]></category>
		<category><![CDATA[Compatibility]]></category>
		<category><![CDATA[Configuration parameter]]></category>
		<category><![CDATA[File format]]></category>
		<category><![CDATA[ibdata file]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[Page Size]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Row Formats]]></category>

		<guid isPermaLink="false">http://blogs.innodb.com/wp/?p=1484</guid>
		<description><![CDATA[In the 5.6.4 release it is now possible to create an InnoDB database with 4k or 8k page sizes in addition to the original 16k page size. Previously, it could be done by recompiling the engine with a different value for UNIV_PAGE_SIZE_SHIFT and UNIV_PAGE_SIZE. With this release, you can set &#8211;innodb-page-size=n when starting mysqld, or [...]]]></description>
			<content:encoded><![CDATA[<p>In the 5.6.4 release it is now possible to create an InnoDB database with 4k or 8k page sizes in addition to the original 16k page size. Previously, it could be done by recompiling the engine with a different value for UNIV_PAGE_SIZE_SHIFT and UNIV_PAGE_SIZE. With this release, you can set &#8211;innodb-page-size=n when starting mysqld, or put innodb_page_size=n in the configuration file in the [mysqld] section where n can be 4k, 8k, 16k, or 4096, 8192, 16384.</p>
<p>The support of smaller page sizes may be useful for certain storage media such as SSDs. Performance results can vary depending on your data schema, record size, and read/write ratio. But this provides you more options to optimize your performance.</p>
<p>When this new setting is used, the page size is set for all tablespaces used by that InnoDB instance. You can query the current value with;</p>
<p>SHOW VARIABLES LIKE &#8216;innodb_page_size&#8217;;<br />
or<br />
SELECT variable_value FROM information_schema.global_status  WHERE LOWER(variable_name) = &#8216;innodb_page_size&#8217;;</p>
<p>It is a read-only variable while the engine is running since it must be set before InnoDB starts up and creates a new system tablespace. That happens when InnoDB does not find ibdata1 in the data directory. If you start mysqld with a page size other than the standard 16k, the error log will contain something like this;</p>
<p><span id="more-1484"></span></p>
<p>111214 15:55:05 InnoDB: innodb-page-size has been changed from the default value 16384 to 4096.</p>
<p>If your system tablespace already exists using one page size and innodb-page-size is something else, the engine will not start. There will be a message logged like this;</p>
<p>111214 16:06:51 InnoDB: Error: data file .\ibdata1 uses page size 4096,<br />
111214 16:06:51 InnoDB: but the start-up parameter is innodb-page-size=16384</p>
<p>InnoDB knows the page size used in an existing tablespace created by version 5.6.4 because it stamps that page size in the header page. But this is not readable to older engines, of course. If an older engine opens a database with a page size other than 16k, it will report a corrupted page and quit.</p>
<p>All features in InnoDB work the same with smaller page sizes. But some limits are affected. The maximum record size is proportionately less with smaller pages. Record length limits are calculated within InnoDB based on a variety of factors including row type, column type and length, number of columns, secondary indexes, index prefix lengths, and of course, the page size. The main record is stored in a clustered index and a minimum of two records must fit into each page. So the maximum record length for 8k pages is about half that of 16k pages and the maximum record size with 4k pages is about half that of 8k pages.</p>
<p>In addition to record lengths, the maximum key lengths are proportionately smaller. For 16k pages, MySQL prevents key definitions from containing over 3072 bytes of data. This means that the primary key in the clustered index cannot use more than 3072 bytes of data. Secondary indexes can only contain up to 3072 bytes of data in the key also. But within a secondary index, InnoDB must store the primary key as the record pointer.  So if you have a 3072 byte primary key and a 3072 byte secondary key, each entry in the secondary index contains 6144 bytes of data plus internal record overhead. The amount of internal overhead is dependent upon the column types, but this gets the secondary record close to half the page size which is its natural limit. So this limit of 3072 bytes per key is less than but close to what InnoDB would have to impose on a table by table basis.  Based on that, InnoDB now reports to MySQL that any key defined for 8k page sizes must be less than 1536 bytes.  Likewise, the maximum key length when InnoDB uses 4k page sizes is 768 bytes.</p>
<p>If you have a database schema with any large records or keys defined, you may not be able to use smaller page sizes. Even if your records do barely fit in the clustered index page, it may not be advisable to use these smaller pages because the btree will be a lot deeper.  For example, if only 2 records fit on the page and there are 1,000,000 records, leaf pages are 20 levels deep, meaning InnoDB will need to read 20 pages to find the leaf page.  If that were on 4k pages, then using the same table on 16k pages would give 8 records per page and the leaf pages would only be 7 levels down.</p>
<p>There is a trick to reducing the size of records on the clustered index page;<br />
1) Use Dynamic or Compressed row format.<br />
2) Convert VARCHAR fields to TEXT fields.  (VARBINARY can be converted to BLOB)</p>
<p>There are 4 ROW FORMATS in InnoDB. The first two, Redundant and Compact, which are considered the Antelope file version, store at least 768 bytes of each field in the clustered record.  The Barracuda file version consists of Compact and Dynamic ROW FORMATS. These have the ability to put all of a VARCHAR, VARBINARY, TEXT or BLOB field onto a separate BLOB page for storage.  So one good way to prepare a table structure to use smaller page sizes is to use Dynamic or Compressed row format.</p>
<p>The decision of how big a record will be in the clustered record is made during the INSERT or UPDATE.  Each record is evaluated for its own length.  If the record is too long to fit in half the page, InnoDB will look for the longest actual field in that record and put as much of that field off-page as possible based on the row type.  Then if it is still to long, it will shorten the longest field remaining.  Since this is done when the record is added to the page, different records may have different columns stored off-page when there are multiple long fields in the record.</p>
<p>VARCHAR/VARBINARY fields are treated like TEXT/BLOB fields if they are over 255 bytes long.  If you are using Compressed or Dynamic row format and your record is too long because you have too many VARCHAR fields 255 bytes or less, you can reduce the record length by converting them to TEXT fields. Likewise, VARBINARY fields 255 bytes or less can be converted to BLOB fields to take advantage of this ability to store the whole TEXT or BLOB field on a separate page.</p>
<p>A file extent in InnoDB is 1 Mb independent of the page size. So an extent will hold 64 16k pages, 128 8k pages and 256 4k pages.  This means that the read ahead mechanisms will read more pages with smaller page sizes since they read a whole extent at a time.  The doublewrite buffer, which is based on the size of an extent, will also contain more pages.</p>
<p>If you want to use smaller page sizes with existing data, export the data first with a logical export utility such as mysqldump. Then create the new mysql instance with innodb-page-size=4k or 8k and import the data. Do not use a physical export method such as alter table … discard tablespace.</p>
<p><strong>Summary:</strong></p>
<p>This feature makes it easier to try smaller page sizes in an InnoDB database. And with the 5.6.4 release, those smaller page sizes are fully supported by MySQL. Just export your data, move or delete the system database (ibdata1) and the log files (ib_logfile0 &amp; ib_logfile1), set innodb-page-size to either 4k or 8k, and restart MySQL. A new InnoDB instance will be created with the smaller page size. Then you can import your data and run your tests, all without recompiling InnoDB.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.innodb.com/wp/2011/12/innodb-5-6-4-supports-4k-8k-page-sizes/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MySQL 5.6: InnoDB scalability fix &#8211; Kernel mutex removed</title>
		<link>http://blogs.innodb.com/wp/2011/04/mysql-5-6-innodb-scalability-fix-kernel-mutex-removed/</link>
		<comments>http://blogs.innodb.com/wp/2011/04/mysql-5-6-innodb-scalability-fix-kernel-mutex-removed/#comments</comments>
		<pubDate>Mon, 11 Apr 2011 12:53:19 +0000</pubDate>
		<dc:creator>Sunny Bains</dc:creator>
				<category><![CDATA[Feature]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://blogs.innodb.com/wp/?p=734</guid>
		<description><![CDATA[For those interested in InnoDB internals, this post tries to explain why the global kernel mutex was required and the new mutexes and rw-locks that now replace it. Along with the long term benefit from this change. InnoDB&#8217;s core sub-systems up to v5.5 are protected by a global mutex called the Kernel mutex. This makes [...]]]></description>
			<content:encoded><![CDATA[<p>For those interested in InnoDB internals, this post tries to explain why the global kernel mutex was required and the new mutexes and rw-locks that now replace it. Along with the long term benefit from this change.</p>
<p>InnoDB&#8217;s core sub-systems up to v5.5 are protected by a global mutex called the Kernel mutex. This makes it difficult to do even some common sense optimisations. In the past we tried optimising the code but it would invariably upset the delicate balance that was achieved by tuning of the code that used the global Kernel mutex, leading to unexpected performance regression. The kernel mutex is also abused in several places to cover  operations unrelated to the core e.g., some counters in the server thread main loop.</p>
<p>The InnoDB core sub-systems are:</p>
<ol>
<li> <strong>The Locking sub-system</strong></li>
<li><strong> The Transaction sub-system</strong></li>
<li><strong> MVCC  views</strong></li>
</ol>
<p>For any state change in the above sub-systems we had to acquire the kernel mutex and this would reduce concurrency and made the kernel mutex very highly contended. A transaction that is creating a lock would end up blocking read view creation (for MVCC) and transaction start or commit/rollback. With the the finer granularity mutexes and rw-locks, a transaction that is creating a lock will not block transaction start or commit/rollback. MVCC read view creation will however block transaction create and commit/rollback because of the shared trx_sys_t::trx_list. But MVCC read view creations will not block each other because they will acquire an S lock.</p>
<p><span id="more-734"></span></p>
<p>In 5.6 the global kernel mutex has been further split into several localised mutexes. The important ones are:</p>
<ol>
<li> <strong> Transactions and MVCC views</strong>: trx_sys_t::lock (rw_lock) and trx_t::mutex</li>
<li> <strong> Locking</strong> : lock_sys_t::mutex and lock_sys_t::wait_mutex</li>
</ol>
<p>This change is significant from an architectural perspective and most of the effort has gone into proving that the new design is correct. Splitting a global mutex into several independent mutexes should improve performance by increasing concurrency. The downside of course is that there is probably going to be a little more context switching with finer grained mutexes. However, now we have far greater freedom in making localised changes to further speed up the sub-systems independently without worrying about the global state and a global mutex.</p>
<p><strong>Background</strong></p>
<p>InnoDB was originally designed to support multiple query threads per transaction. However, this functionality has never been tested and since its first release the InnoDB engine has only ever worked in single query thread per transaction mode. This design decision to support multiple query threads per transaction caused a lot of tight coupling between the core sub-systems, most of which was related to the state of the (potentially multiple) query threads. The state changes and detection were protected by the Kernel mutex. The first step was in simplifying the rules around the handling of multiple-query threads. For the curious, it is the code in files that are prefixed with <em>que0. </em>The most complex part of the change was the transition from the state waiting for lock to the state deadlock or timeout rollback. The control flow was rather convoluted because of the handling for potentially multiple query threads that were bound to a transaction.</p>
<p><strong>Difference between query state and transaction state</strong></p>
<p>InnoDB distinguishes between <em>transaction state</em> and the <em>query thread state</em>. When a transaction waits for a lock it is not the transaction state that is changed to LOCK_WAIT but the <em>query thread state</em>. In a similar fashion when we rollback a transaction it is the query thread state that changes to ROLLING BACK not the transaction state. However, because there has always been a one-to-one mapping between a query thread and a transaction, the query state can be regarded as transaction sub-state. ie.</p>
<p>Transaction states are:</p>
<ol>
<li> TRX_STATE_NOT_STARTED,</li>
<li> TRX_STATE_ACTIVE,</li>
<li> TRX_STATE_PREPARED,</li>
<li> TRX_STATE_COMMITTED_IN_MEMORY</li>
</ol>
<p>When a transaction is in state TRX_STATE_ACTIVE it can have the following sub-states (or <em>query thread states</em>)</p>
<ol>
<li>TRX_QUE_RUNNING,</li>
<li>TRX_QUE_LOCK_WAIT,</li>
<li>TRX_QUE_ROLLING_BACK,</li>
<li>TRX_QUE_COMMITTING</li>
</ol>
<p>Below is a somewhat simplified version of the roles that the (more important) new rw-locks and mutexes play in the new design.</p>
<p><strong>trx_sys_t::lock</strong></p>
<p>This is a rw-lock that protects the global list of transactions that are ordered on transaction id. This transaction list is used every time a view for MVCC is created and also when a user does something like &#8220;SHOW ENGINE INNODB STATUS&#8221;. We add a transaction to this list when it is started and remove it from the list once it completes (commit or rollback).</p>
<p><strong>lock_sys_t::mutex</strong></p>
<p>All locking data structures and changes to transaction query thread states are protected by this mutex. The transaction&#8217;s query thread state can be changed asynchronously by other threads in the system. Therefore changing a query state requires that the thread doing the query thread state change has to acquire both the lock mutex and the transaction mutex.</p>
<p><strong>Ongoing optimisations and future work</strong></p>
<p>Getting rid of the global kernel mutex is only the start of fixing some of the mutex contention issues. There are several optimisations that can now be considered which were impossible with a single global mutex. We can now take this splitting process down to the sub-system level. I&#8217;ve been experimenting with eliminating the trx_sys_t::lock completely. By selectively commenting out parts of the code, I&#8217;ve been able to test InnoDB without this rw-lock and test where the other hot spots are. These findings are probably better in a separate blog post <img src='http://blogs.innodb.com/wp/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . We should finally be able to eliminate (or mitigate) the overhead of MVCC read view creation. More room to move in fixing the lock release overhead, this is especially important in read-write workloads. There are a whole slew of optimisations that we couldn&#8217;t do earlier that are now possible <img src='http://blogs.innodb.com/wp/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.innodb.com/wp/2011/04/mysql-5-6-innodb-scalability-fix-kernel-mutex-removed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL 5.5: InnoDB Performance Improvements on Windows</title>
		<link>http://blogs.innodb.com/wp/2010/09/mysql-5-5-innodb-performance-improvements-on-windows/</link>
		<comments>http://blogs.innodb.com/wp/2010/09/mysql-5-5-innodb-performance-improvements-on-windows/#comments</comments>
		<pubDate>Sun, 19 Sep 2010 19:31:12 +0000</pubDate>
		<dc:creator>Calvin Sun</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[InnoDB API]]></category>
		<category><![CDATA[mutex]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blogs.innodb.com/wp/?p=679</guid>
		<description><![CDATA[At MySQL, we know our users want Performance, Scalability, Reliability, and Availability, regardless of the platform the choose to deploy. We have always had excellent benchmarks on Linux, and with MySQL 5.5, we are also working hard on improving performance on Windows. The original patch of improving Windows performance was developed by MySQL senior developer [...]]]></description>
			<content:encoded><![CDATA[<p>At MySQL, we know our users want Performance, Scalability, Reliability, and Availability, regardless of the platform the choose to deploy.  We have always had excellent benchmarks on Linux, and with MySQL 5.5, we are also working hard on improving performance on Windows.</p>
<p>The original patch of improving Windows performance was developed by MySQL senior developer Vladislav Vaintroub; benchmarks by QA engineer Jonathan Miller. We integrated the patch into MySQL 5.5 release.</p>
<p>The following two charts show the comparison of MySQL 5.5 vs. MySQL 5.1 (plugin) vs. MySQL 5.1 (builtin) using sysbench:</p>
<p><a href="http://blogs.innodb.com/wp/wp-content/uploads/2010/09/MySQL-5.5-RO-Windows2.jpg"></a><a href="http://blogs.innodb.com/wp/wp-content/uploads/2010/09/MySQL-5.5-RO-Windows3.jpg"><img class="aligncenter size-large wp-image-699" title="MySQL-5.5-RO-Windows" src="http://blogs.innodb.com/wp/wp-content/uploads/2010/09/MySQL-5.5-RO-Windows3-1024x625.jpg" alt="" width="600" height="366" /></a></p>
<p><a href="http://blogs.innodb.com/wp/wp-content/uploads/2010/09/MySQL-5.5-RW-Windows.jpg"><img class="aligncenter size-large wp-image-702" title="MySQL-5.5-RW-Windows" src="http://blogs.innodb.com/wp/wp-content/uploads/2010/09/MySQL-5.5-RW-Windows-1024x638.jpg" alt="" width="600" height="366" /></a></p>
<p><span id="more-679"></span></p>
<p>MySQL 5.5 includes a Windows performance patch, plus <a href="http://dev.mysql.com/tech-resources/articles/introduction-to-mysql-55.html">other performance improvements</a>. This Windows performance patch has two part: part one is to fix the inefficiency of InnoDB slow mutex implementation on Windows &#8211; implement slow mutex as <a href="http://msdn.microsoft.com/en-us/library/ms682530%28VS.85%29.aspx">CriticalSection</a>; and part two is to take advantage of <a href="http://msdn.microsoft.com/en-us/library/ms682052%28VS.85%29.aspx">condition variables</a> on Windows Vista or newer Windows operating systems. Condition variables are not supported on Windows Server 2003 and Windows XP/2000.</p>
<p>What if I have an old Windows on which condition variables are not supported? Well, you can still benefit from the new slow mutex implementation; but will not be able to take the advantage of condition variables. The same binary runs on old Windows too. The InnoDB does a dynamic checking during start-up, to see whether condition variables are supported by the operating system it runs on.</p>
<p>Another benefit from this patch is the reduced consumption of Windows kernel objects (or handles), which deserves another blog on its own.</p>
<p><a href="http://dev.mysql.com/downloads" target="_self">Download MySQL 5.5 RC release</a> to give it a try for yourself! Thanks to Vladislav and Jonathan for their hard work!</p>
<h3>Hardware configuration and operating system</h3>
<p>Intel x86_64, 4 CPU x 2  Cores , 3.166 GHz, 8GB RAM, and Windows Server 2008.</p>
<h3>MySQL / InnoDB configuration</h3>
<p>Relevant my.cnf parameters:</p>
<p style="padding: 2px 6px 4px 45px; color: #555555; background-color: #0000000; border: #dddddd 2px solid;"><code>max_connections=500<br />
max_connect_errors=50<br />
table_cache=2048<br />
query-cache-size=0<br />
query-cache-type=0<br />
disable-log-bin<br />
transaction_isolation=REPEATABLE-READ<br />
innodb-file-per-table=1<br />
innodb_data_file_path=ibdata1:200M:autoextend<br />
innodb_buffer_pool_size=4G<br />
innodb_additional_mem_pool_size=20M<br />
innodb_log_file_size=650M<br />
innodb_log_files_in_group=2<br />
innodb_log_buffer_size=16M<br />
innodb_support_xa=0<br />
innodb_doublewrite=1<br />
innodb_thread_concurrency=0<br />
innodb_flush_log_at_trx_commit=1<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.innodb.com/wp/2010/09/mysql-5-5-innodb-performance-improvements-on-windows/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Post-Conference Roundup of InnoDB-related Info</title>
		<link>http://blogs.innodb.com/wp/2010/04/post-conference-roundup-of-innodb-related-info/</link>
		<comments>http://blogs.innodb.com/wp/2010/04/post-conference-roundup-of-innodb-related-info/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 05:02:49 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[John Russell]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Scalability]]></category>

		<guid isPermaLink="false">http://blogs.innodb.com/wp/?p=590</guid>
		<description><![CDATA[What a busy week! Lots of MySQL 5.5 announcements that just happened to coincide with the MySQL Conference and Expo in Silicon Valley. Here are some highlights of the performance and scalability work that the InnoDB team was involved with. A good prep for the week of news is the article Introduction to MySQL 5.5, which [...]]]></description>
			<content:encoded><![CDATA[<p>What a busy week! Lots of MySQL 5.5 announcements that just happened to coincide with the MySQL Conference and Expo in Silicon Valley. Here are some highlights of the performance and scalability work that the InnoDB team was involved with.</p>
<p>A good prep for the week of news is the article <a href="http://dev.mysql.com/tech-resources/articles/introduction-to-mysql-55.html">Introduction to MySQL 5.5</a>, which includes information about the major performance and scalability features. That article will lead you into the <a href="http://dev.mysql.com/doc/refman/5.5/en/">MySQL 5.5 manual</a> for general features and the <a href="http://dev.mysql.com/doc/innodb-plugin/1.1/en/">InnoDB 1.1 manual</a> for performance &amp; scalability info.</p>
<p>Then there were the conference presentations from InnoDB team members, which continued the twin themes of performance and scalability:</p>
<ul>
<li>InnoDB: Status, Architecture, and New Features: <a href="http://www.innodb.com/wp/wp-content/uploads/2010/04/Whats_New_in_InnoDB_2010.pdf">Slides</a>, <a href="http://en.oreilly.com/mysql2010/public/schedule/detail/13502">Rate / leave feedback</a></li>
<li>InnoDB Plugin: Performance Features and Benchmarks: <a href="http://www.innodb.com/wp/wp-content/uploads/2010/04/InnoDB_Performance_benchmarks_2010.pdf">Slides</a>, <a href="http://en.oreilly.com/mysql2010/public/schedule/detail/13503">Rate / leave feedback</a></li>
<li>What&#8217;s New in MySQL 5.5? Performance/Scale Unleashed!: <a href="http://www.innodb.com/wp/wp-content/uploads/2010/04/Performance_Change_Analysis_2010.pdf">Slides</a>, <a href="http://en.oreilly.com/mysql2010/public/schedule/detail/13363">Rate / leave feedback</a></li>
<li>What&#8217;s New in MySQL 5.5?: Performance and Scalability Benchmarks: <a href="http://www.innodb.com/wp/wp-content/uploads/2010/04/Benchmark_Analysis_Final_2010.pdf">Slides</a>, <a href="http://en.oreilly.com/mysql2010/public/schedule/detail/14298">Rate / leave feedback</a></li>
<li>Introduction to InnoDB Monitoring System and Resource &amp; Performance Tuning: <a href="http://www.innodb.com/wp/wp-content/uploads/2010/04/InnoDB_Monitoring_System_2010.pdf">Slides</a>, <a href="http://en.oreilly.com/mysql2010/public/schedule/detail/13508">Rate / leave feedback</a></li>
<li>Backup Strategies with InnoDB Hot Backup: <a href="http://www.innodb.com/wp/wp-content/uploads/2010/04/Backup_Strategies_with_MySQL_Enterprise_Backup_2010.pdf">Slides</a>, <a href="http://en.oreilly.com/mysql2010/public/schedule/detail/13505">Rate / leave feedback</a></li>
</ul>
<p><span id="more-590"></span></p>
<p>We hope that a good and useful time was had by all. Best regards to our European friends and colleagues whose return plans were disrupted by the Icelandic volcano!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.innodb.com/wp/2010/04/post-conference-roundup-of-innodb-related-info/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>New InnoDB Plugin with MORE Performance: Thanks, Community!</title>
		<link>http://blogs.innodb.com/wp/2009/08/new-innodb-plugin4-with-more-performance-thanks-community/</link>
		<comments>http://blogs.innodb.com/wp/2009/08/new-innodb-plugin4-with-more-performance-thanks-community/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 21:33:48 +0000</pubDate>
		<dc:creator>Ken Jacobs</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[contributions]]></category>
		<category><![CDATA[patches]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[third-party]]></category>

		<guid isPermaLink="false">http://blogs.innodb.com/wp/?p=450</guid>
		<description><![CDATA[Today, the InnoDB team announced the latest release of the InnoDB Plugin, release 1.0.4. Some of the performance gains in this release are quite remarkable! As noted in the announcement, this release contains contributions from Sun Microsystems, Google and Percona, Inc., for which we are very appreciative. This page briefly describes each of the contributions [...]]]></description>
			<content:encoded><![CDATA[<p>Today, the InnoDB team <a href="http://www.innodb.com/wp/2009/08/11/innodb-plugin-104-released/">announced</a> the latest release of the InnoDB Plugin, release 1.0.4.  Some of the performance gains in this release are quite remarkable!
</p>
<p>
As noted in the announcement, this release contains contributions from Sun Microsystems, Google and Percona, Inc., for which we are very appreciative.  <a href="http://www.innodb.com/wp/products/innodb_plugin/license/third-party-contributions-in-innodb-plugin-1-0-4/">This page</a> briefly describes each of the contributions and the way we treated them. The purpose of this post is to describe the general approach the InnoDB team takes toward third party contributions.
</p>
<p>
In principle, we appreciate third party contributions.   However, we simply don&#8217;t have the resources to seriously evaluate every change that someone proposes, but when we do undertake to evaluate a patch, we have some clear criteria in mind:</p>
<ul>
<li>The patch has to be technically sound, reliable, and effective</li>
<li>The change should fit with the architecture, and our overall plans and philosophy for InnoDB</li>
<li>The contribution must be available to us under a suitable license</li>
</ul>
<p>Let&#8217;s consider, in general terms, what these criteria mean in practice.
</p>
<p><span id="more-450"></span></p>
<p>
We have to expend a fair bit of effort to carefully evaluate and possibly modify a patch before we can include it in the release. Some of the third party contributions we&#8217;ve seen have not been portable, or have been developed just for Linux.  It can take time to find an approach that enables a platform to take advantage of a new feature, even if the platform has the required capabililties.  Some of the patches we&#8217;ve evaluated have contained actual bugs that would impact reliability, cause deadlocks or have other negative implications.   InnoDB is a clean and elegant piece of code, yet some of its internal algorithms and behaviors are subtle and complex.  Therefore, changes in the &#8220;guts&#8221; of InnoDB (or any storage engine) must be done carefully and thoroughly tested.   Some patches that have been offered make a difference, but only when compared to an inappropriate &#8220;baseline&#8221;.  At any given point, we would look to include a patch only if it makes a significant improvement over the &#8220;best&#8221; version or configuration of InnoDB available at the time.  We like to test each patch in isolation, to assess its individual value.  This requires some rigorous performance testing, with multiple workloads.
</p>
<p>
From time to time, third parties have made suggestions for changes that may seem attractive at first, but don&#8217;t make sense longer term.   In general, we may have a more comprehensive approach to a problem or requirement that we would like to implement, rather than incorporate a patch that would introduce a feature that would ultimately be made obsolete.  We prefer to have fewer &#8220;knobs&#8221; and tuning complexity, so we&#8217;re more inclined to implement heuristic, self-tuning capabilities than we are to add new configuration parameters.   Lastly, we take care to protect the ability to upgrade and downgrade user databases with the file format management features in the InnoDB Plugin.  If a patch requires an on-disk change, we will defer its incorporation until the time comes to implement a new file format.
</p>
<p>
For us to be able to make continued investment in InnoDB, we must be able to license the software commercially.   OEMs and ISVs who incorporate MySQL with InnoDB in their products may not wish to release their products in open source form.  Therefore, for each contribution we are to accept, we must have clear legal rights to the change.</p>
<p>
Beyond all that, of course, we take care to carefully document each new feature, both in terms of form and function. We try hard to explain the implications of a feature, providing information about <em>what </em>it does, and <em>when</em> and <em>where</em> to use a feature, as well as <em>how</em> to do so.   And, we generally speaking are committed to upward compatibility and support of a feature once it is introduced.</p>
<p>
It&#8217;s pretty clear that the integrity of InnoDB, with its broad adoption and importance everywhere it is used, is paramount to you and to us.  You can trust the InnoDB team to protect InnoDB now and in the future, while being open to suggestions and contributions.  Let us know if you think we&#8217;re doing a good job!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.innodb.com/wp/2009/08/new-innodb-plugin4-with-more-performance-thanks-community/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Software is Hard Sometimes &#8230;</title>
		<link>http://blogs.innodb.com/wp/2009/03/software-is-hard-sometimes/</link>
		<comments>http://blogs.innodb.com/wp/2009/03/software-is-hard-sometimes/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 08:00:59 +0000</pubDate>
		<dc:creator>Vasil Dimov</dc:creator>
				<category><![CDATA[InnoDB Plugin]]></category>
		<category><![CDATA[Concurrency]]></category>
		<category><![CDATA[mutex]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[portability]]></category>
		<category><![CDATA[Scalability]]></category>

		<guid isPermaLink="false">http://blogs.innodb.com/wp/?p=350</guid>
		<description><![CDATA[Some months ago, Google released a patch for InnoDB that boosts performance on multi-core servers. We decided to incorporate the change into the InnoDB Plugin to make everybody happy: users of InnoDB don&#8217;t have to apply the patch, and Google no longer has to maintain the patch for new versions of InnoDB. And it makes [...]]]></description>
			<content:encoded><![CDATA[<p>Some months ago, Google released a <a href="http://code.google.com/p/google-mysql-tools/wiki/SmpPerformance">patch</a> for InnoDB that boosts performance on multi-core servers.  We decided to incorporate the change into the InnoDB Plugin to make everybody happy: users of InnoDB don&#8217;t have to apply the patch, and Google no longer has to maintain the patch for new versions of InnoDB.  And it makes us at Innobase happy because it improves our product (as you can in <a href="http://blogs.innodb.com/wp/2009/03/plug-in-for-performance-and-scalability/">this post</a> about InnoDB Plugin release 1.0.3).</p>
<p>However, there are always technical and business issues to address.  Given the low-level changes in the patch, was it technically sound?   Was the patch stable and as rock solid as is the rest of InnoDB?  Although it was written for the built-in InnoDB in MySQL 5.0.37, we needed to adapt it to the InnoDB Plugin. Could we make the patch portable to many platforms?   Could we incorporate the patch without legal risk (so it could be licensed under both the GPL and commercial terms)?</p>
<p>Fortunately Google generously donated the patch to us under the BSD license, so there was no concern about intellectual property (so long as we properly acknowledged the contribution, which we do in an Appendix to the manual and in the source code).  So, while the folks at Google are known for writing excellent code, we had to thoroughly review and test the patch before it could be incorporated in a release of InnoDB.</p>
<p>The patch improves performance by replacing InnoDB mutex and rw-mutex with atomic memory instructions. The first issue that arose was that the patch assigned the integer value -1 to a pthread_t variable, to refer to a neutral/non-existent thread identifier.  This approach worked for Google because they use InnoDB solely on Linux. As it happens, pthread_t is defined as an integer on Linux.</p>
<p>But we had problems when the patch was tested on FreeBSD.  We still needed to reference a non-existent thread, but in some environments (e.g. some versions of HPUX, Mac OS X) pthread_t is defined as a<br />
structure, not an integer.  As we looked at it, the problem became more complex.  For this scheme to work, it must be possible to change thread identifiers atomically, using a Compare-And-Swap instruction.  Otherwise, there will be subtle, mysterious and nasty failures.</p>
<p><span id="more-350"></span></p>
<p>We thought about enabling this patch only on Linux.  But that approach was not optimal, because the patch could work perfectly well on other platforms where pthread_t is the same size as the machine word, like FreeBSD and Solaris, for example.   We could have simply enumerated the operating system names where the patch would be supported, but this too was far from perfect.  The ability to use the atomic instructions depends not only on the operating system, but the GCC version (has to be 4.1 or newer) and the capabilities of the CPU (some CPUs do not support Compare-And-Swap!).</p>
<p>So, we developed a dynamic compile-time check for checking whether the target environment (pthread_t type and size, GCC version, CPU capabilities) supports the use of atomic instructions as intended. This seemed to be the best approach, but then another problem arose! </p>
<p>Dynamic compile-time checks (i.e. autoconf) are part of the MySQL&#8217;s ./configure script.  Innobase does not control this script, and so we must live with what is distributed by MySQL.  To make things simple for<br />
users, we wanted to avoid asking the users to re-create ./configure with the autotools. So we simply injected the required checks in the Makefile.  This seemed to work fine.   Only after release of the InnoDB Plugin 1.0.3 did a small crack in this approach arise.  Fortunately this problem turned out to be easy to fix and only occurs if one compiles with &#8220;make -j&#8221; (in order to perform the make in parallel). See <a href="http://bugs.mysql.com/43740">Bug#43740</a> for details and for a fix.</p>
<p>The bottom line is that sometimes more goes on &#8220;behind the scenes&#8221; than you might expect when it comes to incorporating a third-party contribution into a product.  We are grateful for the Google patch, and are glad that we have been able to include it in the InnoDB Plugin in a way that maximizes its portability, while keeping things as simple as possible for users.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.innodb.com/wp/2009/03/software-is-hard-sometimes/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>&#8230; and Who Could Forget Mark Callaghan?</title>
		<link>http://blogs.innodb.com/wp/2009/03/and-who-could-forget-mark-callaghan/</link>
		<comments>http://blogs.innodb.com/wp/2009/03/and-who-could-forget-mark-callaghan/#comments</comments>
		<pubDate>Fri, 20 Mar 2009 15:46:44 +0000</pubDate>
		<dc:creator>Ken Jacobs</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://blogs.innodb.com/wp/?p=339</guid>
		<description><![CDATA[Ooops! Mark Callaghan of Google is one of world&#8217;s experts in InnoDB, and a frequent blogger on its performance characteristics. The InnoDB Plugin 1.0.3 is much more scalable on multi-core systems because of the contributions he has made (along with Ben Handy). Mark will deliver a keynote the on Google&#8217;s use of MySQL and InnoDB [...]]]></description>
			<content:encoded><![CDATA[<p>Ooops!   Mark Callaghan of Google is one of world&#8217;s experts in InnoDB, and a frequent <a href="http://mysqlha.blogspot.com/" target="new">blogger</a> on its performance characteristics.  The <a href="http://blogs.innodb.com/wp/2009/03/plug-in-for-performance-and-scalability/">InnoDB Plugin 1.0.3</a> is much more scalable on multi-core systems because of the contributions he has made (along with Ben Handy).</p>
<p>Mark will deliver a keynote the on Google&#8217;s use of MySQL and InnoDB on Tuesday morning at the MySQL Conference, and another talk on Wednesday.  As Mark says, &#8220;Although Innodb is not in the title, it is prominent in both of the talks I will do&#8221;:</p>
<ul>
<li><a href="http://en.oreilly.com/mysql2009/public/schedule/detail/7996" target="new">This is not a web app &#8211; the evolution of a MySQL deployment at Google</a> Tues, 9am
</li>
<li><a href="http://en.oreilly.com/mysql2009/public/schedule/detail/6653" target="new">MySQL Performance on EC2</a> Wed, 3:05pm</li>
</ul>
<p><span id="more-339"></span></p>
<p>Sorry the other post didn&#8217;t mention you, Mark.  We won&#8217;t forget to be at BOTH your sessions, and we look forward to hearing what you have to say!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.innodb.com/wp/2009/03/and-who-could-forget-mark-callaghan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Talk,Talk, Talk: Innobase Speaks</title>
		<link>http://blogs.innodb.com/wp/2009/03/talktalk-talk-mysql-conference-presentations/</link>
		<comments>http://blogs.innodb.com/wp/2009/03/talktalk-talk-mysql-conference-presentations/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 20:59:06 +0000</pubDate>
		<dc:creator>Ken Jacobs</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[Compatibility]]></category>
		<category><![CDATA[Concurrency]]></category>
		<category><![CDATA[file form]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Recovery]]></category>

		<guid isPermaLink="false">http://blogs.innodb.com/wp/?p=253</guid>
		<description><![CDATA[That should read &#8220;Talks, Talks, Talks&#8221; &#8230; There will be several presentations by InnoDB experts at the upcoming 2009 MySQL Conference and Expo. Whether you&#8217;re a newbie or an experienced DBA deeply familiar with InnoDB, you won&#8217;t want to miss these important talks about InnoDB: Innovative Technologies for Performance and Data Protection by Ken and [...]]]></description>
			<content:encoded><![CDATA[<p>That should read &#8220;Talks, Talks, Talks&#8221; &#8230; There will be several presentations by InnoDB experts at the upcoming 2009 MySQL Conference and Expo.  Whether you&#8217;re a newbie or an experienced DBA deeply familiar with InnoDB, you won&#8217;t want to miss these important talks about InnoDB:</p>
<ul>
<li><a href="http://en.oreilly.com/mysql2009/public/schedule/detail/8877" target="new">Innovative Technologies for Performance and Data Protection</a> by Ken and Heikki, Tues, 11:55am</li>
<li><a href="http://en.oreilly.com/mysql2009/public/schedule/detail/6843" target="new">Crash Recovery and Media Recovery in InnoDB</a> by Heikki, Wed, 2pm</li>
<li><a href="http://en.oreilly.com/mysql2009/public/schedule/detail/7052" target="new">InnoDB Internals: InnoDB File Formats &#038; Source Code Structure</a> by Heikki and Calvin, Wed, 5:15pm</li>
<li><a href="http://en.oreilly.com/mysql2009/public/schedule/detail/6842" target="new">Concurrency Control: How it Really Works</a> by Heikki, Thurs, 2:50pm </li>
</ul>
<p>Note the <strong>new times</strong> for the last two talks above.  Be sure to check the conference schedule!  Not much more to say about this topic, at least not here.  Hear it all <a href="http://en.oreilly.com/mysql2009/public/content/home" target="new"><b>there</b></a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.innodb.com/wp/2009/03/talktalk-talk-mysql-conference-presentations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

