<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>domas mituzas &#187; io</title>
	<atom:link href="http://dom.as/tag/io/feed/" rel="self" type="application/rss+xml" />
	<link>http://dom.as</link>
	<description></description>
	<lastBuildDate>Thu, 02 Feb 2012 21:29:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='dom.as' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/6e344c6e0cd7462eb056f8b98eb2cbcd?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>domas mituzas &#187; io</title>
		<link>http://dom.as</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://dom.as/osd.xml" title="domas mituzas" />
	<atom:link rel='hub' href='http://dom.as/?pushpress=hub'/>
		<item>
		<title>Stonebraker trapped in Stonebraker &#039;fate worse than death&#039;</title>
		<link>http://dom.as/2011/07/08/stonebraker-trapped/</link>
		<comments>http://dom.as/2011/07/08/stonebraker-trapped/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 09:25:12 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[facebook]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[disks]]></category>
		<category><![CDATA[io]]></category>
		<category><![CDATA[memory]]></category>
		<category><![CDATA[newsql]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://dom.as/?p=880</guid>
		<description><![CDATA[Oh well, I know I shouldn&#8217;t poke directly at people, but they deserve that sometimes (at least in my very personal opinion). Heck, I even gave 12h window for this not to be hot-headed opinion. Those who followed MySQL at &#8230; <a href="http://dom.as/2011/07/08/stonebraker-trapped/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=880&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href='http://en.wikipedia.org/wiki/Troll_(Internet)'><img src='http://upload.wikimedia.org/wikipedia/en/thumb/7/73/Trollface.png/150px-Trollface.png' align='right' /></a></p>
<p>Oh well, I know I shouldn&#8217;t poke directly at people, but they <a href='http://gigaom.com/cloud/facebook-trapped-in-mysql-fate-worse-than-death/'>deserve</a> that sometimes (at least in my very personal opinion). Heck, I even gave 12h window for this not to be hot-headed opinion.</p>
<p>Those who followed <a href='http://facebook.com/MySQLatFacebook/'>MySQL at facebook</a> development probably know how much we focus on actual performance on top of mixed-composition I/O devices (flashcache, etc) &#8211; not just retreating to comfortable zone of in-memory (or in-pure-flash) data.</p>
<p>I feel somewhat sad that I have to put this truism out here &#8211; disks are way more cost efficient, and if used properly can be used to facilitate way more long-term products, not just real time data. Think Wikipedia without history, think comments that disappear on old posts, together with old posts, think all 404s you hit on various articles you remember from the past and want to read.</p>
<p>Building the web that lasts is completely different task from what academia people imagine building the web is.</p>
<p>I already had this issue with other RDBMS pioneer (there&#8217;s something in common among top database luminaries) &#8211; he also suggested that disks are things of the past and now everything has to be in memory, because memory is cheap. And data can be whatever unordered clutter, because CPUs can sort it, because CPUs are cheap.</p>
<p>They probably missed Al Gore message. Throwing more and more hardware without fine tuning for actual operational efficiency requirements is wasteful and harms our planet. Yes, we do lots of in-memory efficiency work, so that we reduce our I/O, but at the same time we balance the workload so that I/O subsystem provides as efficient as possible delivery of the long tail.</p>
<p>What happens in real world if one gets 2x efficiency gain? Twice more data can be stored, twice more data intensive products can be launched.<br />
What happens in academia of in-memory databases, if one gets 2x efficiency gain? A paper.<br />
What happens when real world doesn&#8217;t read your papers anymore? You troll everyone via GigaOM.</p>
<p>Though sure, there&#8217;s some operational overhead in handling sharding and availability of MySQL deployments, at large scale it becomes somewhat constant cost, whereas operational efficiency gains are linear.</p>
<p><b>Update:</b> Quite a few people pointed out that I was dissing a person who has done incredible amount of contributions, or that I&#8217;m anti-academia. I&#8217;m not, and I extremely value any work that people do wherever they are, albeit I do apply critical thinking to whatever they speak.</p>
<p>In my text above (I don&#8217;t want to edit and hide what I said) I don&#8217;t mean that &#8220;a paper&#8221; is useless. Me and my colleagues do read papers and try to understand the direction of computer science and how it applies to our work (there are indeed various problems yet to solve). I&#8217;d love to come up with something worth a paper (and quite a few of my colleagues did).</p>
<p>Still, if someone does not find that direction useful, there&#8217;s no way to portray them the way the original GigaOM article did.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/domasmituzas.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/domasmituzas.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/domasmituzas.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/domasmituzas.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/domasmituzas.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/domasmituzas.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/domasmituzas.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/domasmituzas.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/domasmituzas.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/domasmituzas.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/domasmituzas.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/domasmituzas.wordpress.com/880/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=880&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2011/07/08/stonebraker-trapped/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/en/thumb/7/73/Trollface.png/150px-Trollface.png" medium="image" />
	</item>
		<item>
		<title>InnoDB locking makes me sad</title>
		<link>http://dom.as/2011/07/03/innodb-index-lock/</link>
		<comments>http://dom.as/2011/07/03/innodb-index-lock/#comments</comments>
		<pubDate>Sun, 03 Jul 2011 11:05:00 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[facebook]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[innodb]]></category>
		<category><![CDATA[io]]></category>
		<category><![CDATA[mutex]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://dom.as/?p=873</guid>
		<description><![CDATA[Vadim and others have pointed at the index-&#62;lock problems before, but I think they didn&#8217;t good job enough at pointing out how bad it can get (the actual problematic was hidden somewhere as some odd edge case). What &#8216;index lock&#8217; &#8230; <a href="http://dom.as/2011/07/03/innodb-index-lock/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=873&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Vadim and others have <a href='http://www.mysqlperformanceblog.com/2010/02/25/index-lock-and-adaptive-search-next-two-biggest-innodb-problems/'>pointed</a> at the index-&gt;lock problems before, but I think they didn&#8217;t good job enough at pointing out how bad it can get (the actual problematic was hidden somewhere as some odd edge case). What &#8216;index lock&#8217; means is generally the fact that InnoDB has table-level locking which will kill performance on big tables miserably.</p>
<p>InnoDB is a huge pie of layers, that have various locking behaviors, and are layered on top of each other, and are structured nicely as subdirectories in your innodb_plugin directory. Low level storage interfaces are done via os/ routines, then on top of that there&#8217;s some file space manager, fsp/, which allocates space for btr/ to live in, where individual page/ entities live, with multiple row/ pieces. There&#8217;re few other subsystems around, that got quite some attention lately &#8211; e.g. buf/ pool, transaction log/, and large trx/ transactions are composed of micro transactions living in mtr/.</p>
<p>If you live in memory, you care about buffer pool and transaction log performance, if you write insane amounts of data to in-memory buffers you hit mtr/ problems and depend o how fast you can write out log/ or flush out buf/. If you are in I/O-heavy land most of stuff you care about happens in btr/.</p>
<p>Generally InnoDB is quite good about read scalability in I/O bound environments &#8211; nowadays one can saturate really fast I/O devices and there will be plenty of parallel reads done. Major scalability problem in this field was read-ahead which was funneling all read-ahead activity into a small set of threads, but other than that there can be hundreds of parallel reads issued to underlying devices. Situation changes when writes are added to the mix, though again, there&#8217;re few different scenarios.</p>
<p>There&#8217;re two ways for InnoDB to write out updates to pages, &#8220;optimistic&#8221; and &#8220;pessimistic&#8221;. Optimism here means that only in-page (page/row) operation will be needed without changing the tree structure. In one case you can expect quite high parallelism &#8211; multiple pages can be read for that operation at a time, multiple of them can be edited at a time, then some serialization will happen while writing out changes to redo log and undo segments. Expect good performance.</p>
<p>The much worse case is when B-Tree is supposed to be reorganized and multiple page operations can happen; thats pessimism. In this case whole index gets locked (via a read-write lock obtained from dict/),<br />
then B-Tree path is latched, then changes are done, then it is all unlocked until next row operation needs to hit the tree. Unfortunately, both &#8216;path is latched&#8217; and &#8216;changes are done&#8217; are expensive operations, and not only in-core, but are doing sync page read-ins, one at a time, which on busy systems serving lots of read load are supposed to be slow. Ironically, as no other operations can happen on the table at that time, you may find out you have spare I/O capacity.. ;-)</p>
<p>What gets quite interesting though is the actual operation needed to latch b-tree path. Usual wisdom would say that if you want to change a row (read-modify-write), you probably looked up the page already, so there won&#8217;t be I/O. Unfortunately, InnoDB uses an slightly more complicated binary tree version, where pages have links to neighbors, and tree latching does this (a bit simplified for reading clarity):</p>
<p><code><br />
/* x-latch also brothers from left to right */<br />
get_block = btr_block_get(space, zip_size, left_page_no, RW_X_LATCH, mtr);<br />
get_block = btr_block_get(space, zip_size, page_no, RW_X_LATCH, mtr);<br />
get_block = btr_block_get(space, zip_size, right_page_no, RW_X_LATCH, mtr);<br />
</code></p>
<p>So, essentially in this case, just because InnoDB is being pessimistic, it reads neighboring blocks to lock them, even if they may not be touched/accessed in any way &#8211; and bloats buffer pool at that time with tripple reads. It doesn&#8217;t cost much if whole tree fits in memory, but it is doing three I/Os in here, if we&#8217;re pessimistic about InnoDB being pessimistic (and I am). So, this isn&#8217;t just locking problem &#8211; it is also resource consumption problem at this stage.</p>
<p>Now, as the dictionary lock is hold in write mode, not only updates to this table stop, but reads too &#8211; think MyISAM kind of stop. Of course, this &#8216;table locking&#8217; happens at entirely different layer than MyISAM. In MyISAM it is statement-length locking whereas in InnoDB this lock is held just for row operation on single index, but if statement is doing multiple row operations it can be acquired multiple times.</p>
<p>Probably there exist decent workarounds if anyone wants to tackle this &#8211; grabbing read locks on the tree while reading pages into buffer pool, then escalating lock to exclusive. A bit bigger architectural change would be allowing to grab locks on neighbors (if they are needed) without bringing in page data into memory &#8211; but that needs InnoDB overlords to look at it. Talk to your closest MySQL vendor and ask for a fix!</p>
<p>How do regular workloads hit this? Larger your records are, more likely you are to have tree changes, lower your performance will be. In my edge case I was inserting 7k sized rows &#8211; even though my machine had multiple disks, once the dataset fell out of buffer pool, it couldn&#8217;t insert more than 50 rows a second, even though there were many disks idle and capacity gods cried. It gets worse with out-of-page blobs &#8211; then every operation is pessimistic.</p>
<p>Of course, there&#8217;re ways to work around this &#8211; usually by taking the hit of sharding/partitioning (this is where common wisdom of &#8220;large tables need to be partitioned&#8221; mostly comes from). Then, like with MyISAM, one will have multiple table locks and there may be some scalability then.</p>
<p>TL;DR: InnoDB index lock is major architectural performance flaw, and that is why you hear that large tables are slower. There&#8217;s a big chance that there&#8217;re more scalable engines for on-disk writes out there, and all the large InnoDB write/insert benchmarks were severely hit by this.</p>
<p><b>Update:</b> Filed bugs <a href='http://bugs.mysql.com/bug.php?id=61735'>#61735</a> and <a href='http://bugs.mysql.com/bug.php?id=61736'>#61736</a> with MySQL</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/873/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/873/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/domasmituzas.wordpress.com/873/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/domasmituzas.wordpress.com/873/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/domasmituzas.wordpress.com/873/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/domasmituzas.wordpress.com/873/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/domasmituzas.wordpress.com/873/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/domasmituzas.wordpress.com/873/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/domasmituzas.wordpress.com/873/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/domasmituzas.wordpress.com/873/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/domasmituzas.wordpress.com/873/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/domasmituzas.wordpress.com/873/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/domasmituzas.wordpress.com/873/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/domasmituzas.wordpress.com/873/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=873&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2011/07/03/innodb-index-lock/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>Logs memory pressure</title>
		<link>http://dom.as/2010/11/18/logs-memory-pressure/</link>
		<comments>http://dom.as/2010/11/18/logs-memory-pressure/#comments</comments>
		<pubDate>Thu, 18 Nov 2010 14:59:33 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[facebook]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[directio]]></category>
		<category><![CDATA[innodb]]></category>
		<category><![CDATA[io]]></category>
		<category><![CDATA[memory]]></category>

		<guid isPermaLink="false">http://dom.as/?p=818</guid>
		<description><![CDATA[Warning, this may be kernel version specific, albeit this kernel is used by many database systems Lately I&#8217;ve been working on getting more memory used by InnoDB buffer pool &#8211; besides obvious things like InnoDB memory tax there were seemingly &#8230; <a href="http://dom.as/2010/11/18/logs-memory-pressure/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=818&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><i>Warning, this may be kernel version specific, albeit this kernel is used by many database systems</i></p>
<p>Lately I&#8217;ve been working on getting more memory used by InnoDB buffer pool &#8211; besides obvious things like InnoDB <a href='http://dom.as/2008/05/29/wasting-innodb-memory/'>memory tax</a> there were seemingly external factors that were pushing out MySQL into swap (even with swappiness=0). We were working a lot on getting low hanging fruits like scripts that use too much memory, but they seem to be all somewhat gone, but MySQL has way too much memory pressure from outside.</p>
<p>I grabbed my <a href='http://dom.as/2009/06/26/uncache/'>uncache</a> utility to assist with the investigation and started uncaching various bits on two systems, one that had larger buffer pool (60G), which was already being sent to swap, and a conservatively allocated (55G) machine, both 72G boxes. Initial finds were somewhat surprising &#8211; apparently on both machines most of external-to-mysqld memory was conserved by two sets of items:</p>
<ul>
<li><b>binary logs</b> &#8211; write once, read only tail (sometimes, if MySQL I/O cache cannot satisfy) &#8211; we saw nearly 10G consumed by binlogs on conservatively allocated machines</li>
<li><b>transaction logs</b> &#8211; write many, read never (by MySQL), buffered I/O &#8211; full set of transaction logs was found in memory</li>
</ul>
<p>It was remarkably easy to get rid of binlogs from cache, both by calling out &#8216;uncache&#8217; from scripts, or using this tiny Python class:</p>
<pre>
libc = ctypes.CDLL("libc.so.6")
class cachedfile (file):
    FADV_DONTNEED = 4
    def uncache(self):
        libc.posix_fadvise(self.fileno(), 0, 0, self.FADV_DONTNEED)
</pre>
<p>As it was major memory stress source, it was somewhat a no brainer that binlogs have to be removed from cache &#8211; something that can be serially re-read is taking space away from a buffer pool which avoids random reads. It may make sense to call posix_fadvise() right after writes to them, even.</p>
<p>Transaction logs, on the other hand, are entirely different beast. From MySQL perspective they should be uncached immediately, as nobody ever ever reads them (crash recovery aside, but re-reading then is relatively cheap, as no writes or random reads are done during log read phase). Unfortunately, the problem lies way below MySQL, and thanks to PeterZ for reminding me (we had a small chat about this at Jeremy&#8217;s <a href='http://www.meetup.com/mysql-silicon-valley/'>Silicon Valley MySQL Meetup</a>).</p>
<p>MySQL transaction records are stored in multiple log groups per transaction, then written out as per-log-group writes (each is in multiple of 512 bytes), followed by fsync(). This allows FS to do transaction log write as single I/O operation. This also means that it will be doing partial page writes to buffered files &#8211; overwriting existing data in part of the page, so it has to be read from storage.</p>
<p>So, if all transaction log pages are removed from cache, quite some of them will have to be read back in (depending on sizes of transactions, probably all of them in some cases). Oddly enough, when I tried to hit the edge case, single thread transactions-per-second remained same, but I saw consistent read I/O traffic on disks. So, this would probably work on systems, that have spare I/O (e.g. flash based ones).</p>
<p>Of course, as writes are already in multiples of 512 (and appears that memory got allocated just fine), I could try out direct I/O &#8211; it should avoid page read-in problem and not cause any memory pressure by itself. In this case switching InnoDB to use O_DIRECT was a bit dirtier &#8211; one needs to edit source code and rebuild the server, restart, etc, or&#8230;<br />
<code><br />
# lsof ib_logfile*<br />
# gdb -p $(pidof mysqld)<br />
(gdb) call os_file_set_nocache(9, "test", "test")<br />
(gdb) call os_file_set_nocache(10, "test", "test")<br />
</code><br />
I did not remove fsync() call, but as it is somewhat noop on O_DIRECT files, I left it there, probably it would change benchmark results, but not much.</p>
<p>Some observations:</p>
<ul>
<li>O_DIRECT was ~10% faster at best case scenario &#8211; lots of tiny transactions in single thread</li>
<li>If group commit is used (without binlogs), InnoDB can have way more transactions with multiple threads using buffered I/O, as it does multiple writes per fsync</li>
<li>Enabling sync_binlog makes the difference not that big &#8211; even with many parallel writes direct writes are 10-20% slower than buffered ones</li>
<li>Same for innodb_flush_log_on_trx_commit0 &#8211; multiple writes per fsync are much more efficient with buffered I/O</li>
<li>One would need to do log group merge to have more efficient O_DIRECT for larger transactions</li>
<li>O_DIRECT does not have theoretical disadvantage, current deficiencies are just implementation oriented at buffered I/O &#8211; and can be resolved by (in same areas &#8211; extensive) engineering</li>
<li>YMMV. In certain cases it definitely makes sense even right now, in some other &#8211; not so much</li>
</ul>
<p>So, the outcome here depends on many variables &#8211; with flash read-on-write is not as expensive, especially if read-ahead works. With disks one has to see what is better use for the memory &#8211; using it for buffer pool reduces amount of data reads, but causes log reads. And of course, O_DIRECT wins in the long run :-)</p>
<p>With this data moved away from cache and InnoDB memory tax reduced one could switch from using 75 % of memory to 90% or even 95% for InnoDB buffer pools. Yay?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/818/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/818/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/domasmituzas.wordpress.com/818/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/domasmituzas.wordpress.com/818/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/domasmituzas.wordpress.com/818/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/domasmituzas.wordpress.com/818/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/domasmituzas.wordpress.com/818/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/domasmituzas.wordpress.com/818/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/domasmituzas.wordpress.com/818/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/domasmituzas.wordpress.com/818/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/domasmituzas.wordpress.com/818/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/domasmituzas.wordpress.com/818/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/domasmituzas.wordpress.com/818/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/domasmituzas.wordpress.com/818/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=818&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2010/11/18/logs-memory-pressure/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>on performance stalls</title>
		<link>http://dom.as/2010/09/22/on-performance-stalls/</link>
		<comments>http://dom.as/2010/09/22/on-performance-stalls/#comments</comments>
		<pubDate>Wed, 22 Sep 2010 13:22:43 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[facebook]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[innodb]]></category>
		<category><![CDATA[io]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[pmp]]></category>
		<category><![CDATA[stalls]]></category>

		<guid isPermaLink="false">http://mituzas.lt/?p=795</guid>
		<description><![CDATA[We quite often say, that benchmark performance is usually different from real world performance &#8211; so performance engineering usually has to cover both &#8211; benchmarks allow to understand sustained performance bottlenecks, and real world analysis usually concentrates on something what &#8230; <a href="http://dom.as/2010/09/22/on-performance-stalls/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=795&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>We quite often say, that benchmark performance is usually different from real world performance &#8211; so performance engineering usually has to cover both &#8211; benchmarks allow to understand sustained performance bottlenecks, and real world analysis usually concentrates on something what would be considered &#8216;exceptional&#8217; and not important in benchmarks &#8211; stalls of various kind. They are extremely important, as the state when our performance is lowest is the state of performance we provide to our platform users.</p>
<p>On a machine that is doing 5000qps, stalling for 100ms means that 500 queries were not served as fast as they could, or even hit application timeouts or exceptional MySQL conditions (like <a href='http://bugs.mysql.com/bug.php?id=26590'>1023</a> transaction limit). Of course, stalling for a second means 5000 queries were not served in time&#8230;</p>
<p>We have multiple methods to approach this &#8211; one is our &#8216;dogpiled&#8217; framework &#8211; an agent doing status polling every second and reporting information about I/O state, MySQL/InnoDB statuses, processlists, etc &#8211; so we see the scope of stalls in our environment. We try to maintain the threshold between complete information overload and something that reveals problems &#8211; so it is always balancing act, especially with great work done by engineering team :)</p>
<p>Other approach, usually led to by dogpiles information, is auto-<a href='http://poormansprofiler.org'>PMP</a> &#8211; high-frequency status polling combined with gdb invocations, that allow us to jump into the process whenever we notice something weird is going on. We have some extensions to how we use PMP &#8211; but thats worth another post.</p>
<p>Issues we do find out that harm us most in production environments are ones that are quite often discarded as either &#8220;this never happens&#8221; or &#8220;get better hardware&#8221; or &#8220;your application is wrong&#8221;. Unfortunately, that happens, we do have thousands of machines that aren&#8217;t free and our application demands are our application demands :)</p>
<p>Few examples:</p>
<ul>
<li><a href='http://bugs.mysql.com/bug.php?id=56696'>TRUNCATE stalls the server</a> (oh well, <a href='http://bugs.mysql.com/bug.php?id=41158'>DROP TABLE too</a>) &#8211; in this case, truncating a table grabs dictionary mutex, other transaction blocks while holding LOCK_open, everything else stops. Though truncating is supposed to be fast operation, it has to unlink (delete) a file, and with large files such operation isn&#8217;t really instant on any filesystem. Even if one deletes all the data before truncating, file is still on the filesystem.</li>
<li><a href='http://bugs.mysql.com/bug.php?id=56433'>Extending data files stalls the server</a> &#8211; when a data file is being extended, global mutex is held, which blocks all I/Os (with limited concurrency that is full server stall). Somewhat more impressive with file-per-table. This is the major reason for mini-stalls at the moment &#8211; on machines that grow at gigabytes-a-day rate this is being hit quite often.</li>
<li><a href='http://bugs.mysql.com/bug.php?id=56340'>Updating table statistics stalls the server</a> &#8211; we hit this with high-performance task tracking machines, row churn there is quite amazing, and dictionary statistics are reread more often than one would expect. Updating statistics means locking the table while doing random reads from disk. Once major workload is hitting that table, it quickly escalates to full server stall</li>
<li><a href='http://bugs.mysql.com/bug.php?id=55004'>Fuzzy checkpoint stalls the server</a> &#8211; this is one of biggest issues outstanding in stock MySQL &#8211; though one would expect that &#8220;fuzzy checkpoint&#8221; that uses async background threads is nonblocking, actually all writes during it will stall, taking all concurrency slots and leading to a server stall. Mark&#8217;s fix was just doing this work in background thread.</li>
<li>(no bug filed on this yet) &#8211; Purge stalls the server &#8211; purge holds dictionary lock while doing random reads from disk, with table stall leading to server stall.</li>
</ul>
<p>There&#8217;re more issues (mostly related to heavier in-memory activities of the server), but these ones are most obvious ones &#8211; where single I/O request done is escalated to table or instance lockup, where no other work is done. Our machines have multiple disks, multiple CPUs and can support multiple SQL queries being executed at once, so any of these lockups effectively limit our available performance or damage the quality of service we can provide.</p>
<p>On the upside, my colleagues are absolutely amazing and I&#8217;m sure that we will have all these issues fixed in our deployment in near future, as well as everyone will be able to pick that up via <a href='https://code.launchpad.net/mysqlatfacebook'>mysqlatfacebook</a> branch.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/795/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/795/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/domasmituzas.wordpress.com/795/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/domasmituzas.wordpress.com/795/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/domasmituzas.wordpress.com/795/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/domasmituzas.wordpress.com/795/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/domasmituzas.wordpress.com/795/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/domasmituzas.wordpress.com/795/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/domasmituzas.wordpress.com/795/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/domasmituzas.wordpress.com/795/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/domasmituzas.wordpress.com/795/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/domasmituzas.wordpress.com/795/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/domasmituzas.wordpress.com/795/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/domasmituzas.wordpress.com/795/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=795&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2010/09/22/on-performance-stalls/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>Read ahead&#8230;</title>
		<link>http://dom.as/2010/01/02/read-ahead/</link>
		<comments>http://dom.as/2010/01/02/read-ahead/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 13:00:43 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[innodb]]></category>
		<category><![CDATA[io]]></category>

		<guid isPermaLink="false">http://mituzas.lt/?p=720</guid>
		<description><![CDATA[Mark wrote about how to find situations where InnoDB read-ahead is a bottleneck. What he didn&#8217;t disclose, though, is his trick to disable read-ahead without restart or recompile of MySQL. See, there&#8217;s no internal &#8220;disable read ahead knob&#8221;. But there &#8230; <a href="http://dom.as/2010/01/02/read-ahead/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=720&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Mark <a href="http://www.facebook.com/notes/mysqlfacebook/when-doesnt-innodb-readahead-work/198536580932">wrote</a> about how to find situations where InnoDB read-ahead is a bottleneck. What he didn&#8217;t disclose, though, is his trick to disable read-ahead without restart or recompile of MySQL. See, there&#8217;s no internal &#8220;disable read ahead knob&#8221;. But there is&#8230;</p>
<pre>buf_read_ahead_random(...){ ...
       if (srv_startup_is_before_trx_rollback_phase) {
                /* No read-ahead to avoid thread deadlocks */
                return(0);
        }</pre>
<p>This variable is tested at two functions &#8211; buf_read_ahead_linear() and buf_read_ahead_random() and <strong>nowhere else</strong>. So yeah, &#8220;server startup is before transaction rollback phase&#8221; is another way of saying &#8220;don&#8217;t do read ahead, please please&#8221;.</p>
<pre>gdb -ex "set  srv_startup_is_before_trx_rollback_phase=1" \
    --batch -p $(pidof mysqld)</pre>
<p>And many servers bottlenecked on this became much much much faster (and 2000 concurrent threads running dropped to 10). Of course, this is most visible in high-latency-high-throughput I/O situations, but we&#8217;re hitting this contention spot on local disk setups too.</p>
<p>Don&#8217;t forget to have <a href="http://dom.as/2009/12/29/when-bad-things-happen/">the fix</a> if gdb decides to be nasty and locks up your server :)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/720/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/720/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/domasmituzas.wordpress.com/720/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/domasmituzas.wordpress.com/720/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/domasmituzas.wordpress.com/720/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/domasmituzas.wordpress.com/720/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/domasmituzas.wordpress.com/720/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/domasmituzas.wordpress.com/720/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/domasmituzas.wordpress.com/720/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/domasmituzas.wordpress.com/720/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/domasmituzas.wordpress.com/720/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/domasmituzas.wordpress.com/720/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/domasmituzas.wordpress.com/720/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/domasmituzas.wordpress.com/720/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=720&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2010/01/02/read-ahead/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>On file system benchmarks</title>
		<link>http://dom.as/2009/06/30/on-file-system-benchmarks/</link>
		<comments>http://dom.as/2009/06/30/on-file-system-benchmarks/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 21:34:35 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[benchmarks]]></category>
		<category><![CDATA[io]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[xfs]]></category>

		<guid isPermaLink="false">http://mituzas.lt/?p=519</guid>
		<description><![CDATA[I see this benchmark being quoted in multiple places, and there I see stuff like: When carrying out more database benchmarking, but this time with PostgreSQL, XFS and Btrfs were too slow to even complete this test, even when it &#8230; <a href="http://dom.as/2009/06/30/on-file-system-benchmarks/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=519&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I see <a href="http://www.phoronix.com/scan.php?page=article&amp;item=ext4_btrfs_nilfs2">this benchmark</a> being quoted in multiple places, and there I see stuff like:</p>
<blockquote><p>When carrying out more database benchmarking, but this time with PostgreSQL, XFS and Btrfs were too slow to even complete this test, even when it had been running for more than an hour for a single run. Between EXT3, EXT4, and NILFS2, the fastest file-system was EXT3 and then its successor, EXT4, was slightly behind that. Far behind the position of EXT4 were NILFS2 and then Btrfs and XFS.</p></blockquote>
<p>There were few other benchmarks, e.g. SQLite showed &#8216;bad performance&#8217; on XFS and Btrfs.</p>
<p>*clear throat*</p>
<p>Dear benchmarkers, don&#8217;t compare apples and oranges. If you see differences between benchmarks, do some very very tiny research, and use some intellect, that you, as primates, do have. If database tests are slowest on filesystems created by Oracle (who know some stuff about systems in general) or SGI (who, despite giving away their campus to Google, still have lots of expertise in the field), that can indicate, that your tests are probably flawed somewhere, at least for that test domain.</p>
<p>Now, probably you&#8217;ve heard about such thing as &#8216;data consistency&#8217;. That is something what database stack tries to ensure, sometimes at higher costs, like not trusting volatile caches, enforcing certain write orders, depending on acknowledgements by underlying hardware.</p>
<p>So, in this case it wasn&#8217;t &#8220;benchmarking file systems&#8221;, it was simply, benchmarking &#8220;consistency&#8221; against &#8220;no consistency&#8221;. But don&#8217;t worry, most benchmarks have such flaws &#8211; getting numbers but not understanding them makes results much more interesting, right?</p>
<p>Oh, and&#8230; thanks for few more misguided people.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/domasmituzas.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/domasmituzas.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/domasmituzas.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/domasmituzas.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/domasmituzas.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/domasmituzas.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/domasmituzas.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/domasmituzas.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/domasmituzas.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/domasmituzas.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/domasmituzas.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/domasmituzas.wordpress.com/519/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=519&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2009/06/30/on-file-system-benchmarks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>Linux 2.6.29</title>
		<link>http://dom.as/2009/03/24/linux-2629/</link>
		<comments>http://dom.as/2009/03/24/linux-2629/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 15:16:01 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[io]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://dammit.lt/?p=434</guid>
		<description><![CDATA[2.6.29 was released. I don&#8217;t usually write about linux kernel releases, thats what Slashdot is for :), but this one introduces write barriers in LVM, as well as ext4 with write barriers enabled by default. If you run this kernel &#8230; <a href="http://dom.as/2009/03/24/linux-2629/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=434&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>2.6.29 was released. I don&#8217;t usually write about linux kernel releases, thats what <a href="http://slashdot.org">Slashdot</a> is for :), but this one introduces write barriers in LVM, as well as ext4 with write barriers enabled by default. If you run this kernel and forget to turn off barrier support at filesystems (like XFS, nobarrier), you will see nasty performance slowdowns (<a href="http://dom.as/2008/11/03/xfs-write-barriers/">recent post about it</a>). Beware.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/434/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/434/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/domasmituzas.wordpress.com/434/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/domasmituzas.wordpress.com/434/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/domasmituzas.wordpress.com/434/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/domasmituzas.wordpress.com/434/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/domasmituzas.wordpress.com/434/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/domasmituzas.wordpress.com/434/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/domasmituzas.wordpress.com/434/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/domasmituzas.wordpress.com/434/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/domasmituzas.wordpress.com/434/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/domasmituzas.wordpress.com/434/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/domasmituzas.wordpress.com/434/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/domasmituzas.wordpress.com/434/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=434&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2009/03/24/linux-2629/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>iostat -x</title>
		<link>http://dom.as/2009/03/11/iostat/</link>
		<comments>http://dom.as/2009/03/11/iostat/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 18:26:48 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[io]]></category>
		<category><![CDATA[iostat]]></category>

		<guid isPermaLink="false">http://dammit.lt/?p=393</guid>
		<description><![CDATA[My favorite Linux tool in DB work is &#8216;iostat -x&#8217; (and I really really want to see whenever I&#8217;m doing any kind of performance analysis), yet I had to learn its limitations and properties. For example, I took 1s snapshot &#8230; <a href="http://dom.as/2009/03/11/iostat/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=393&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>My favorite Linux tool in DB work is &#8216;iostat -x&#8217; (and I really really want to see whenever I&#8217;m doing any kind of performance analysis), yet I had to learn its limitations and properties. For example, I took 1s snapshot from a slightly overloaded 16-disk database box:</p>
<pre>avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           8.12    0.00    2.57   21.65    0.00   67.66

Device:  rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s \
sda     7684.00    19.00 2420.00  498.00 81848.00  5287.00 \

        avgrq-sz avgqu-sz   await  svctm  %util
           29.86    32.99   11.17   0.34 100.00</pre>
<p>I pasted this somewhere on IRC, and got &#8220;doesn&#8217;t look too healthy&#8221; and that it is disk-bound. Now, to understand if it really is, one has to understand what iostat tells here.</p>
<p>First line of numbers shows that we&#8217;ve got plenty of CPU resources (thats because nowadays it is quite difficult to get a box with not enough CPU power, and I/O still seems to be bottleneck) &#8211; and we have more threads waiting for I/O than we have CPU execution (that sounds normal).</p>
<p>Now the actual per-disk statistics are where one should look. I used to prefer %util over general %iowait (I couldn&#8217;t really explain what %iostat is, and I can say what %util is). I don&#8217;t know why, but iostat has most interesting bits at the end, and not so interesting at the start:</p>
<ul>
<li><strong>%util</strong>: how much time did the storage device have outstanding work (was busy). In proper RAID environments it is more like &#8220;how much time did at least one disk in RAID array have something to do&#8221;. I&#8217;m deliberately excluding any kind of cache here &#8211; if request can be served from cache, the chance is quite negligible it will show up in %util, unlike in other values. What this also means &#8211; the RAID subsystem can be loaded from 6.25% (one disk doing the work) to 100% (all of them busy). Thats quite a lot of insight in single value of &#8217;100%&#8217;, isn&#8217;t it?</li>
<li><strong>svctm</strong>: Though manual says &#8220;The average service time (in milliseconds) for I/O requests that were issued to the device.&#8221;, it isn&#8217;t exactly that when you look at multiple-disk systems. What it says is, &#8220;when your I/O subsystem is busy, how fast does it respond requests overall&#8221;. Actually, less you load your system, higher svctm is (as there&#8217;re less outstanding requests, and average time to serve them goes up). Of course, at some certain moment, when I/O becomes really overloaded, you can see svctm going up. One can tweak /sys/block/sda/queue/nr_requests based on this &#8211; to avoid overloading I/O controller, though that is really rarely needed.</li>
<li><strong>await</strong>. One of my favorites &#8211; how fast do requests go through. It is just an average, how long it takes to serve a request for a device, once it gets into device queue, to final &#8220;OK&#8221;. Low = good, high = bad. There&#8217;re few gotchas here &#8211; even though different reads can have different performance properties (middle of disk, outer areas of disk, etc), the biggest difference is between reads and writes. Reads take time, writes can be instant (write caching at underlying layers..). As 80% of requests were reads, we can try to account for that by doing 11.17/0.8 math, to get 14ms figure. Thats quite high &#8211; systems that aren&#8217;t loaded can show ~5ms times (which isn&#8217;t that far away from 4ms rotation time of 15krpm disk).</li>
<li><strong>avgqu-sz</strong>: Very very very important value &#8211; how many requests are there in a request queue. Low = either your system is not loaded, or has serialized I/O and cannot utilize underlying storage properly. High = your software stack is scalable enough to load properly underlying I/O. Queue size equal to amount of disks means (in best case of request distribution) that all your disks are busy. Queue size higher than amount of disks means that you are already trading I/O response time for better throughput (disks can optimize order of operations if they know them beforehand, thats what <a href="http://en.wikipedia.org/wiki/NCQ">NCQ &#8211; Native Command Queueing</a> does). If one complains about I/O performance issues when avgqu-sz is lower, then it is application specific stuff, that can be resolved with more aggressive read-ahead, less fsyncs, etc. One interesting part &#8211; avqu-sz, await, svctm and %util are iterdependent ( await = avgqu-sz * svctm / (%util/100)</li>
<li><strong>avgrq-sz</strong>: Just an average request size. Quite often will look like a block size of some kind &#8211; can indicate what kind of workload happens. This is already post-merging, so lots of adjacent block operations will bump this up. Also, if database page is 16k, though filesystem or volume manager block is 32k, this will be seen in avgrq-sz. Large requests indicate there&#8217;s some big batch/stream task going on.</li>
<li><strong>wsec/s &amp; rsec/s</strong>: Sectors read and written per second. Divide by 2048, and you&#8217;ll get megabytes per second. I wanted to write this isn&#8217;t important, but remembered all the non-database people who store videos on filesystems :) So, if megabytes per second matter, these values are important (and can be seen in &#8216;vmstat&#8217; output too). If not, for various database people there are other ones:</li>
<li><strong>r/s &amp; w/s</strong>: Read and write requests per second. This is already post-merging, and in proper I/O setups reads will mean blocking random read (serial reads are quite often merged), and writes will mean non-blocking random write (as underlying cache can allow to serve the OS instantly). These numbers are the ones that are the I/O capacity figures, though of course, depending on how much pressure underlying I/O subsystem gets (queue size!), they can vary. And as mentioned above, on rotational media it is possible to trade response time (which is not that important in parallel workloads) for better throughput.</li>
<li><strong>rrqm/s &amp; wrqm/s</strong>: How many requests were merged by block layer. In ideal world, there should be no merges at I/O level, because applications would have done it ages ago. Ideals differ though, for others it is good to have kernel doing this job, so they don&#8217;t have to do it inside application. Quite often there will be way less merges, because applications which tend to write adjacent blocks, also tend to wait after every write (see my rant on <a href="http://dom.as/2008/02/05/linux-io-schedulers/">I/O schedulers</a>). Reads however can be merged way easier &#8211; especially if application does &#8220;read ahead&#8221; block by block. Another reason for merges is simple block size mismatch &#8211; 16k database pages on top of 8k database pages will cause adjacent block reads, which would be merged by block layer. On some systems read of two adjacent pages would result in 1MB reads, but thats another rant :)</li>
<li><strong>Device:</strong> &#8211; just to make sure, that you&#8217;re looking at the right device. :-)</li>
</ul>
<p>So, after all this, the iostat output above tells us something like:</p>
<ul>
<li>System has healthy high load (request queue has two-requests-per-disk)</li>
<li>Average request time is double the value one would expect from idle system, it isn&#8217;t too harmful, but one can do better</li>
<li>It is reading <s>80</s> 40MB/s from disks, at 2420 requests/s. Thats quite high performance from inexpensive 2u database server (shameless plug: X4240 :)</li>
<li>High amount of merges comes from LVM snapshots, can be ignored</li>
<li>System is alive, healthy and kicking, no matter what anyone says :)</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/domasmituzas.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/domasmituzas.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/domasmituzas.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/domasmituzas.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/domasmituzas.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/domasmituzas.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/domasmituzas.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/domasmituzas.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/domasmituzas.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/domasmituzas.wordpress.com/393/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/domasmituzas.wordpress.com/393/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/domasmituzas.wordpress.com/393/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=393&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2009/03/11/iostat/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>ZFS and MySQL &#8230; not yet</title>
		<link>http://dom.as/2008/11/15/zfs-mysql/</link>
		<comments>http://dom.as/2008/11/15/zfs-mysql/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 04:33:57 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[innodb]]></category>
		<category><![CDATA[io]]></category>
		<category><![CDATA[myisam]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[solaris]]></category>
		<category><![CDATA[zfs]]></category>

		<guid isPermaLink="false">http://dammit.lt/2008/11/15/268/</guid>
		<description><![CDATA[Today I attended kick-ass ZFS talk (3 hours of incredibly detailed material presented by someone who knows the stuff and knows how to talk) at CEC (Sun internal training event/conference), so now I know way more about ZFS than I &#8230; <a href="http://dom.as/2008/11/15/zfs-mysql/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=268&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Today I attended kick-ass ZFS talk (3 hours of incredibly detailed material presented by someone who knows the stuff and knows how to talk) at CEC (Sun internal training event/conference), so now I know way more about ZFS than I used to. Probably I know way more about ZFS than Average Joe DBA \o/ </p>
<p>And now I think ZFS has lots of brilliant design and implementation bits, except it doesn&#8217;t match database access pattern needs. </p>
<p>See, ZFS is not a regular POSIX-API -&gt; HDD bridge, unlike pretty much everything out there. It is transactional object store which allows multiple access semantics, APIs, and standard ZFS POSIX Layer (ZPL) is just one of them. In MySQL talk, think of all other filesystems as of MyISAM, and ZFS is InnoDB :-) </p>
<p>So, putting InnoDB on top of ZFS after some high-school-like variable replacement ends up &#8220;putting InnoDB on top of InnoDB&#8221;. Let&#8217;s go a bit deeper here:</p>
<ul>
<li>ZFS has checksums, so does InnoDB (though ZFS checksums are faster, Fletcher-derived, etc ;-)</li>
<li>ZFS has atomicity, so does InnoDB</li>
<li>ZFS has ZIL (Intent Log), so does InnoDB (Transaction Log)</li>
<li>ZFS has background intelligent flushing of data, so does InnoDB (maybe not that intelligent though)</li>
<li>ZFS has Adaptive Replacement Cache, so does InnoDB (calls it Buffer Pool, instead of three replacement queues uses just one &#8211; LRU, doesn&#8217;t account for MFU)</li>
<li>ZFS has copy-on-write snapshotting, so does InnoDB (MVCC!)</li>
<li>ZFS has compression, so does InnoDB (in plugin, though)</li>
<li>ZFS has intelligent mirroring/striping/etc, this is why InnoDB people use RAID controllers.</li>
<li>ZFS has bit-rot recovery and self healing and such, InnoDB has assertions and crashes :-)</li>
</ul>
<p>So, we have two intelligent layers on top of each other, and there&#8217;s lots of work duplicated. Of course, we can try to eliminate some bits:</p>
<ul>
<li>Disable checksums at InnoDB level</li>
<li>Unfortunately, there&#8217;s nothing to be done about two transaction logs</li>
<li>Dirty pages can be flushed immediately by InnoDB, probably is tunable at ZFS level too</li>
<li>InnoDB buffer pool may be probably reduced, to favor ARC, or opposite&#8230;</li>
<li>Double Copy-on-write is inevitable (and copy-on-write transaction log does not really make sense&#8230;)</li>
<li>Compression can be done at either level</li>
<li>ZFS use for volume management would be the major real win, as well as all the self healing capacity</li>
</ul>
<p>So, I&#8217;m not too convinced at this moment about using this combo, but there&#8217;s another idea circulating around for quite a while &#8211; what if MyISAM suddenly started using all the ZFS capabilities. Currently the ZPL and actual ZFS object store management are mutually exclusive &#8211; you have to pick one way, but if ZPL would be extended to support few simple operations (create/drop snapshots just on single file, wrap multiple write() calls into a transaction), MyISAM could get a different life:</p>
<ul>
<li>Non-blocking SELECTs could be implemented using snapshots</li>
<li>Writes would be atomic and non-corrupting</li>
<li>MyISAM would get checksummed, compressed, consistent data, that is flushed by intelligent background threads, and would have immediate crash recovery</li>
<li>For replication slaves write concurrency would not be that necessary (single thread is updating data anyway)</li>
<li>&#8220;Zettabyte&#8221; (was told not to use this ;-) File System would actually allow Zettabyte-MyISAM-Tables o/</li>
<li>All the Linux people (including me :) would complain about Sun doing something just for [Open]Solaris, instead of working on [insert favorite storage engine here]. </li>
</ul>
<p>Unfortunately, to implement that now one would have either to tap directly into object management API (that would mean quite a bit of rewriting), or wait for ZFS people to extend the ZPL calls. And for now, I&#8217;d say, &#8220;not yet&#8221;.</p>
<p><i>Disclaimer: the opinion of the author does not represent opinion of his employer (especially Marketing people), and may be affected by the fact, that the author was enjoying free wireless and whoever knows what else in Las Vegas McCarran International Airport. </i></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/268/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/domasmituzas.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/domasmituzas.wordpress.com/268/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/domasmituzas.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/domasmituzas.wordpress.com/268/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/domasmituzas.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/domasmituzas.wordpress.com/268/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/domasmituzas.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/domasmituzas.wordpress.com/268/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/domasmituzas.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/domasmituzas.wordpress.com/268/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/domasmituzas.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/domasmituzas.wordpress.com/268/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=268&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2008/11/15/zfs-mysql/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>On SSDs, rotations and I/O</title>
		<link>http://dom.as/2008/11/09/on-ssd-io/</link>
		<comments>http://dom.as/2008/11/09/on-ssd-io/#comments</comments>
		<pubDate>Sun, 09 Nov 2008 16:05:18 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[disks]]></category>
		<category><![CDATA[innodb]]></category>
		<category><![CDATA[io]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[ssd]]></category>

		<guid isPermaLink="false">http://dammit.lt/?p=266</guid>
		<description><![CDATA[Every time anyone mentions SSDs, I have a feeling of futility and being useless in near future. I have spent way too much time to work around limitations of rotational media, and understand the implications of whole vertical data stack &#8230; <a href="http://dom.as/2008/11/09/on-ssd-io/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=266&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Every time anyone mentions SSDs, I have a feeling of futility and being useless in near future. I have spent way too much time to work around limitations of rotational media, and understand the implications of whole vertical data stack on top.</p>
<p>The most interesting upcoming shift is not only the speed difference, but simply different cost balance between reads and writes. With modern RAID controllers and modern disks and modern filesystems reads are way more expensive operation from application perspective than writes.</p>
<p>Writes can be merged at application and OS level, buffered at I/O controller level, and even sped up by on-disk volatile cache (NCQ write reordering can give +30% faster random write performance).</p>
<p>Reads have none of that. Of course, there&#8217;re caches, but they don&#8217;t speed up actual read operations, they just help to avoid them. This leads to very disproportionate amount of caches needed for reads, compared to writes.</p>
<p>Simply, 32GB system with MySQL/InnoDB will be wasting 4GB on mutexes (argh!!..), few more gigs on data dictionary (arghhh #2), and everything else for read caching inside buffer pool. There may be some dirty pages and adaptive hash or insert buffer entries, but they are all there not because systems lack write output capacity, but simply because of braindead InnoDB page flushing policy.</p>
<p>Also, database write performance is mostly impacted not because of actual underlying write speed, but simply because every write has to read from multiple scattered places to actually find what needs to be changed.</p>
<p>This is where SSDs matter &#8211; they will have same satisfactory write performance (and fixes for InnoDB are out there ;-) &#8211; but the read performance will be <i>satisfactory</i> (uhm, much much better) too.</p>
<p>What this would mean for MySQL use:</p>
<ul>
<li>Buffer pool, key cache, read-ahead buffers &#8211; all gone (or drastically reduced).</li>
<li>Data locality wouldn&#8217;t matter that much anymore either, covering indexes would provide just double performance, rather than up to 100x speed increase.</li>
<li>Re-reading data may be cheaper, than including it in various temporary sorting and grouping structures</li>
<li>RAIDs no longer needed (?), though RAM-backed write-behind caching would still be necessary</li>
<li>Log-based storage designs like PBXT will make much more sense</li>
<li>Complex data flushing logic like inside InnoDB&#8217;s will not be useful anymore (one can say, it is useless already ;-) &#8211; and straightforward methods such as in Maria are welcome again.</li>
</ul>
<p>Probably the happiest camp out there are PostgreSQL people &#8211; data locality issues were plaguing their performance most, and it is strong side of InnoDB. On the other hand, MySQL has pluggable engine support, so it may be way easier to produce SSD versions for anything we have now, or just use new ones (hello, Maria!).</p>
<p>Still, there is quite some work to adapt to the new storage model, and judging by the fact how InnoDB works with modern rotational media, we will need some very strong push to adapt it for the new stuff.</p>
<p>You can sense the futility of any work done to optimize for rotation &#8211; all the &#8220;make reads fast&#8221; techniques will end up resolved at hardware layer, and the human isn&#8217;t needed anymore (nor all these servers with lots of memory and lots of spindles).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/266/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/266/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/domasmituzas.wordpress.com/266/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/domasmituzas.wordpress.com/266/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/domasmituzas.wordpress.com/266/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/domasmituzas.wordpress.com/266/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/domasmituzas.wordpress.com/266/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/domasmituzas.wordpress.com/266/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/domasmituzas.wordpress.com/266/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/domasmituzas.wordpress.com/266/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/domasmituzas.wordpress.com/266/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/domasmituzas.wordpress.com/266/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/domasmituzas.wordpress.com/266/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/domasmituzas.wordpress.com/266/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&amp;blog=190075&amp;post=266&amp;subd=domasmituzas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2008/11/09/on-ssd-io/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
	</channel>
</rss>
