<?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>Shawn Wilsher &#187; SQLite</title>
	<atom:link href="http://shawnwilsher.com/archives/tag/sqlite/feed" rel="self" type="application/rss+xml" />
	<link>http://shawnwilsher.com</link>
	<description></description>
	<lastBuildDate>Sun, 04 Dec 2011 10:37:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Changes to how Places stores data incoming</title>
		<link>http://shawnwilsher.com/archives/473</link>
		<comments>http://shawnwilsher.com/archives/473#comments</comments>
		<pubDate>Thu, 16 Dec 2010 01:05:16 +0000</pubDate>
		<dc:creator>Shawn Wilsher</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[asynchronous]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[location bar]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[places]]></category>
		<category><![CDATA[SQLite]]></category>

		<guid isPermaLink="false">http://shawnwilsher.com/?p=473</guid>
		<description><![CDATA[Sometime soon after the beta 8 code freeze, the Places team will be merging the Places branch into mozilla-central. There are a lot of changes we’ve been working on, the most important of which is some major re-architecting how we store data. The Benefits The work on the Places branch brings us a number of [...]]]></description>
			<content:encoded><![CDATA[<p>Sometime soon <del>after the beta 8 code freeze</del>, the Places team will be merging the Places branch into mozilla-central.  There are a lot of changes we’ve been working on, the most important of which is some major re-architecting how we store data.</p>
<h3>The Benefits</h3>
<p>The work on the Places branch brings us a number of benefits.  In general, we&#8217;ve parallelized work, and made it substantially less likely that we&#8217;ll block on the GUI thread.  Some of the important fixes we have landed are:</p>
<ul>
<li>Faster Location Bar
<div>The location bar is faster because other database work no longer blocks us from searching, and the queries are much simpler.</div>
</li>
<li>Asynchronous Bookmark Notifications
<div>Indicating if the current page is bookmarked in the location bar (with the star) is now an asynchronous operation that does not block the page load.</div>
</li>
<li>Faster Bookmarks &#038; History Management/Searches
<div>Simpler queries and other improvements should make this all work faster.</div>
</li>
<li>Faster Link Coloring
<div>Link coloring is now executed on a separate database connection so it cannot block other database work.</div>
</li>
<li>Expiration Work
<div>Less work at startup, less work at shutdown, and less work when we run expiration.</div>
</li>
<li>Less Data Stored
<div>Embedded pages are now tracked only in memory and never hit the disk.</li>
<li>Better Battery Management
<div>Much less work during idle time, which will improve our power consumption behaviors.</div>
</li>
<li>Fixes <a href="https://bugzilla.mozilla.org/buglist.cgi?quicksearch=fixed-in-places%20blocking2.0%3A%2B">29 blockers</a> and <a href="https://bugzilla.mozilla.org/buglist.cgi?quicksearch=fixed-in-places%20blocking2.0%3A---">18 other issues</a></li>
</ul>
<h3>A bit of History</h3>
<p>Way back in the days leading up to Firefox 3.5, we moved from storing all of our history and location data in disk tables to in-memory tables that we’d flush out to disk every two minutes off of the GUI thread.  The benefit of this was two-fold:</p>
<ol>
<li>No longer performing the vast majority of our disk writes on the GUI thread</li>
<li>No longer performing the vast majority of our fsyncs/Flushes on the GUI thread</li>
</ol>
<p>More details about how we came up with this solution can be found in a <a href="http://shawnwilsher.com/archives/168">series</a> <a href="http://shawnwilsher.com/archives/169">of</a> <a href="http://shawnwilsher.com/archives/170">blog</a> <a href="http://shawnwilsher.com/archives/172">posts</a>.</p>
<h3>The Problem</h3>
<p>This solution has worked out pretty well for us for a while, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=563538">but recently, especially on OS X, it has not been</a>.  The short story is that our architecture did not scale well due to <a href="http://en.wikipedia.org/wiki/Lock_%28computer_science%29#Granularity">lock contention</a> between our GUI thread and our background I/O thread.  While the common case access case may be fine, the failure case (when we hit lock contention) is pretty terrible.  The problem is so terrible that <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=563538#c55">I once described it</a> like this:</p>
<blockquote><p>the failure case makes us fall on our faces, skid about 100 feet, and then fall off a cliff without a parachute.</p></blockquote>
<p>Ultimately, the only way we can avoid this situation is to not do any database work on separate threads with the same database connection.  It was not an issue in the past because we just did not do enough work on the I/O thread, but as we have added to the workload of that thread, we increase the likelihood of it holding the lock, which means there is a higher probability that the GUI thread will not be able to instantly acquire the lock and do whatever it needs to do.  This essentially leaves us with two options:</p>
<ol>
<li>Move the rest of our database work off of the GUI thread.</h3>
<li>Move database work from the I/O thread back to the GUI thread.</h3>
</ol>
<h3>The Solution</h3>
<p>The second choice is not actually a viable option.  Disk I/O completes in a non-deterministic amount of time, which is why we have been moving it from the GUI thread to an I/O thread since Firefox 3.5.  The first choice is not entirely viable either due to schedule constraints either (we have tons of API calls that are not used heavily but still synchronous).  A hybrid solution exists, however.  We can reduce the amount of work we do on the I/O thread by using additional I/O threads.  Additionally, we can move the remaining synchronous operations during browsing to an I/O thread.  In the end, Places ends up with one read/write thread, and multiple read-only threads.</p>
<p>This wasn’t really an option back in the Firefox 3.5 days because in SQLite readers and writers blocked each other.  However, the SQLite developers recently devised a new journaling method called <a href="http://www.sqlite.org/wal.html">WAL</a> that lets readers not block writers, and writers not block readers.  When the Places branch merges into mozilla-central, we will end up with three read-only I/O threads and our original read-write I/O thread.  The three read-only threads are used for location bar searches, visited checks (is a given hyperlink visited), and some bookmark operations.  Each I/O thread has its own connection to the database, allowing operations to happen in parallel (SQLite is only threadsafe because it serializes all access on each connection object, which is why we had the lock contention in the first place).</p>
<h3>Performance Test Issues</h3>
<p>One of the things that made this work especially difficult is seemingly random changes in performance numbers.  We often had regressions suddenly appear (according to talos) on changesets that would have zero impact on performance, and then backing out the change would cause an additional regression.  Other times, when we would merge mozilla-central into Places, we would suddenly get new regressions when comparing to mozilla-central.  This could be indicative of a bad interaction with our code and the changes on mozilla-central, however after looking at the changes on mozilla-central that landed with the merge, that appeared to be highly unlikely.</p>
<p>I&#8217;m also quite certain that some of our performance tests do not actually test/measure what we actually want to test/measure.  I&#8217;ll leave that discussion to a future blog posts, however.</p>
]]></content:encoded>
			<wfw:commentRss>http://shawnwilsher.com/archives/473/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Better SQLite Memory Reporting Coming to a Nightly Near You</title>
		<link>http://shawnwilsher.com/archives/405</link>
		<comments>http://shawnwilsher.com/archives/405#comments</comments>
		<pubDate>Thu, 22 Jul 2010 18:12:37 +0000</pubDate>
		<dc:creator>Shawn Wilsher</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[about:memory]]></category>
		<category><![CDATA[SQLite]]></category>

		<guid isPermaLink="false">http://shawnwilsher.com/?p=405</guid>
		<description><![CDATA[I just landed bug 575667 into mozilla-central which adds more detailed reporting about the memory used by SQLite. Some people have been complaining to me that SQLite is using an awful lot of memory lately. My hunch was that most of this was the page cache (so you don&#8217;t have to hit the disk for [...]]]></description>
			<content:encoded><![CDATA[<p>I just landed <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=575667" title="split about:memory reporting into more detailed sections">bug 575667</a> into mozilla-central which adds more detailed reporting about the memory used by SQLite.  Some people have been complaining to me that SQLite is using an awful lot of memory lately.  My hunch was that most of this was the page cache (so you don&#8217;t have to hit the disk for every read), but with the next nightly those people can see for themselves.  Now, instead of just indicating how much memory is being used, about:memory states how much is being used by the page cache and how much other memory is being used by SQLite.  We are also planning to split this up more, but are waiting for the SQLite team to provide some APIs first.</p>
]]></content:encoded>
			<wfw:commentRss>http://shawnwilsher.com/archives/405/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crash!  Boom!  Bang!  But I just wanted to delete some history&#8230;</title>
		<link>http://shawnwilsher.com/archives/338</link>
		<comments>http://shawnwilsher.com/archives/338#comments</comments>
		<pubDate>Fri, 30 Oct 2009 22:31:00 +0000</pubDate>
		<dc:creator>Shawn Wilsher</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[crash]]></category>
		<category><![CDATA[CrashKill]]></category>
		<category><![CDATA[mozStorage]]></category>
		<category><![CDATA[overflow]]></category>
		<category><![CDATA[SQLite]]></category>

		<guid isPermaLink="false">http://shawnwilsher.com/?p=338</guid>
		<description><![CDATA[If you&#8217;ve been experiencing crashes when trying to delete a large set of history, I have great news for you! We&#8217;ve identified the issue, and a fix will be coming to you shortly! Background This fix wouldn&#8217;t be in our hands if it was for the recent CrashKill effort here at Mozilla. Sam Sidler gave [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;ve been experiencing crashes when trying to delete a large set of history, I have great news for you!  We&#8217;ve identified the issue, and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=523405">a fix will be coming to you</a> shortly!<br />
<span id="more-338"></span></p>
<h3>Background</h3>
<p>This fix wouldn&#8217;t be in our hands if it was for the recent <a href="https://wiki.mozilla.org/CrashKill">CrashKill</a> effort here at Mozilla.  Sam Sidler gave me <a href="https://wiki.mozilla.org/CrashKill/Signatures/Storage">a link to a list of crashes</a> that were reported to us during a 24 hour period in SQLite and mozStorage code.  I immediately started adding links to crash reports and filing bugs to some of the more frequent crashes so we could start tracking these issues.  I also informed the SQLite team about this page in case they found the data useful, and they sure did.  They started to look into <a href="http://crash-stats.mozilla.com/report/list?product=Firefox&#038;query_search=signature&#038;query_type=exact&#038;query=sqlite3VdbeExec&#038;date=&#038;range_value=1&#038;range_unit=weeks&#038;do_query=1&#038;signature=sqlite3VdbeExec">this particular crash</a>.  It turns out that there are <a href="http://crash-stats.mozilla.com/report/list?product=Firefox&#038;query_search=signature&#038;query_type=exact&#038;query=sqlite3Step&#038;date=&#038;range_value=1&#038;range_unit=weeks&#038;do_query=1&#038;signature=sqlite3Step">two</a> <a href="http://crash-stats.mozilla.com/report/list?product=Firefox&#038;query_search=signature&#038;query_type=exact&#038;query=sqlite3DbMallocRaw&#038;date=&#038;range_value=1&#038;range_unit=weeks&#038;do_query=1&#038;signature=sqlite3DbMallocRaw">other</a> signatures that are actually the same crash, but show up differently due to compiler optimizations causing differences in the generated program.</p>
<h3>Fix Details</h3>
<p>SQLite has a virtual machine that processes queries.  The virtual machine is register-based, which is different from the usual stack-based virtual machines you might encounter with Java.  This particular crash would surface when a SQL query used an <tt>IN</tt> operator with more than ~32 thousand entries on its right-hand side and the <tt>EXISTS</tt> expression.  If either of these conditions occurred on their own, SQLite could handle this just fine.  The <tt>IN</tt> operator stores each entry in a register, and when processing the <tt>EXISTS</tt> expression, SQLite would store the number of the register in which an expression was written into into a 16-bit integer on an <tt>Expr</tt> object.  However, once you try to write a number greater than 32,767 to a 16-bit integer, you get <a href="http://en.wikipedia.org/wiki/Arithmetic_overflow">overflow</a> and you will likely end up with a negative number.  This negative number was then used to index into an array, which is all sorts of bad (and led to the crash).</p>
<p>The workaround fix is to just use a 32-bit integer for now.  This means this issue will not happen unless you have over 2,147,483,647 entries on the right-hand side of the <tt>IN</tt> operator.  You&#8217;d hit other limitations of SQLite before that would ever happen, so overflow is no longer a concern.  The SQLite team is going to do a more complicated fix which stores the value separately from <tt>Expr</tt> object it was previously stored in.  The <tt>Expr</tt> object is used a lot, so they don&#8217;t want a long-term solution that increases memory usage.</p>
<p>You might be surprised that such a small and trivial seeming bug got through.  This type of bug is more common than you might think, and overflow bugs have even <a href="http://en.wikipedia.org/wiki/Ariane_5_Flight_501">caused the destruction of an Ariane 5 rocket</a>.  It&#8217;s an unfortunate reality of software that sometimes these edge cases get missed, but we must always try to remain vigilant.</p>
<p><em>Special thanks to the SQLite team for investigating this fix, and providing information for this blog post.</em><br />
<small><a href="http://rypple.com/sdwilsh/sqlite-op-if-crash-writeup">Provide anonymous feedback on this post with Rypple.</a></small></p>
]]></content:encoded>
			<wfw:commentRss>http://shawnwilsher.com/archives/338/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asynchronous Location Bar has Landed</title>
		<link>http://shawnwilsher.com/archives/279</link>
		<comments>http://shawnwilsher.com/archives/279#comments</comments>
		<pubDate>Tue, 11 Aug 2009 20:33:07 +0000</pubDate>
		<dc:creator>Shawn Wilsher</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[asynchronous]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[location bar]]></category>
		<category><![CDATA[mozStorage]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[places]]></category>
		<category><![CDATA[SQLite]]></category>

		<guid isPermaLink="false">http://shawnwilsher.com/?p=279</guid>
		<description><![CDATA[About two weeks ago the asynchronous location bar work landed in mozilla-central without much issue. It&#8217;s also in the Firefox 3.6 alpha we just recently released. This has the potential to impact all of our users, but those on slower hard drives will notice this the most. Your location bar searches may not complete any [...]]]></description>
			<content:encoded><![CDATA[<p>About two weeks ago the asynchronous location bar work <a href="http://hg.mozilla.org/mozilla-central/pushloghtml?changeset=8cff4bd2121a">landed in mozilla-central</a> without much issue.  It&#8217;s also in the <a href="https://developer.mozilla.org/devnews/index.php/2009/08/07/firefox-3-6-alpha-1-now-available-for-download/">Firefox 3.6 alpha</a> we just recently released.  This has the potential to impact all of our users, but those on slower hard drives will notice this the most.  Your location bar searches may not complete any faster than before, but they certainly won&#8217;t be hanging your browser and locking up the UI.</p>
<h3>Background</h3>
<p>We&#8217;ve been getting reports for some time about the location bar hanging the application for some users when they are typing in it.  This wasn&#8217;t a problem that was reproducible on every machine, and even on machines that saw it, it wasn&#8217;t always 100% reproducible.  Clearly, this behavior is not desirable, so we set out to fix it.</p>
<p>I had a theory to the cause almost a year ago and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=455555">filed a bug</a> that I was hoping we could work on and fix for Firefox 3.5.  We knew that reading data off a disk can be slow (and certainly would complete in a non-deterministic amount of time).  Since SQLite uses blocking read calls (no more code can execute until the data is read from disk), this could certainly be the cause of the slowdown our users were seeing.  Some simple profiling showed that this was largely the cause of the hanging.  Work began on the project, but it was clear that enough issues were cropping up that we were not going to be able to safely take this change for Firefox 3.5, and resources were diverted elsewhere.</p>
<h3>Process and Solution</h3>
<p>This section is a bit technical, so feel free to skip it.  The short answer is &#8220;do not block the main thread while reading from the hard drive.&#8221;</p>
<p>In order to not block the main thread while reading from disk we either need to make SQLite use non-blocking read system calls, or call into SQLite off of the main thread.  Changing the SQLite code isn&#8217;t something we want to do, so that solution was out of the question.  Luckily, we had solved a similar problem with writes and fsyncs earlier in the Firefox 3.5 development with the <a href="http://shawnwilsher.com/archives/162">asynchronous Storage API</a>.</p>
<p>The first implementation that we tried essentially did the same thing that the old code did.  We would execute a query, but this time asynchronously, and then process the results and see if they match.  There were two issues with this approach, however.  The first issue was that we were filtering every history and bookmark entry on the main thread for a given search.  That could be a lot of work we end up doing, and with the additional overhead of moving data across threads, the common case would see no win.  The second issue was that once we selected a result in the location bar, and a search was not yet complete, there would be a hang as the main thread processed a bunch of events that Storage had posted to it containing results.</p>
<p>At this point, we realized we needed to do the filtering on a thread other than the main thread.  After some thought, we was figured that the easiest way to do that would be to use a SQL function that we define in the WHERE clause of our autocomplete queries.  This way, all the filtering is done on a background thread, and the code that runs on the main thread only deals with results we will actually use.  This solution exposed some things in the Storage backend like lock contention and a few other subtle issues, but nothing major came up.</p>
<p>For more details on how the location bar search results are generated, see <a href="http://stackoverflow.com/questions/540725/how-does-firefoxs-awesome-bar-match-strings/1208458#1208458">my explanation here</a>.</p>
<p>If you weren&#8217;t having a problem before, chances are you won&#8217;t notice any difference at all.</p>
]]></content:encoded>
			<wfw:commentRss>http://shawnwilsher.com/archives/279/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Query Performance Monitoring</title>
		<link>http://shawnwilsher.com/archives/251</link>
		<comments>http://shawnwilsher.com/archives/251#comments</comments>
		<pubDate>Tue, 10 Mar 2009 20:22:49 +0000</pubDate>
		<dc:creator>Shawn Wilsher</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[mozStorage]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[places]]></category>
		<category><![CDATA[SQLite]]></category>
		<category><![CDATA[warning]]></category>

		<guid isPermaLink="false">http://shawnwilsher.com/?p=251</guid>
		<description><![CDATA[Over in bug 481261 I am adding support in mozStorage to warn when a query doesn&#8217;t use an index to sort. This is a debug only warning that uses NS_WARNING to tell you what query is at fault, and the total number of sort operations that were used on it. Luckily, SQLite exposes a handy [...]]]></description>
			<content:encoded><![CDATA[<p>Over in <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=481261" title="Expose when queries are being inefficient in debug builds">bug 481261</a> I am adding support in mozStorage to warn when a query doesn&#8217;t use an index to sort.  This is a debug only warning that uses <a href="https://developer.mozilla.org/En/NS_WARNING"><tt>NS_WARNING</tt></a> to tell you what query is at fault, and the total number of sort operations that were used on it.</p>
<p>Luckily, SQLite exposes a <a href="http://www.sqlite.org/c3ref/stmt_status.html">handy function</a> that tells us this information.  In general, you want to use a index in your <tt>ORDER BY</tt> clause so SQLite can use it to generate the order the results a given back.  If you do not use an index, SQLite has to first get all the results in memory, then it sorts them, and then it starts to return results.  If you expect a lot of results, this can get very expensive.</p>
<p>There were suggestions on the newsgroups to also add an API so debuggers such as <a href="http://getfirebug.com/releases/">ChromeBug</a> or <a href="https://addons.mozilla.org/en-US/firefox/addon/5817">SQLite Manager</a> could listen for these types of errors.  I&#8217;ll be filing follow-up bugs for some of these suggestions later on.</p>
]]></content:encoded>
			<wfw:commentRss>http://shawnwilsher.com/archives/251/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Determining a Ts Regression</title>
		<link>http://shawnwilsher.com/archives/175</link>
		<comments>http://shawnwilsher.com/archives/175#comments</comments>
		<pubDate>Thu, 18 Sep 2008 16:14:44 +0000</pubDate>
		<dc:creator>Shawn Wilsher</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[SQLite]]></category>

		<guid isPermaLink="false">http://shawnwilsher.com/?p=175</guid>
		<description><![CDATA[For those who have been following the tree status of mozilla-central as of late, you probably noticed that I tried to land SQLite once again, but it was backed out due to a nasty Ts regression on Linux. When I had run this through the try server, it had shown no regression so I had [...]]]></description>
			<content:encoded><![CDATA[<p>For those who have been following the tree status of mozilla-central as of late, you probably noticed that I tried to land SQLite once again, but it was backed out due to a nasty Ts regression on Linux.  When I had run this through the try server, it had shown no regression so I had thought it was safe (just like the past three or four other times I&#8217;ve tried to land this).  Luckily, <a href="http://blog.johnath.com/">Johnathan</a>, who was the sheriff when I landed, found a linux box that we could use that reproduced this problem.  With a lot of his help, we got <a href="https://wiki.mozilla.org/StandaloneTalos">standalone talos</a> running just Ts, to get <code>strace</code> logs during startup.</p>
<p>Once I had those logs, I needed some way to parse the files for data so I can use it in a reasonable way.  I wrote a <a href="http://files.shawnwilsher.com/2008/9/18/function_times.txt">python script</a> to parse the strace logs, and then insert them into a <a href="http://files.shawnwilsher.com/2008/9/18/data.sqlite">sqlite database file <small>(26.8 MB)</small></a> so I could run some <a href="http://files.shawnwilsher.com/2008/9/18/generate_data.txt">interesting queries</a> on the data.</p>
<p>With that data, I decided to generate some graphs to easily see what was going on.  All of these graphs compose the data from the six runs of Firefox that talos ran &#8211; the data is all summed up.  All the graphs have larger versions available if you click on them.</p>
<p>I figured that the most useful graph for investigating this Ts regression would be execution time:<br />
<a href="http://files.shawnwilsher.com/2008/9/18/tet.png"><img src="http://files.shawnwilsher.com/2008/9/18/tet.png" height="289"  width="423" alt="Total execution time"/></a></p>
<p>Note that that is six runs of Firefox, which is why it is as long as it is.  Next, I looked at the average execution time for each function call:<br />
<a href="http://files.shawnwilsher.com/2008/9/18/aet.png"><img src="http://files.shawnwilsher.com/2008/9/18/aet.png" height="289"  width="423" alt="Average execution time"/></a></p>
<p>And finally, I looked at the number of calls of each of these functions:<br />
<a href="http://files.shawnwilsher.com/2008/9/18/calls.png"><img src="http://files.shawnwilsher.com/2008/9/18/calls.png" height="289"  width="423" alt="Number of calls"/></a></p>
<p>We are clearly seeing an increase in the number of fsync calls, and we know that on Linux those can be more painful than they are on other operating systems.  My next step is to see if we also see this increase on OS X.  If we do, I&#8217;m going to assume we see it on windows as well, and get backtraces of every single fsync call to determine why we&#8217;ve double the number of calls by upgrading.</p>
<p>I&#8217;ll make a new post as more data comes in.</p>
]]></content:encoded>
			<wfw:commentRss>http://shawnwilsher.com/archives/175/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

