tag:blogger.com,1999:blog-15265322040161255862024-02-20T20:25:03.950+01:00jonas blogStuff related to mysql...and maybe other thingsJonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.comBlogger51125tag:blogger.com,1999:blog-1526532204016125586.post-12708356537072076242013-12-19T09:44:00.001+01:002013-12-19T09:44:23.795+01:00pfs_lock.h and "atomics"<a href="https://sites.google.com/site/jonasdownloadstuff/pfs_lock.tgz?attredirects=0&d=1">quilt series</a> that tries to address the inefficiencies described in <a href="http://kristiannielsen.livejournal.com/17598.html">http://kristiannielsen.livejournal.com/17598.html</a><br />
<br />
<br />Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com1tag:blogger.com,1999:blog-1526532204016125586.post-72787443569999947232012-10-07T12:44:00.003+02:002012-10-07T12:45:40.307+02:00small men with big titlesi used the phrasing "small men with big titles" yesterday when having a cup of coffe with friends. i don't know if it's a established phrase, mr. google doesn't seem to know about it.<br />
<br />Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com1tag:blogger.com,1999:blog-1526532204016125586.post-50786565927483739662012-06-26T08:18:00.000+02:002012-06-26T17:10:53.401+02:00Foreign keys for MySQL Clusterfeatures supported are:<br />
<ul>
<li>on-update/delete restrict</li>
<li>on-update/delete noaction</li>
<li>on-update/delete setnull</li>
<li>on-update/delete cascade</li>
<li>online add/drop foreign key</li>
</ul>
The foreign keys are implemented inside data-nodes, and will hence work regardless of which type of client you use. SQL, memcache, Cluster/J, ndbapi, {insert your favourite connector}.<br />
<br />
somewhat interesting differences between ndb and innodb are: <br />
<ol>
<li>i haven't implemented the Innodb "extension" has that allows parent reference to be non-unique. It seems ok i think...<a href="http://forge.mysql.com/worklog/task.php?id=148">wl#148</a> describes it as a feature not to have this extension</li>
<li>For innodb "noaction" is identical as "restrict".<br />For ndb, noaction means deferred check. I.e the constraint is checked before commit.<br />(i think it should be at end of statement...but ndb currently doesnt have any statement concept)</li>
<li>Ndb does not "natively" support update of primary keys (i.e not inside data nodes), an update on a primary key from SQL is emulated by an delete+insert.<br />The implication of this, is that on-update-actions (such as cascade/setnull) doesn't work if parent reference is using primary key.<br />Fixing this...means first adding native support for update of primary keys, and then adding the FK support for it...but I think(hope) that this is a limitation that is acceptable.</li>
<li>Ndb today supports checking unique keys in a deferred fashion.<br />This feature is used by slave applier to avoid false conflicts with replication.<br />Foreign keys supports the same.</li>
<li>Ndb implementation does not (today) support the <a href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_foreign_key_checks">foreign_key_checks</a> variable.</li>
<li>Ndb supports online adding and dropping of foreign keys (i.e no table copy, clients can read/write while FK is added/dropped).<br />Hopefully this fact can decrease the need for the foreign_key_checks variable. (although we should consider how to process a mysqldump-file without hazzle)</li>
</ol>
<hr />
implementation note 1: the implementation is based on ndb's internal trigger mechanism. the same mechanism that is used to maintain unique indexes. one implication of this is that cost (both in terms of single threaded latency and increase in load) should be roughly comparable to that of unique indexes. note that (to my knowledge) no benchmarks has been performed. stay tuned for that.<br />
<hr />
implementation note 2: a somewhat interesting implementation discovery is that mysql actually features a capable foreign key parser. my original plan was to "copy" the innodb hand-crafted parser. but this wasn't needed...the server parsed and created nice structures...only didn't expose them to the storage engine. so instead of adding a hand-crafted parser, i modified the server to expose them, and the code in our handler was much simpler...happy with that!<br />
<hr />
implementation note 3: a (deliberate) artefact of current implementation is that when using on {update/delete} {set null/cascade} the set-null or cascade that is performed on child table, will be put into binlog (if turned on). that means that the foreign key action will be performed on slave side too, even if foreign keys are not present (or enabled) on that site.<br />
<hr />
a general reflection conceived when adding this is that ndb internals now has added quite a lot of infrastructure that really makes adding complex features like this a lot easier.
<br />
<hr />
Other resources on the subject is:
<br />
<ul>
<li><a href="https://blogs.oracle.com/MySQL/entry/mysql_cluster_7_3_labs">the announcement</a> which includes a download link
</li>
<li><a href="http://www.clusterdb.com/mysql-cluster/foreign-keys-in-mysql-cluster/">andrews cluster blog</a> which includes SQL demo
</li>
</ul>
<hr />
and finally the diffstat for the original quilt patchset looks like<br />
<pre>[]:jonas@eel:~/src/ndb-fk> diffstat patches/*
102 files changed, 14813 insertions(+), 842 deletions(-) </pre>
<pre></pre>
<hr />
<b>STANDARD DISCLAIMER</b><br />
<ul>
<li>
the exact format of this feature might (will) change before reaching a (GA) release</li>
<li>it's currently unknown when(if?) it will reach a (GA) release near you</li>
</ul>Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com0tag:blogger.com,1999:blog-1526532204016125586.post-47312015355138045922012-02-15T20:54:00.000+01:002012-02-15T20:59:27.899+01:00international man of mysteryi can't help to think of austin powers when seeing <a href="http://www.clusterdb.com/mysql-cluster/1-billion-queries-per-minute-mysql-cluster-7-2-is-ga/?utm_source=rss&utm_medium=rss&utm_campaign=1-billion-queries-per-minute-mysql-cluster-7-2-is-ga">one <em>billion</em> queries per minute</a>Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com0tag:blogger.com,1999:blog-1526532204016125586.post-13973310457611501272011-10-13T10:01:00.001+02:002011-10-28T08:42:27.513+02:00Brewing in MySQL Cluster 7.2.xAdmittedly MySQL Cluster have some way to go before monitoring becomes best in class. But, we are progressing!<br />
In 7.1 we introduced NDBINFO, which is an infrastructure that enables presenting information from within the cluster in SQL format.<br />
And here are a 4 new tables that are currently brewing
<br />
<hr />
<div align="center">
<b>ndbinfo.transactions</b> and <b>ndbinfo.operations</b></div>
<pre>mysql> select COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT from information_schema.columns where TABLE_NAME = 'ndb$transactions';
+----------------+-----------+---------------------------------+
| COLUMN_NAME | DATA_TYPE | COLUMN_COMMENT |
+----------------+-----------+---------------------------------+
| node_id | int | node id |
| block_instance | int | TC instance no |
| objid | int | Object id of transaction object |
| apiref | int | API reference |
| transid | varchar | Transaction id |
| state | int | Transaction state |
| flags | int | Transaction flags |
| c_ops | int | No of operations in transaction |
| outstanding | int | Currently outstanding request |
| timer | int | Timer (seconds) |
+----------------+-----------+---------------------------------+
mysql> select COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT from information_schema.columns where TABLE_NAME = 'ndb$operations';
+----------------+-----------+-------------------------------+
| COLUMN_NAME | DATA_TYPE | COLUMN_COMMENT |
+----------------+-----------+-------------------------------+
| node_id | int | node id |
| block_instance | int | LQH instance no |
| objid | int | Object id of operation object |
| tcref | int | TC reference |
| apiref | int | API reference |
| transid | varchar | Transaction id |
| tableid | int | Table id |
| fragmentid | int | Fragment id |
| op | int | Operation type |
| state | int | Operation state |
| flags | int | Operation flags |
+----------------+-----------+-------------------------------+
</pre>
<ul>
<li>these two tables show currently ongoing transactions resp. currently ongoing operations.</li>
<li><i>ndbinfo.transactions</i> roughly corresponds to <a href="http://dev.mysql.com/doc/innodb-plugin/1.0/en/innodb-information-schema-innodb_trx.html"><i>information_schema.INNODB_TRX</i></a>
</li>
<li><i>ndbinfo.operations</i> roughly corresponds to <a href="http://dev.mysql.com/doc/innodb-plugin/1.0/en/innodb-information-schema-innodb_locks.html"><i>information_schema.INNODB_LOCKS</i></a>
</li>
<li>the information provided is collected without any kind of locks</li>
<li>the information provided is collected by iterating internal data-structures. Hence output does not necessarily represent a state that has existed (i.e not a snapshot)</li>
</ul>
<br />
<br />
one missing piece of this puzzle is how to map a ndb transaction id, to a mysql connection id.<br />
when (if?) this information is available, one could e.g join <i>information_schema.processlist</i> with <i>ndbinfo.operations</i> too see locks are being held by a certain connection.
(suggestion on how to gather/expose this is welcome).
<br />
<hr />
<div align="center">
<b>ndbinfo.threadblocks</b> and <b>ndbinfo.threadstat</b></div>
<pre>mysql> select COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT from information_schema.columns where TABLE_NAME = 'ndb$threadblocks';
+----------------+-----------+----------------+
| COLUMN_NAME | DATA_TYPE | COLUMN_COMMENT |
+----------------+-----------+----------------+
| node_id | int | node id |
| thr_no | int | thread number |
| block_number | int | block number |
| block_instance | int | block instance |
+----------------+-----------+----------------+
mysql> select COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT from information_schema.columns where TABLE_NAME = 'ndb$threadstat';
+----------------+-----------+------------------------------------------+
| COLUMN_NAME | DATA_TYPE | COLUMN_COMMENT |
+----------------+-----------+------------------------------------------+
| node_id | int | node id |
| thr_no | int | thread number |
| thr_nm | varchar | thread name |
| c_loop | bigint | No of loops in main loop |
| c_exec | bigint | No of signals executed |
| c_wait | bigint | No of times waited for more input |
| c_l_sent_prioa | bigint | No of prio A signals sent to own node |
| c_l_sent_priob | bigint | No of prio B signals sent to own node |
| c_r_sent_prioa | bigint | No of prio A signals sent to remote node |
| c_r_sent_priob | bigint | No of prio B signals sent to remote node |
| os_tid | bigint | OS thread id |
| os_now | bigint | OS gettimeofday (millis) |
| os_ru_utime | bigint | OS user CPU time (micros) |
| os_ru_stime | bigint | OS system CPU time (micros) |
| os_ru_minflt | bigint | OS page reclaims (soft page faults |
| os_ru_majflt | bigint | OS page faults (hard page faults) |
| os_ru_nvcsw | bigint | OS voluntary context switches |
| os_ru_nivcsw | bigint | OS involuntary context switches |
+----------------+-----------+------------------------------------------+
</pre>
these two tables shows currently which blocks run in which thread resp. statistics per thread.<br />
<ul>
<li>the statistics are from data-node started, so to see trend, one need to snapshot table,
and compare with snapshot.
</li>
<li>the fields starting with <code>os_ru_</code> are gather with <i>getrusage(RUSAGE_THREAD)</i> (or equivalent)
</li>
</ul>
lots of numbers! and I'm honestly not quite sure how to interpret them<br />
a few simple rules <b>might</b> be that (for a non idle cluster)
<br />
<ul>
<li>user time should be high and system should be low
</li>
<li>involuntary context switches should be low
</li>
<li>page faults should be low
</li>
</ul>
<hr />
<b>STANDARD DISCLAIMER</b><br />
<ul>
<li>the exact format of the tables might (will) change before reaching a release
<li>it's currently unknown when(if?) they will reach a release near you
</ul>Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com2tag:blogger.com,1999:blog-1526532204016125586.post-48079578827980629462011-10-10T09:12:00.000+02:002011-10-10T10:12:15.203+02:00new features in MySQL Cluster 7.2.1<ul>
<li>AQL (aka push down join)<br />Further improvements and refinements compared to 7.2.0 from April</li>
<li>Index statistics<br />A long over due feature, that aims to reduce(minimize) need of manual query tuning that previously has been essential for efficient SQL usage with ndb.</li>
<li>memcache access support</li>
<li>Active-Active replication enhancements</li>
<li>Various internal limits has been increased<br />- Max row-size now 14k (previously 8k)<br />- Max no of columns in table now 512 (previously 128)</li>
<li>Rebase to mysql-5.5 (7.2.1 is based on mysql-5.5.15)</li>
<li>Improved support for geographically separated cluster<br />(note: single cluster...i.e not using asynchronous replication)</li>
</ul>
<h3>
Brief introduction to AQL (aka join pushdown)</h3>
Basic concept is to evaluate joins down in data-nodes instead(in addition to) of in mysqld.<br />
Ndb will examine query plan created by mysqld, and construct a serialized definition of this join, ship it down to data-nodes.<br />
This join will in the data-nodes be evaluated in parallel (if appropriate), and the result set will be sent back to mysqld using a streaming interface.<br />
Performance gain (latency reduction) is <b>normally</b> in the range of 20x for a 3-way join.
<br />
<h3>
Brief introduction to Index statistics</h3>
The index statistics works a lot like <i>Innodb persistent statistics</i>.<br />
When you execute <b>analyze table T</b>, data nodes will scan the indexes of <b>T</b> and produce a histogram of each index.<br />
This histogram is stored in tables in ndb (<code>mysql.ndb_index_stat_head</code> and <code>mysql.ndb_index_stat_sample</code>).
The histogram can then be used by any mysqld connected to this cluster.
The histogram will not be generated until a new <b>analyze table T</b> is requested.
<br />
<h3>
Brief introduction to Active-Active enhancements</h3>
MySQL Cluster has supported active-active asynchronous replication with conflict detection and conflict resolution since 6.3.<br />
In prior version, the schema had to be modified, adding a timestamp column to each table and application has to be modified to maintain this timestamp column.<br />
In this new version, no schema modification is required and no application modification is needed.<br />
In previous version, conflict detection/resolution was performed on row-by-row basis.<br />
In this new version, transaction boundaries are respected.<br />
E.g in a row <b>R</b> is determined to be in conflict, not only this row-change will be resolved,<br />
but entire transaction <b>T</b> that modified the row will be resolved and all transactions depending on the <b>T</b> transitively.<br />
Longer descriptions can be found <a href="http://messagepassing.blogspot.com/2011/10/eventual-consistency-with-transactions.html">here</a> and <a href="http://messagepassing.blogspot.com/2011/10/eventual-consistency-with-mysql.html">here</a>
<br />
<hr />
Sorry for omitting hex dumps and/or unformatted numbers
<br />
<hr />
Mandatory late update: the join described <a href="http://www.clusterdb.com/mysql-cluster/70x-faster-joins-with-aql-in-mysql-cluster-7-2-dmr/">here</a> has now gained an extra 2x (but this improvement did not make 7.2.1)
<br />
<br />
Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com8tag:blogger.com,1999:blog-1526532204016125586.post-65627188716684121062011-05-10T08:03:00.008+02:002011-05-10T08:18:19.483+02:00Star schema benchmark on MySQL Cluster 7.2I decided to try the star schema benchmark on our latest 7.2 release (<a href="http://dev.mysql.com/downloads/cluster/7.2.html">link</a>). Star schema benchmark is an analytics oriented benchmark, and MySQL Cluster has not been developed to address this kind of workload. Nevertheless I couldn't resist trying...<br /><h3>Setup</h3><ul><li>2 data-nodes each running on a 4-way Xeon E7420 @ 2.13GHx (total 16 cores) 256Gb RAM</li><li>The mysqld was co-located with one of the data-nodes</li><li>I used memory tables<br /></li></ul><h3>Results</h3><br />Queries: <a href="http://www.percona.com/docs/wiki/benchmark:ssb:start">link</a><br /><table border="1" cellpadding="1" cellspacing="1"><tbody><tr><th>Query</th><th>sf10</th><th>sf100</th></tr><tr><td>Q1.1</td><td>5</td><td>62</td></tr><tr><td>Q1.2</td><td>0.4</td><td>4.6</td></tr><tr><td>Q1.3</td><td>0.1</td><td>1.1</td></tr><tr><td>Q2.1</td><td>9</td><td>95</td></tr><tr><td>Q2.2</td><td>48</td><td>495</td></tr><tr><td>Q2.3</td><td>51</td><td>517</td></tr><tr><td>Q3.1</td><td>47</td><td>481</td></tr><tr><td>Q3.2</td><td>47</td><td>476</td></tr><tr><td>Q3.3</td><td>2</td><td>20</td></tr><tr><td>Q3.4</td><td>2</td><td>19</td></tr><tr><td>Q4.1</td><td>57</td><td>572</td></tr><tr><td>Q4.2</td><td>57</td><td>574</td></tr><tr><td>Q4.3</td><td>12</td><td>120</td></tr></tbody></table><br />(time in sec, less time is better)<br /><h3>Facts</h3><ul><li>I have done no analysis to why some queries are faster than others</li><li>This type of queries is currently not in focus of our efforts to improve join performance (nor has it been so far)</li><li>for lineorder table I specified <em>max_rows=500000000</em><br /></li><li><em>ndb_join_pushdown=on</em> (default in 7.2)<br /></li></ul><h3>Thoughts and guesses</h3><ul><li>sf100 is almost exactly 10x slower than sf10. So I think a reasonable guess is that sf1000 is 10x slower than sf100<br /></li><li>Star schema benchmark is an easy benchmark (compared to e.g TPC-H)</li><li>I think results looks quite good</li><li>My guess is that scaling out (e.g to 4 nodes) would scale well (although I didn't try) (e.g scale out by running 2 ndbmtd on each machine)</li><li>Running high write load in parallel doesnt increase query times signficantly (as tested in <a href="http://assets.en.oreilly.com/1/event/36/MySQL%20Cluster%20and%20Pushdown-joins%20_In%20Pursuit%20of%20the%20Holy%20Grail_%20Presentation.pdf">presentation</a> page 45-46) which is quite cool (although I didn't try this time)<br /></li></ul><h3>Load procedure for sf100<br /></h3><ul><li>I manually split the 61Gb file (lineorder) into 10 6Gb files (using <em>split(1)</em>)</li><li>Then I loaded these 10 in parallel with 10 clients using <em>load data infile</em></li><li>I disabled indexes while loading using <em>ndb_restore --disable-indexes</em> (from an backup made on empty db containing just schema definition)</li><li>I then rebuilt the indexes using <em>ndb_restore --rebuild-indexes</em> using <em>BuildIndexThreads=15</em> in config.ini</li></ul>(for sf10 i did nothing special)<br /><h3>Load time for sf100</h3><ul><li>4h including rebuilding of indexes</li></ul><h3>References</h3><ul><li><a href="http://www.mysqlperformanceblog.com/2010/01/07/star-schema-bechmark-infobright-infinidb-and-luciddb/">Blog where percona tries SSB</a></li></ul><hr /><h3>Last minute update</h3><ul><li>OleJohn reports that Q2.2 and Q2.3 should be 10x faster if forcing a different join order (e.g by using <em>straight_join</em> or <em>force index</em>). But this I haven't tried</li></ul>Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com5tag:blogger.com,1999:blog-1526532204016125586.post-4112337128163676792010-11-04T11:51:00.004+01:002010-11-05T07:47:56.551+01:00distributed pushed down joins - webinar and new preview availableas part of the <a href="http://www.mysql.com/news-and-events/web-seminars/display-583.html">webinar</a> tonight we made a new preview release <a href="ftp://ftp.mysql.com:/pub/mysql/download/cluster_telco/mysql-5.1.51-ndb-7.1.9-spj-preview/mysql-spj-preview-7.1.9-src.tar.gz">src</a> and <a href="ftp://ftp.mysql.com:/pub/mysql/download/cluster_telco/mysql-5.1.51-ndb-7.1.9-spj-preview/mysql-spj-preview-7.1.9-linux-x86_64-glibc23.tar.gz">binary</a> (linux x86-64 glibc23).<br /><br />this includes pushing of <a href="http://dev.mysql.com/doc/refman/5.1/en/explain-output.html">ref</a> that was not supported in last preview release as well as latest and greatest new optimizations.<br /><br />note that this is still not production ready code.<br />but...we welcome any feedback on it!<br /><br />---<br /><br />Nov 5: And feedback can be sent to spj-feedback@sun.comJonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com1tag:blogger.com,1999:blog-1526532204016125586.post-11640258001126368892010-08-25T11:46:00.008+02:002010-08-26T00:47:24.352+02:00distributed pushed down joins - progress and attitudewe're now at a stage so we can test/benchmark scan/scan queries, i.e push most queries. there are still know bugs and things that we can't push.<br /><br />to see how we performs, we tested a very old query/dataset, that a customer tried in the 4.1 days. the result at that time was a disaster, and they at that time decided to use something else.<br /><br />it's a 11-way join with mainly REF accesses (i.e not many lookups)<br /><br />i tested it on same hardware/configuration as for my UC <a href="http://assets.en.oreilly.com/1/event/36/MySQL%20Cluster%20and%20Pushdown-joins%20_In%20Pursuit%20of%20the%20Holy%20Grail_%20Presentation.pdf">presentation</a>.<br />without join pushdown the average query time is 3.6s.<br />with join pushdown it's ~500ms, i.e ~<span style="font-weight: bold;">7x</span> improvement.<br /><br />the nights of kni are deeply disappointed, and that's an attitude i like :-)<br /><br />FYI: we also optimized TPCW::getBestSeller some more and are now at <span style="font-weight: bold;">42x</span> on that hardware/configuration.<br /><br />---<br /><br />stay tuned<br /><br />---<br /><br />micro update: Found a bug when using ndbmtd...fixing that gave 200ms (i.e 18x)...also did some more optimizations and now record is 120ms (i.e 29x)Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com1tag:blogger.com,1999:blog-1526532204016125586.post-79590183914011918292010-05-20T13:54:00.003+02:002010-05-20T15:22:15.216+02:00distributed pushed down joins - node-failure handling donenode-failure handling was as expected lots of small changes to various pieces of the code.<br />some non compatible protocol changes performed (nice not to have any existing GA release to care about :)<br /><br />also when doing this, I re-implemented entire "abort of join"-handling.<br />it should now also be capable of handling aborting more complex joins<br />(but node-failure is still an special case)<br /><br />this means that "testSpj -n NF_Join" now passes!!<br /><br />---<br /><br />this is an important step towards a releasable version.<br /><br />note: this has only been implemented in the branch which also contains extension for scan.vs.scan joins. I.e not in the branch released as preview.<br /><br />and, OleJohn integrated support for filters on child-joins with mysqld.<br /><br />---<br /><br />And as always please provide <a href="http://johanandersson.blogspot.com/2010/04/mysql-cluster-spj-preview-feedback_27.html">feedback</a> on preview release that we made!Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com1tag:blogger.com,1999:blog-1526532204016125586.post-67943742302836384692010-05-12T13:34:00.003+02:002010-05-12T13:46:07.927+02:00distributed pushed down joins - more testinghave now written and pushed ndbapi testing of our push-down join implementation (~2k LOC)<br /><br />the following classes/programs was added<br /><ul><li>HugoQueryBuilder (class)<br />Construct a pseudo-random query<br />inputs: a list of tables and a options specifying which features should be used in query</li><li>HugoQueries (class)<br />Run an arbitrary query.<br />Note: Does only verify individual rows, not relations/result-set. For verifying result-sets we use random query generator</li><li>testSpj (program)<br />Ndbapi test-program using above classes to runs various tests for our cluster specific automatic testing framework</li><li>hugoJoin (program)<br />Stand-alone test-program that takes list of tables/options as command-line arguments<br />and using above classes constructs/runs random queries</li></ul>Quite happy with this, as it's very much needed to get good coverage of the implementation,<br />especially error cases (e.g node-failure) which is hard to test from/with SQL.<br /><br />---<br /><br />And please provide <a href="http://johanandersson.blogspot.com/2010/04/mysql-cluster-spj-preview-feedback_27.html">feedback</a> on preview release that we made!Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com0tag:blogger.com,1999:blog-1526532204016125586.post-80163638719434080272010-05-07T14:02:00.003+02:002010-05-07T14:27:16.521+02:00distributed pushed down joins - more featuresupdate on latest accomplishments:<br /><br /><ol><li>added support for filters (compare engine_condition_pushdown) on non-root operations, this in 2 flavors:<br /><ul><li>- constant/immediate filters that is provided after NdbQuery has been defined, these may not contains filter conditions referencing other NdbQueryOperation's,</li><li>- parameterized/linked filters, these type of programs must be provided when building the NdbQuery-object.</li></ul><br />The constant filters should be "easy" to integrate with ndbapi/mysqld, but the parameterized/linked is harder as we need to add new features to NdbScanFilter.<br /><br />Once this is integrated into mysqld, it will provide better performance for already pushable queries, see page 43 in my UC presentation (ref: filter).<br /><br /></li><li>added support for NdbQueryOpertation's referencing non-direct parent NdbQueryOperation's. This should also be quite easy to integrate into ndbapi/mysqld. This will mean that new types of queries will become pushable.<br /><br /></li><li>support for "to-many" joins is made so complete that it will get until we get an ndbapi for more elaborate testing. This will mean that lots of new queries will become pushable.<br /></li></ol><br />Note: all the additions has only been made inside ndb(mt)d so far, nothing new has (yet) been added to ndbapi/mysqld.<br /><br />---<br /><br />And please provide <a href="http://johanandersson.blogspot.com/2010/04/mysql-cluster-spj-preview-feedback_27.html">feedback</a> on preview release that we made!Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com0tag:blogger.com,1999:blog-1526532204016125586.post-86150296152837741052010-04-24T21:38:00.003+02:002010-04-24T21:48:30.212+02:00distributed push down joins - first "to many" joinjust managed to run the first "to-many" join inside the data-nodes.<br />the query correspondce to<br /><br />SELECT t1.*, t2.*<br />FROM T1 t1<br />LEFT OUTER JOIN T1 as t2 on t2.pk >= t1.b<br /><br />- the code inside the data-nodes is general...but incomplete (data-node later crashed)<br />- there is no ndbapi and no SQL,the program testing is a hard-coded c-program sending messages using the ndb-cluster wire-protocol<br />- the result-set is not managed (the c-program just hangs)<br />- hopefully converting this into usable code will be faster than last years <a href="http://jonasoreland.blogspot.com/2009/04/distributed-pushed-down-join.html">post</a> as ndbapi is now quite complete, and this is "only" an add-on.<br /><br />for a bit more background look at my <a href="http://assets.en.oreilly.com/1/event/36/MySQL%20Cluster%20and%20Pushdown-joins%20_In%20Pursuit%20of%20the%20Holy%20Grail_%20Presentation.pdf">presentation</a> from MySQL Conference 2010.<br /><br />hard-core details:<br /><pre><br />r.bn: 245 "DBTC", r.proc: 2, gsn: 32 "SCAN_TABREQ" prio: 1<br />s.bn: 32768 "API", s.proc: 4, s.sigId: 0 length: 11 trace: 1 #sec: 2 fragInf: 0<br /> apiConnectPtr: H'00000027 requestInfo: H'08400a01:<br /> Parallellism: 1 Batch: 64 LockMode: 0 Keyinfo: 0 Holdlock: 0 RangeScan: 0 Desc<br />ending: 0 TupScan: 0<br /> ReadCommitted: 1 DistributionKeyFlag: 0 NoDisk: 1 spj: 1 attrLen: 0, keyLen: 0 <br />tableId: 7, tableSchemaVer: 1<br /> transId(1, 2): (H'00000000, H'00000400) storedProcId: H'0000ffff<br /> batch_byte_size: 32768, first_batch_size: 64<br /> H'00000027 H'00000000 H'08400a01 H'00000007 H'00000001 H'0000ffff H'00000000<br /> H'00000400 H'00000026 H'00008000 H'00000040<br />SECTION 0 type=generic size=1<br /> H'00000014<br />SECTION 1 type=generic size=33<br /> H'000f0002 H'00050002 H'00000010 H'00000007 H'00000001 H'00010001 H'00090003<br /> H'00000003 H'00000008 H'00000001 H'00000001 H'00000003 H'00010001 H'00000002<br /> H'00060000 H'00080002 H'00000009 H'10000020 H'00000001 H'00000012 H'00000002<br /> H'fff00002 H'ffe90000 H'000a0003 H'00000009 H'ffff0100 H'10000024 H'00000001<br /> H'00000012 H'00000003 H'fff00002 H'ffe90000 H'fffb0000<br />---- Received - Signal ----------------<br />r.bn: 32768 "API", r.proc: 4, r.sigId: -1 gsn: 5 "TRANSID_AI" prio: 1<br />s.bn: 249 "DBTUP", s.proc: 2, s.sigId: 166035 length: 3 trace: 1 #sec: 1 fragInf<br />: 0<br /> H'10000020 H'00000000 H'00000400<br />SECTION 0 type=linear size=7<br /> H'fff30004 H'00000003 H'00000001 H'00000002 H'ffe90008 H'00000014 H'00000000<br />---- Received - Signal ----------------<br />r.bn: 32768 "API", r.proc: 4, r.sigId: -1 gsn: 5 "TRANSID_AI" prio: 1<br />s.bn: 249 "DBTUP", s.proc: 2, s.sigId: 166092 length: 3 trace: 1 #sec: 1 fragInf<br />: 0<br /> H'10000020 H'00000000 H'00000400<br />SECTION 0 type=linear size=7<br /> H'fff30004 H'00000003 H'00000002 H'00000003 H'ffe90008 H'00000014 H'00000001<br />---- Received - Signal ----------------<br />r.bn: 32768 "API", r.proc: 4, r.sigId: -1 gsn: 5 "TRANSID_AI" prio: 1<br />s.bn: 249 "DBTUP", s.proc: 2, s.sigId: 166202 length: 3 trace: 1 #sec: 1 fragInf<br />: 0<br /> H'10000024 H'00000000 H'00000400<br />SECTION 0 type=linear size=9<br /> H'fff30004 H'00000003 H'00000001 H'00000002 H'ffe90008 H'00000014 H'00000000<br /> H'fffb0004 H'00000000<br />---- Received - Signal ----------------<br />r.bn: 32768 "API", r.proc: 4, r.sigId: -1 gsn: 5 "TRANSID_AI" prio: 1<br />s.bn: 249 "DBTUP", s.proc: 2, s.sigId: 166203 length: 3 trace: 1 #sec: 1 fragInf<br />: 0<br /> H'10000024 H'00000000 H'00000400<br />SECTION 0 type=linear size=9<br /> H'fff30004 H'00000003 H'00000002 H'00000003 H'ffe90008 H'00000014 H'00000001<br /> H'fffb0004 H'00000000<br />---- Received - Signal ----------------<br />r.bn: 32768 "API", r.proc: 4, r.sigId: -1 gsn: 5 "TRANSID_AI" prio: 1<br />s.bn: 249 "DBTUP", s.proc: 2, s.sigId: 166227 length: 3 trace: 1 #sec: 1 fragInf<br />: 0<br /> H'10000024 H'00000000 H'00000400<br />SECTION 0 type=linear size=9<br /> H'fff30004 H'00000003 H'00000001 H'00000002 H'ffe90008 H'00000014 H'00010002<br /> H'fffb0004 H'00000001<br />---- Received - Signal ----------------<br />r.bn: 32768 "API", r.proc: 4, r.sigId: -1 gsn: 5 "TRANSID_AI" prio: 1<br />s.bn: 249 "DBTUP", s.proc: 2, s.sigId: 166234 length: 3 trace: 1 #sec: 1 fragInf<br />: 0<br /> H'10000024 H'00000000 H'00000400<br />SECTION 0 type=linear size=9<br /> H'fff30004 H'00000003 H'00000002 H'00000003 H'ffe90008 H'00000014 H'00010003<br /> H'fffb0004 H'00000001<br /></pre>Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com1tag:blogger.com,1999:blog-1526532204016125586.post-6501965368304381712010-04-15T03:13:00.006+02:002010-04-15T03:55:40.039+02:00uploaded cluster pushdown join presentation...and preview-releasepresentation is <a href="http://assets.en.oreilly.com/1/event/36/MySQL%20Cluster%20and%20Pushdown-joins%20_In%20Pursuit%20of%20the%20Holy%20Grail_%20Presentation.pdf">here</a><br />src tarball, that do contain bugs if node-failure occurs, is <a href="ftp://ftp.mysql.com/pub/mysql/download/cluster_telco/mysql-5.1.44-ndb-7.1.3-spj-preview/mysql-cluster-gpl-7.1.3-spj-preview.tar.gz">here</a><br /><br />thanks for attending for those of you that did<br />feedback on preview is welcome, e.g here<br /><br />maybe we'll do a binary version...if so i'll make a new postJonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com3tag:blogger.com,1999:blog-1526532204016125586.post-5427296763278223582010-03-25T18:16:00.010+01:002010-03-25T20:07:13.488+01:00fast IO and ndbi read Marks <a href="http://www.facebook.com/note.php?note_id=378043115932&_fb_noscript=1">blog entry</a> about fast IO for PBXT, InnoDB (1.0.6 plugin) and MyISAM with some interest.<br /><br />then there was the <a href="http://mysqlha.blogspot.com/2010/03/durable-not-durable-and-really-not.html">durable, not durable and really not durable blog</a> in which Mark and <a href="http://www.blogger.com/profile/03203602815866231586">LinuxJed</a><a href="http://www.blogger.com/profile/03203602815866231586">i</a> discussed cluster, and Mark wondered how much IO one could get from 1 data-node with ndb.<br /><br />so I decided to try.<br />the setup is similar.<br />ndb cluster using disk-tables, with a tablespace stored in /dev/shm.<br /><br />Data occupied 7.3G, which is slightly less than (some of) the others, this is as we don't support having columns with indexes stored on disk. I.e any column that has an index will be stored only in memory instead.<br /><br />ndb does however not support "handler" statements, so I used oltp-point-select-all-cols instead.<br /><pre><br />sysbench --test=oltp --mysql-host=foobar --mysql-user=root \<br />--mysql-password=pw \<br />--mysql-db=test \<br />--oltp-table-size=40000000 \<br />--max-time=60 --max-requests=0 \<br />--mysql-table-engine=<b>ndb</b> \<br />--db-ps-mode=disable --mysql-engine-trx=yes \<br />--oltp-read-only --oltp-skip-trx --oltp-test-mode=simple \<br />--<b>oltp-point-select-all-cols</b> \<br />--oltp-dist-type=uniform \<br />--oltp-range-size=1000 \<br />--num-threads=1 --seed-rng=1 run<br /></pre><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNP1mK3CY2F9XvDLATHZisJGWE5G6MhQjgtSz3nIVffGq0XIAeD8nv8W47Ph1SS9Mkx0dsoxgzkL0YpRXcYi5tGWlDEzbiSaneiR9mCjIPIE_qc4kv4z57k8hax0LeaWg7uLV0rsVi4eo/s1600/Screenshot-1.png"><img style="cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNP1mK3CY2F9XvDLATHZisJGWE5G6MhQjgtSz3nIVffGq0XIAeD8nv8W47Ph1SS9Mkx0dsoxgzkL0YpRXcYi5tGWlDEzbiSaneiR9mCjIPIE_qc4kv4z57k8hax0LeaWg7uLV0rsVi4eo/s320/Screenshot-1.png" alt="" id="BLOGGER_PHOTO_ID_5452626082413157842" border="0" /></a><br /><br />results are not super great...<br />so i did a ndbapi program (which is roughly the equivalent of handler-statements)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjK6uwGLnVGZKiYemRlQsl3RyhVt4nnmY-ThZ6yyiZheq0Y7aDp_JxFPFAzjkafshKR3XYLJF5qCd1-yjbO4yiSMGwcwMNWLA5KO4zaUiMe5Yk1Ff9dG4nPN4Aw8AdAQX27uqzeNLWoJfk/s1600/Screenshot-2.png"><img style="cursor: pointer; width: 320px; height: 122px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjK6uwGLnVGZKiYemRlQsl3RyhVt4nnmY-ThZ6yyiZheq0Y7aDp_JxFPFAzjkafshKR3XYLJF5qCd1-yjbO4yiSMGwcwMNWLA5KO4zaUiMe5Yk1Ff9dG4nPN4Aw8AdAQX27uqzeNLWoJfk/s320/Screenshot-2.png" alt="" id="BLOGGER_PHOTO_ID_5452626699989375682" border="0" /></a><br /><br />these number look a bit better. but datanode (ndbmtd) was almost idle when running this...<br /><br />so i made another experiment. Instead of retrieving 1 row at a time (set@r = rand() % 40000000; select * from sbtest where id = @r) i changed to retrive 16 rows at a time (set @r1 = rand(); set @r2 = rand(); select * from sbtest where id in (@r1...@r16).<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhONI678Ydbqcnryd38zHQ6Yn-REOAzfM1l3bFPR82YGiCwIDhj0xSJgEDYNu68YBWS1lucyHBHSvtHrz0mFgiDIOO8U6qrQS4XAm_HVvoVx-yBF1JxWoTm9sFqpCBXgSvHvdu9-UQwesg/s1600/Screenshot-3.png"><img style="cursor: pointer; width: 320px; height: 125px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhONI678Ydbqcnryd38zHQ6Yn-REOAzfM1l3bFPR82YGiCwIDhj0xSJgEDYNu68YBWS1lucyHBHSvtHrz0mFgiDIOO8U6qrQS4XAm_HVvoVx-yBF1JxWoTm9sFqpCBXgSvHvdu9-UQwesg/s320/Screenshot-3.png" alt="" id="BLOGGER_PHOTO_ID_5452627940052651938" border="0" /></a><br /><br />i believe these results are relevant given that mark's aim was to test fast IO,<br />and i think that this rewrite wont affect other SE as much as it does with ndb.<br />and those numbers was quite ok.<br /><br />as an extra bonus, i also tried with using our memory tables (alter table sbtest storage memory), also with ndbapi and 16 rows at a time.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibHF9iDKBx2o-BQU3RDuCaAuKMB_U-onfc5Sck9jW_yhmvnqg_zdtdbxR71BR2YzoRTNl3vIVU9R6bK1M2ZP9g8Tih6AYHAK4sMjx5fi76n1rAbOIFdiWuMgGjDAiOJCq7wExvfIPnLJQ/s1600/Screenshot-4.png"><img style="cursor: pointer; width: 320px; height: 126px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibHF9iDKBx2o-BQU3RDuCaAuKMB_U-onfc5Sck9jW_yhmvnqg_zdtdbxR71BR2YzoRTNl3vIVU9R6bK1M2ZP9g8Tih6AYHAK4sMjx5fi76n1rAbOIFdiWuMgGjDAiOJCq7wExvfIPnLJQ/s320/Screenshot-4.png" alt="" id="BLOGGER_PHOTO_ID_5452629405692030626" border="0" /></a><br /><br />these tests was executed on a 16-core machine Intel(R) Xeon(R) CPU E7420@2.13GHz<br />and in my config.ini I had<br /><pre><br />DiskPageBufferMemory = 1GB<br />DiskIOThreadPool=8<br />FileSystemPath=/dev/shm<br /></pre><br /><br />note: I first create tables in myisam, then converted them to ndb disk-tables by issuing "alter table sbtest storage disk tablespace TS engine = ndb" and all tests was using ndb-cluster-connection-pool=4<br /><br />all results:<br /><pre><br />SQL 2756 4998 7133 9130 10720 12222 13305 14190 14626 15287 15547 15955 16143 16334 16507 16757<br />ndbapi 4177 7581 10319 13162 15245 17064 18874 20652 20850 24131 25976 24910 29832 30666 32625 34841<br />b=16 1520 11374 35454 53396 55601 63248 71819 78468 103324 97330 97572 111099 125564 126790 133873 141588<br />mm b=16 73004 128296 172207 207361 246907 270783 293753 312435 327006 345085 346924 374837 360747 372192 376887 394862<br /></pre>Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com3tag:blogger.com,1999:blog-1526532204016125586.post-70505324084844764022010-03-15T15:07:00.007+01:002010-03-15T16:06:36.384+01:00Dbspj update, teaser for UC5 months more...<br /><br />reminder, what is Dbspj:<br />- It's a new feature for MySQL Cluster<br />- It gives the possibility to push-down SQL joins, i.e to evaluate the joins inside the data nodes.<br /><br />latest and greatest:<br />- last 5 months spent on SQL integration<br />- big effort having it used only for cases that we actually support<br />- lots of testing using <a href="http://forge.mysql.com/wiki/Random_Query_Generator">RQG</a><br />- a significant part of bugs found last couple weeks, has <b>not</b> been related to spj, but in fact "ordinary" optimizer bugs<br />- we think that it's quite usable now.<br /><br />and the numbers:<br />- my plan was to present TPC-W as "realistic" numbers<br />- now they look more like fantastic numbers<br />- if i could, i would add a "25x" to my title<br />- visit my UC presentation (<a href="http://en.oreilly.com/mysql2010/public/schedule/detail/12528">link</a>) to learn more<br /><br />and fyi: we also plan to provide a feature preview source (or binary) release for <a href="http://conferences.oreilly.com/mysql"><br /><img src="http://assets.en.oreilly.com/1/event/36/mysql2010_speaking_badge_210x60.gif" alt="O'Reilly MySQL Conference & Expo 2010" title="O'Reilly MySQL Conference & Expo 2010" height="60" width="210" border="0" /><br /></a><br /><br />(i will of course also disclose all information provided in UC presentation after the event)Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com1tag:blogger.com,1999:blog-1526532204016125586.post-50249230761808756172009-10-22T16:13:00.004+02:002009-10-22T16:22:49.951+02:00Dbspj + mysqld, first trials<pre><br />mysql> create table T1 (a int, b int, primary key(a)) engine = ndb;<br />mysql> select x.a,x.b,z.a,z.b from T1 x, T1 y, T1 z where x.b=y.a and y.b=z.a;<br />+----+------+----+------+<br />| a | b | a | b |<br />+----+------+----+------+<br />| 31 | 47 | 63 | 31 |<br />| 63 | 31 | 47 | 63 |<br />| 47 | 63 | 31 | 47 |<br />| 5 | 47 | 63 | 31 |<br />+----+------+----+------+<br />4 rows in set (0.01 sec)<br /></pre><br /><br />- entire query is executed with one request to data nodes<br />- code is only a hack (that bluntly examines mysqld's internal structures).<br />- list of limitations is so long that i can't write it here due to bandwidth restrictions<br />But still super cool!<br /><br />Quote from Jan, that implemented experiment: "You <em>can</em> write queries that return correct result"Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com4tag:blogger.com,1999:blog-1526532204016125586.post-42665992529273173202009-10-14T10:41:00.007+02:002009-10-14T15:59:56.896+02:00Dbspj preliminary numbersSo some 5 month later...<br />- Dbspj has an ndbapi<br />- Dbspj works enough for simple benchmarks!<br /><br />Reminder, what is Dbspj:<br />- It's a new feature for Ndb<br />- It gives the possibility to push-down linked operations (e.g in SQL terminology: joins)<br />- It currently only supports left-outer-joins, and only some kinds of joins<br />- It is currently *not* in anyway integrated with mysqld (for accelerating SQL access)<br /><br />Anyway so here is the benchmark setup<br />2 computers<br />- ndbapi running on one<br />- 2 datanodes running on other<br /><br />On images below:<br />- red is new code, blue is corresponding "current" code<br />- Y-axis is run-time, so lower is better<br />- X-axis is "depth", i.e no of tables joined<br /><br />Note: this is debug-compiled, so the actually absolute numbers are<br />not that interesting...rather the comparison...<br /><hr><br /><br />Query 1:<br />depth 1: select * from T t1, T t2 where T1.pk = constant and T2.pk = T1.pk<br />depth 2: select * from T t1, T t2, T t3 where T1.pk = constant and T2.pk = T1.pk and T3.pk = T2.pk<br />etc...<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdARcACSoGSMIFXiUY3HEJqN0fE_SO4eui77gtxqhyphenhyphenvc3W6ANCm5jUVDd82_PFN66peQooGovlVdP594YetYwkFtdz70DxODa6UkqP8JiYI6npKzP7nWUZWTcYVOaX4gFU9xYJPj5sraY/s1600-h/query1.png"><img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdARcACSoGSMIFXiUY3HEJqN0fE_SO4eui77gtxqhyphenhyphenvc3W6ANCm5jUVDd82_PFN66peQooGovlVdP594YetYwkFtdz70DxODa6UkqP8JiYI6npKzP7nWUZWTcYVOaX4gFU9xYJPj5sraY/s320/query1.png" alt="" id="BLOGGER_PHOTO_ID_5392376937492451714" border="0" /></a><br /><hr><br /><br />Query 2:<br />depth 1: select * from T t1, T t2 where T2.pk = T1.pk<br />depth 2: select * from T t1, T t2, T t3 where T2.pk = T1.pk and T3.pk = T2.pk<br />etc...<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDpjtr5bY7JljDQSLcgvuz-g7wnHaVjb9LRXjjGY6Bua62KzLrFTj4qg-CYhtTrLZgmu4lTzghw-KZ-jI-D0tnJWdqbS8nhelXTMf3H7W8Oj2P6Bxh8strGKBNv9TyS2RgienNH0SbDr8/s1600-h/query2.png"><img style="cursor:pointer; cursor:hand;width: 320px; height: 236px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDpjtr5bY7JljDQSLcgvuz-g7wnHaVjb9LRXjjGY6Bua62KzLrFTj4qg-CYhtTrLZgmu4lTzghw-KZ-jI-D0tnJWdqbS8nhelXTMf3H7W8Oj2P6Bxh8strGKBNv9TyS2RgienNH0SbDr8/s320/query2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5392377550377994706" /></a>Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com3tag:blogger.com,1999:blog-1526532204016125586.post-66657363379700395282009-05-06T12:05:00.004+02:002009-05-06T12:15:31.941+02:00ArenaAllocator complete (Dbspj)and i created a new DataBuffer2, which has pool-type as template argument.<br />it was "impossible" to alter DataBuffer to do this...it was simply to hard-wired to ArrayPool. too bad.<br /><br />---<br /><br />so now everything in Dbspj can/will be using the ArenaAllocator...<br />rationale for ArenaAllocator is really not to have a "quick" release (the code still releases each object individually...to reset magic values) but that it's a kind of variable length allocation strategy that provide great locality of data...<br /><br />---<br /><br />also pushed infrastructure for "result-set correlation".<br />Dbspj will (at least for now) when joining only return rows once so in the case of a 2-way join, a SQL result set will return the rows from the first table one time *for each* match in second table.<br />Dbspj will not...(but ha_ndbcluster will have to do this...when presenting things for mysqld) and since it will not, there has to be a way to correlate rows from the 2 tables.<br />this we call "result-set correlation".Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com2tag:blogger.com,1999:blog-1526532204016125586.post-20263007220672651302009-05-02T11:00:00.003+02:002009-05-02T11:16:38.778+02:00memory allocation in ndb(mt)dinside the data nodes a number of different techniques for allocating memory is used.<br />there are 2 main variants<br />- page allocations<br />- object allocations (e.i slab allocator)<br /><br />and for the object allocations there are a number of different variants<br />- RWPool, "ordinary" slab, only objects of same type on 1 page, free-list per page and object<br />- WOPool, allocations which are short-lived, no free-list just ref-count<br />- ArrayPool, fixed array of packed object<br /><br />and I'm just now introducing a ArenaAllocator (which will be used for spj)<br /><br />---<br /><br />- RWPool, WOPool and ArenaAllocator/Pool are "new", meaning that they are build from start with support for more dynamic memory handling in mind.<br />- ArrayPool is very fixed, and exists both in the structured form, and various hard-coded variants.<br /><br />---<br /><br />one thing in common for all the "new" allocators is that they use magic numbers per object, so that every time a pointer (once per signal) that validity of the object is checked, and a trap is generated on a invalid memory access.<br /><br />another thing in common is that they are all used by 1 thread at a time, and only pages are allocated/freed to a global free-list.<br /><br />---<br /><br />- to support variable length data, linked list of fixed size objects are used (DataBuffer)<br />- for input data (from e.g sockets) a special DataBuffer with additional thread-safety code is used so that data can be passed between threads wo/ copying.<br /><br />---<br /><br />but there is no malloc/free new/delete :-)Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com0tag:blogger.com,1999:blog-1526532204016125586.post-75392450946140981402009-05-01T12:38:00.003+02:002009-05-01T14:34:56.475+02:00distributed pushed-down join - part IInow also support table/index scan as root node, i.e tree = [ scan ] ? [ lookup ] *<br />still with the limitations:<br />- a child may only be dependent on immediate parent<br />- still only left outer join.<br /><br />i also completed the parameterized scan-filter inside tup but does not yet support this in spj or ndbapi.<br /><br />currently working on<br />- the parameterized scan-filer in spj (and a tiny bit in the ndbapi).<br />- result set correlation<br /><br />currently thinking on<br />- arena based allocator for spj-requests, (compare mysqld mem-root concept)<br /><br />discussed with frazer what spj "really is", concluded that it probably is some kind of "data-flow-engine"...should probably find some hip acronym/term for it...<br /><br />note:<br />current mental capacity is limiting spj to only one scan in a tree.<br />this limitation can of course be lifted...but not now, or my brain will fry.<br /><br />---<br /><br />wonder how i should make people giving me votes on planetmysql??Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com1tag:blogger.com,1999:blog-1526532204016125586.post-54308107407570382542009-04-23T01:55:00.005+02:002009-04-23T02:39:55.101+02:00distributed pushed-down joinjust managed to run the first join inside the data-nodes.<br />the query correspondce to<br /><br />SELECT t1.*, t2.*<br />FROM T1 t1<br />LEFT OUTER JOIN T1 t2 on t1.pk = t2.pk<br />WHERE t1.pk = avalue<br /><br />- the code inside the data-nodes is general...but incomplete (e.g leaks memory, doesnt handle error correctly...)<br />- there is no ndbapi and no SQL,the program testing is a hard-coded c-program sending messages using the ndb-cluster wire-protocol<br />- the result-set is not managed (the c-program just hangs)<br /><br />Summary:<br />- there is *many* things left to do, when this will actually hit a release is very uncertain (or if it ever will...)<br />- this is the coolest thing i implemented in a long long time<br /><br />Details:<br />- the code is written so that the query and the parameters are sent separately so that we in the future could have the queries permanently stored in the data nodes.<br />- the query is:<br />SELECT t1.?1, t2.?2<br />FROM T1 t1<br />LEFT OUTER JOIN T1 t2 on t1.pk = t2.pk<br />WHERE t1.pk = ?3<br />i.e both values and projection is parameterized<br /><br />- the serialized form of this request is 44bytes query and 32 byte parameters<br />- i could do a N-way (key-lookup) join with aribitrary tables and join-conditions using the code inside the data-node<br />- code *only* supports left-outer-joins and only lookups<br />- next step is doing scan+lookup<br /><br />Hard-core details:<br /><pre><br />sh> cat mysql-cluster/ndb_1.out.log<br />DBSPJ: ::build()<br />DBSPJ: - loop 0 pos: 1<br />DBSPJ: getOpInfo(1)<br />DBSPJ: createNode - seize -> ptrI: 57344<br />DBSPJ: lookup_build: len=5<br />DBSPJ: attrCnt: 1 -> len: 0<br />DBSPJ: param len: 4<br />DBSPJ: attrCnt: 1<br />DBSPJ: - loop 1 pos: 6<br />DBSPJ: getOpInfo(1)<br />DBSPJ: createNode - seize -> ptrI: 57376<br />DBSPJ: lookup_build: len=5<br />DBSPJ: attrCnt: 1 -> len: 0<br />DBSPJ: added 57376 as child of 57344<br />DBSPJ: param len: 4<br />DBSPJ: attrCnt: 1<br />LQHKEYREQ to 6f70002<br />ClientPtr = H'0000e000 hashValue = H'87c3aa01 tcBlockRef = H'01080002<br />transId1 = H'00000000 transId2 = H'00000301 savePointId = H'00000000<br />Op: 0 Lock: 0 Flags: Simple Dirty NoDisk ScanInfo/noFiredTriggers: H'0<br />AttrLen: 0 (0 in this) KeyLen: 0 TableId: 4 SchemaVer: 1<br />FragId: 0 ReplicaNo: 0 LastReplica: 0 NextNodeId: 0<br />ApiRef: H'80000003 ApiOpRef: H'00000008<br />AttrInfo:<br />KEYINFO: ptr.i = 7(0xac3ee800) ptr.sz = 1(1)<br />H'0x00000000<br />ATTRINFO: ptr.i = 8(0xac3ee900) ptr.sz = 5(5)<br />H'0x00000000 H'0xffee0000 H'0x01080002 H'0x0000e000 H'0xfff00005<br />DBSPJ: execTRANSID_AI<br />execTRANSID_AI: ptr.i = 3(0xac3ee400) ptr.sz = 2(2)<br />H'0x00000004 H'0x00000000<br />LQHKEYREQ to 6f70002<br />ClientPtr = H'0000e020 hashValue = H'87c3aa01 tcBlockRef = H'01080002<br />transId1 = H'00000000 transId2 = H'00000301 savePointId = H'00000000<br />Op: 0 Lock: 0 Flags: Simple Dirty ScanInfo/noFiredTriggers: H'0<br />AttrLen: 0 (0 in this) KeyLen: 0 TableId: 4 SchemaVer: 1<br />FragId: 0 ReplicaNo: 0 LastReplica: 0 NextNodeId: 0<br />ApiRef: H'80000003 ApiOpRef: H'00000008<br />AttrInfo:<br />KEYINFO: ptr.i = 8(0xac3ee900) ptr.sz = 1(1)<br />H'0x00000000<br />ATTRINFO: ptr.i = 9(0xac3eea00) ptr.sz = 1(1)<br />H'0xfff00005<br /><br />sh> cat api-signal-log.txt<br />---- Send ----- Signal ----------------<br />r.bn: 245 "DBTC", r.proc: 2, gsn: 12 "TCKEYREQ" prio: 1<br />s.bn: 32768 "API", s.proc: 3, s.sigId: 0 length: 8 trace: 1 #sec: 2 fragInf: 0<br />apiConnectPtr: H'00000020, apiOperationPtr: H'00000008<br />Operation: Read, Flags: Dirty Start Execute NoDisk IgnoreError Simple spj<br />keyLen: 0, attrLen: 0, AI in this: 0, tableId: 4, tableSchemaVer: 1, API Ver: 5<br />transId(1, 2): (H'00000000, H'00000300)<br />-- Variable Data --<br />SECTION 0 type=generic size=1<br />H'00000000<br />SECTION 1 type=generic size=19<br />H'000b0002 H'00050001 H'00000000 H'00000004 H'00000001 H'00000001 H'00050001<br />H'00000001 H'00000004 H'00000001 H'00000001 H'00040001 H'00000000 H'00000008<br />H'fff00005 H'00040001 H'00000000 H'00000008 H'fff00005<br />---- Received - Signal ----------------<br />r.bn: 2047 "API", r.proc: 3, r.sigId: -1 gsn: 10 "TCKEYCONF" prio: 1<br />s.bn: 245 "DBTC", s.proc: 2, s.sigId: 241503 length: 9 trace: 1 #sec: 0 fragInf:<br />0<br />H'80000005 H'00000000 H'00000000 H'00000001 H'00000000 H'00000300 H'00000008<br />H'80000002 H'00000000<br />---- Received - Signal ----------------<br />r.bn: 2047 "API", r.proc: 3, r.sigId: -1 gsn: 5 "TRANSID_AI" prio: 1<br />s.bn: 249 "DBTUP", s.proc: 2, s.sigId: 241503 length: 22 trace: 1 #sec: 0 fragIn<br />f: 0<br />H'80000007 H'00000008 H'00000000 H'00000301 H'fff30004 H'0000001f H'00000000<br />H'00000005 H'ef76733c H'deece672 H'ffffffff H'80000007 H'00000008 H'00000000<br />H'00000301 H'fff30004 H'0000001f H'00000000 H'00000005 H'ef76733c H'deece672<br />H'ffffffff<br /></pre>Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com3tag:blogger.com,1999:blog-1526532204016125586.post-68078360238157341522009-04-12T21:55:00.007+02:002009-04-12T22:58:25.507+02:00mutex micro benchmarkwhen working on mutex contention for ndbapi (mysql-cluster)<br />i decided to do some micro benchmarks.<br /><br />The benchmark is threads that locks/unlocks an private mutex<br />and increment a counter.<br /><br />The tests are:<br /><ul><li>mutex_aligned, pthread_mutex, lock/unlock, each mutex in separate cache-line</li><li>mutex_non_aligned, same as above but mutexes are packed together hence sharing cache-lines</li><li>spin_aligned, home-made spinlock (only x86), each spinlock in separate cache-line, the spinlock is an atomic operation for lock, and a full-barrier+assign for unlock</li><li>spin_non_aligned, same as above but spinlocks are packed together hence sharing cache-lines</li><li>lock_xadd, atomic-inc, (on sparc impl. using atomic.h, which uses cas i think)</li><li>xadd, (only x86), the non-smp (but irq) safe add variant for x86</li><li>gcc_sync_fetch_and_add, gcc intrinsic for atomic add</li><li>add_mb, "normal" add (on volatile variable) followed by a full-barrier</li><li>add, "normal" add (on volatile variable)</li><li>nop, a nop, just to see that thread start/stop does not affect test outcome noticable</li><br /></ul>The conclusions are:<br /><ul><li>atomic operations are very expensive</li><li>false sharing is a true disaster</li><li>it might be worth the effort to impl. both spinlocks and atomic-inc for sparc<br /></li></ul><br /><br />Sorry for lousy html formatting :(<br /><span style="font-size:78%;"></span><table border="1" cellpadding="1" cellspacing="1"><span style="font-size:78%;"></span><tbody><tr><th colspan="7" align="center"><span style="font-size:78%;">Intel(R) Core(TM)2 Quad CPU Q6600@2.40GHz (1-socket 4-cores)</span></th></tr><span style="font-size:78%;"></span><tr><th><span style="font-size:78%;"></span></th><th><span style="font-size:78%;"></span></th><th colspan="7" align="center"><span style="font-size:78%;">mops vs threads</span></th></tr><tr><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">op</span></th><th align="right"><span style="font-size:78%;">ns/op</span></th><th align="right"><span style="font-size:78%;">1</span></th><th align="right"><span style="font-size:78%;">2</span></th><th align="right"><span style="font-size:78%;">3</span></th><th align="right"><span style="font-size:78%;">4</span></th><th align="right"><span style="font-size:78%;">5</span></th><th align="right"><span style="font-size:78%;">6</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">7</span></th></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">mutex_align</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">42</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">23</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">44</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">66</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">88</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">78</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">79</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">89</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">mutex_non_align</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">42</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">23</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">7</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">10</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">8</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">19</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">18</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">22</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">spin_align</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">16</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">60</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">121</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">182</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">234</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">184</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">196</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">212</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">spin_non_align</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">16</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">60</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">16</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">24</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">32</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">39</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">40</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">57</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">lock_xadd</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">8</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">117</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">235</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">352</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">470</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">357</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">352</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">411</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">xadd</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">2</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">342</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">684</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1026</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1368</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">855</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1026</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1196</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">gcc_sync_fetch_and_add</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">8</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">119</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">239</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">359</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">479</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">371</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">359</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">419</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">add_mb</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">5</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">171</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">342</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">513</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">684</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">455</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">513</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">598</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">add</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">2</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">398</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">797</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1195</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1594</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">996</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1196</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1394</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">nop</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">0</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">6357142</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">2870967</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">2870967</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">2119047</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1390625</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">898989</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">687258</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span></tbody></table><span style="font-size:78%;"></span><table border="1"><span style="font-size:78%;"></span><tbody><tr><th colspan="14" align="center"><span style="font-size:78%;">2 x Intel(R) Xeon(R) CPU X5355 @2.66GHz (2-socket 4 cores each)</span></th></tr><span style="font-size:78%;"></span><tr><th><span style="font-size:78%;"></span></th><span style="font-size:78%;"></span><th><span style="font-size:78%;"></span></th><span style="font-size:78%;"></span><th colspan="14" align="center"><span style="font-size:78%;">mops vs threads</span></th><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">op</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">ns/op</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">1</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">2</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">3</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">4</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">5</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">6</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">7</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">8</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">9</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">10</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">11</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">12</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">13</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">14</span></th><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">mutex_align</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">43</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">22</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">42</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">63</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">84</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">105</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">126</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">145</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">162</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">126</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">134</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">132</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">141</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">139</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">155</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">mutex_non_align</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">43</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">22</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">10</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">15</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">18</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">18</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">22</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">29</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">27</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">27</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">33</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">36</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">44</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">49</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">57</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">spin_align</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">17</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">56</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">112</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">166</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">210</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">275</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">292</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">273</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">260</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">318</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">270</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">345</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">312</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">354</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">346</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">spin_non_align</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">17</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">56</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">17</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">36</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">38</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">51</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">49</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">50</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">55</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">72</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">91</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">93</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">123</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">87</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">120</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">lock_xadd</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">10</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">98</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">195</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">289</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">377</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">467</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">513</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">504</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">504</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">442</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">420</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">525</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">512</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">582</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">605</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">xadd</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">2</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">380</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">742</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1060</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1189</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1490</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1610</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1829</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1350</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1687</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1760</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1954</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1714</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1425</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">2006</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">gcc_sync_fetch_and_add</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">10</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">98</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">195</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">287</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">375</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">466</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">560</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">488</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">680</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">523</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">583</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">556</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">622</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">587</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">597</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">add_mb</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">7</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">126</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">252</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">369</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">479</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">587</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">589</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">770</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">719</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">598</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">650</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">639</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">686</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">649</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">602</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">add</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">2</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">443</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">861</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">974</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1393</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1775</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1807</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1904</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1740</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1986</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">2139</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1679</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1555</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">2307</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">2116</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">nop</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">0</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">4114457</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">3283653</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">2355172</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1366000</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">903439</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">803529</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">617540</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">640712</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">532761</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">466530</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">410950</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">382418</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">351699</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">320356</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span></tbody></table><span style="font-size:78%;"></span><table border="1"><span style="font-size:78%;"></span><tbody><tr><th colspan="16" align="center"><span style="font-size:78%;">SUNW,T5240, 2*(HT-64) 1415MHz SUNW,UltraSPARC-T2+ (2-socket 8-cores each, 8 threads/core)</span></th></tr><span style="font-size:78%;"></span><tr><th><span style="font-size:78%;"></span></th><span style="font-size:78%;"></span><th><span style="font-size:78%;"></span></th><span style="font-size:78%;"></span><th colspan="16" align="center"><span style="font-size:78%;">mops vs threads</span></th><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">op</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">ns/op</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">1</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">9</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">17</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">25</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">33</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">41</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">49</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">57</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">65</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">73</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">81</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">89</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">97</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">105</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">113</span></th><span style="font-size:78%;"></span><th align="right"><span style="font-size:78%;">121</span></th><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">mutex_align</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">299</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">3</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">29</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">55</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">78</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">98</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">115</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">132</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">141</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">153</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">161</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">179</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">181</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">191</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">200</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">208</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">209</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">mutex_non_align</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">299</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">3</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">7</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">13</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">22</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">29</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">37</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">44</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">51</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">57</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">63</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">68</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">73</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">78</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">83</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">88</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">92</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">lock_xadd</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">70</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">14</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">125</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">232</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">326</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">408</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">472</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">506</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">538</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">536</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">520</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">512</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">503</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">499</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">492</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">487</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">477</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">add_mb</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">34</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">28</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">258</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">469</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">637</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">759</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">853</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">909</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">937</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">947</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">926</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">915</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">897</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">881</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">893</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">892</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">870</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">add</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">13</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">74</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">637</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1020</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1257</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1398</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1412</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1356</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1295</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1222</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1247</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1273</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1246</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1265</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1272</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1286</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">1287</span></td><span style="font-size:78%;"></span></tr><span style="font-size:78%;"></span><tr><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">nop</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">0</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">184331</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">46367</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">24849</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">17520</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">12893</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">10676</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">9051</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">7616</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">6697</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">6196</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">5492</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">4960</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">4069</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">3739</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">3486</span></td><span style="font-size:78%;"></span><td align="right"><span style="font-size:78%;">3289</span></td><span style="font-size:78%;"></span></tr></tbody></table>Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com5tag:blogger.com,1999:blog-1526532204016125586.post-37597786901293270512009-04-09T13:57:00.000+02:002009-04-09T13:58:19.642+02:00bugs and more bugshave i worked on so far this year...<br />but 7.0 is soon to be released...and <br />things are starting to look reasonableJonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com0tag:blogger.com,1999:blog-1526532204016125586.post-2155425445914411402009-01-13T11:53:00.003+01:002009-01-13T12:04:15.896+01:00api-thread-contention TODOscurrently working on a refactoring ndbapi for mysql-cluster, in order to decrease <br />mutex contention allowing to better utilize many threads on multi-core machines.<br />while doing so, i implement a "vanilla" ndbapi-backend which lacks features<br />current in there.<br /><br />once this is working, i'll start adding optimizations...<br /><br />reintroduce:<br />- zero copy receive<br />- optimizations for single threaded performance (less ctx switches)<br /><br />introduce:<br />- split mutex(es)<br />- zero copy send (or actually 1-copy instead of 2, but zero sounds better)Jonas Orelandhttp://www.blogger.com/profile/02551781456999098405noreply@blogger.com4