<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>erkules</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/" />
    <link rel="self" type="application/atom+xml" href="http://linsenraum.de/erkules/atom.xml" />
    <id>tag:linsenraum.de,2010-01-29:/erkules//2</id>
    <updated>2010-12-18T20:46:16Z</updated>
    <subtitle>bloggiwoggi</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.23-en</generator>

<entry>
    <title>PBXT: SELECT</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/12/pbxt-select.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.142</id>

    <published>2010-12-13T01:20:53Z</published>
    <updated>2010-12-18T20:46:16Z</updated>

    <summary><![CDATA[ Dieser Post führt den vorherigen Artikel über PBXT weiter. Diesmal werden mit unterschiedlicher Concurrency SELECTs auf die - 300.000.000 Rows enthaltene - Tabelle gelassen. Zur Erinnerung: &nbsp;CREATE TABLE `rein` ( &nbsp; `id` int(11) NOT NULL AUTO_INCREMENT, &nbsp; `id2` int(11)...]]></summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="pbxt" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysqlpbxt" label="mysql pbxt" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[ Dieser
Post führt den <a href="http://linsenraum.de/erkules/2010/12/pbxt-new-kid-on-the-block.html">vorherigen</a>
Artikel über PBXT weiter.<br />
Diesmal werden mit unterschiedlicher Concurrency SELECTs auf die -
300.000.000 Rows enthaltene - Tabelle gelassen. Zur Erinnerung:<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">&nbsp;CREATE
TABLE
`rein`
(<br />
&nbsp; `id` int(11) NOT NULL AUTO_INCREMENT,<br />
&nbsp; `id2` int(11) NOT NULL,<br />
&nbsp; `id3` int(11) DEFAULT NULL,<br />
&nbsp; PRIMARY KEY (`id`),<br />
&nbsp; KEY `id2` (`id2`)<br />
) ENGINE=PBXT DEFAULT CHARSET=latin1 <br />
</p>
<h2><font style="font-size: 1.25em;">Zur Ausgangstabelle:</font></h2>
<br />
Eine Info, die beim vorherigen Post hätte erwähnt werden
müssen ist die Größe der Tabelle.<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">PBXT:<br />
1.2G&nbsp;&nbsp;&nbsp; rein-5.xtr<br />
7.6G&nbsp;&nbsp;&nbsp; rein.xtd<br />
9.8G&nbsp;&nbsp;&nbsp; rein.xti<br />
</p>
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">InnoDB:<br />
22G&nbsp;&nbsp;&nbsp;&nbsp; rein.ibd<br />
</p>
Während der PK der Tabelle wohlweislich aus 300.000.000
unterschiedlichen Werten besteht. ist dies beim scondary Index `id2`
nicht der Fall. Dieser hat Werte aus dem Bereich [1,1.000.000]
angenommen. So ist zu erwarten, dass jeder Wert 300 mal angenommen
wird. Dies ist für alle SELECTs, welche via `id2` gehen, wichtig zu wissen!;)<br />
<br />
Da die Datenmenge zu groß ist, habe ich mich entschieden die
Daten via <a href="http://de.wikipedia.org/wiki/Boxplot">Boxplots</a>
darzustellen. Diese Tests dienen nur sich dem Thema PBXT(InnoDB) zu nähern. Tests haben im Allgemeinen zu viele Freiheitsgrade um mehr als das zu liefern. Aber
dies sollte jedem Bekannt sein.<br />
<br />
<h2><font style="font-size: 1.25em;">SELECT</font></h2>
<br />
Die SELECT-Tests bestanden aus 100x1.000 Abfragen. Unterschieden wurde
zwischen hot und uniform. Während bei hot ein Definitionsbereich
von [1,10.000] existierte (für die WHERE-Bedingung), ging es bei
uniform über die ganze Tabelle [1,300.000.000]<br />
<hr style="width: 100%; height: 2px;"><br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">SELEC<img style="width: 680px; height: 480px;" alt="select pk hot" src="http://linsenraum.de/erkules/png/select_pk_hot.png" align="right" />T
id3 from rein where ID=@id<br />
</p>
<br />
Ich will mir nicht die Freiheit nehmen, die Daten zu interpretieren.
Bei diesem Test war ich überrascht, dass InnoDB nicht gnadenlos
gewann, da `id3` ja immer im selben Block wie der PK ist.<br />
<br />

<hr style="width: 100%; height: 2px;"><br /><p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">SELECT
id3 from rein where ID=@id<br />
</p>
<img style="width: 680px; height: 480px;" alt="select pk uniform" src="http://linsenraum.de/erkules/png/select_pk_uniform.png" align="right" /><br />
<br />
<br />PBXT schlägt sich erschreckend gut. Schön ist an der Graphik
zu sehen wie der Durchsatz für beide Engines einer Glockenkurve
gleich verläuft. Sollte dies mehr mit dem Server als mit den
Engines zu tun haben, dann freue ich mich schon auf Tests mit der MySQL
5.5 :)<br />
<br />

<hr style="width: 100%; height: 2px;"><br /><p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">SELECT
count(id3) from rein where id2=@id<br />
</p>
<br />
<img style="width: 680px; height: 480px;" alt="select second hot" src="http://linsenraum.de/erkules/png/select_second_hot.png" align="right" /><br />
<br />
<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;"><br />
</p>Das InnoDB
via secondary Index schlechter als PK abschneidet ist plausibel. Der Unterschied doch frappant.&nbsp; <br />

<br />
<hr style="width: 100%; height: 2px;"><br /><p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">SELECT
count(id3) from rein where id2=@id<br />
</p>
<img style="width: 680px; height: 480px;" alt="select second uniform" src="http://linsenraum.de/erkules/png/select_second_uniform.png" /><br /><br />
Wie zu erwarten geht der Durchsatz - alsbald auf alle 300.000.000 Rows
zugegriffen wird etwas runter. Eine Erklärung für das
Verhalten von könnte sein, dass PBXT gerade mit einigen
Hintergrundjobs beschäftigt war. Andere Testreihen (auf einem
anderen Rechner und anderer Version) hatten bei 128 keinen Drop im
Durchsatz.<br />
<hr>
<br />Ich für meinen Teil war/bin überrascht, wie gut sich PBXT
schlug. Gerade bei SELECTs via PK hätte ich erwartet, dass InnoDB
hier eindeutig die Nase vorne hat.<br />
<br />
<br />
Viel Spaß<br />
Erkan<br />]]>
        
    </content>
</entry>

<entry>
    <title>PBXT: New Kid on the Block [UPDATE]</title>
    <link rel="alternate" type="text/html" href="http://linsenraum.de/erkules/2010/12/pbxt-new-kid-on-the-block.html" />
    <id>tag:linsenraum.de,2010:/erkules//2.140</id>

    <published>2010-12-08T23:58:58Z</published>
    <updated>2011-01-07T14:30:30Z</updated>

    <summary> PBXT ist eine weitere vielversprechende StorageEngine für MySQL. Eine richtige Einführung soll erst in fernerer Zukunft folgen, doch soll uns das nicht davon abhalten diese StorageEngine schon mal zu testen. Was bietet sich mehr an, als PBXT mit dem...</summary>
    <author>
        <name>erkan</name>
        
    </author>
    
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="pbxt" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysqlpbxt" label="mysql pbxt" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://linsenraum.de/erkules/">
        <![CDATA[ 
PBXT
ist
eine weitere vielversprechende StorageEngine für MySQL. Eine
richtige Einführung soll erst in fernerer Zukunft folgen, doch
soll uns das nicht davon abhalten diese StorageEngine schon mal zu
testen.<br />
Was bietet sich mehr an, als PBXT mit dem gegenwärtigen
Platzhirschen InnoDB zu vergleichen?!<br />
Zum Testen wurde die MySQL
5.1.53 verwendet. PBXT fand in der Version 1.5.02 Beta Verwendung. Ich
verwendete
die Beta, da ich in der 1.0.11-7 einen Bug vermutete.<br />
<h2><br /></h2>Doch vorweg einiges, was ich spontan gerne noch an Features bei PBXT sehen würde:<br /><br />
An das InnoDB-Plugin gewohnt, kann man schnell einiges vermissen,&nbsp;
was es bei PBXT nicht gibt. So wäre etwas der Art PBXT_TRX,
PBXT_LOCKS etc. (in Anal<a style="" href="http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_force_recovery"><code class="literal"></code></a>ogie zu InnoDB) hielfreich. Auch wäre
es
schön zu wissen was die Hintergrundthreads von PBXT gerade machen.
Ein Backuptool zum binären Sichern (aka xtrabackup/Innodb Hot
Backup), wie auch die Möglichkeit
Daten zu kompremieren (aka InnoDB-Barracuda) wären schön zu
haben. Ein Äquivalent zu <a href="http://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_force_recovery">innodb_force_recovery</a>
habe ich mir auch zwei mal gewünscht.<br />
<h2><br /></h2><h2><b>Tests</b></h2><br />
Von PBXT habe ich quasi keine Ahnung. Hier gilt es noch viele Tests zu
fahren. Bei diesen Tests sollte nicht jedem Commit ein fsync() folgen,
da ich eher die StorageEngines als die Festplatten testen wollte.<br />
Folgende (PBXT/InnoDB)Config wurde verwendet.<br />
<br />
<ul>
<li>InnoDB-Plugin:<br />
innodb_buffer_pool_size = 20G<br />
innodb_flush_log_at_trx_commit = 2<br />
innodb_log_file_size = 512M<br />
innodb_log_files_in_group = 3<br />
innodb_file_per_table<br />
</li>
<li>PBXT:<br />
pbxt_trx_log_buffer_size=8M<br />
pbxt_index_cache_size=8G<br />
pbxt_data_log_threshold=256M<br />
pbxt_record_cache_size=12G<br />
pbxt_trx_log_cache_size=1G<br />
pbxt_flush_log_at_trx_commit=0<br />
pbxt_trx_log_threshold=128M<br />
pbxt_data_file_grow_size=50M<br />
pbxt_row_file_grow_size=10M<br />
pbxt_log_buffer_size=512M<br />
pbxt_data_log_cache_size=1G<br />
pbxt_checkpoint_frequency=64M<br />
pbxt_index_dirty_threshold=60<br />
pbxt_sweeper_priority=2<br />
</li>
</ul>
<br />
<h3><b>Autoincrement</b></h3>
InnoDB liebt Tabellen mit einen auto_increment PK. So hatte sich beim
ersten Test PBXT in einem Bereich zu schlagen, in dem InnoDB sehr gut
ist. <br />
Mit mysqlslap wurden über 8 parallele Verbindungen (mit 8
Verbindungen
hatte ich bis dato immer den besten Durchsatz auf der Maschine)
300.000.000 Zeilen in eine einfache Tabelle zu schreiben
(autocommit=ON).<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">&nbsp;CREATE
TABLE
`rein` (<br />
&nbsp; `id` int(11) NOT NULL AUTO_INCREMENT,<br />
&nbsp; `id2` int(11) NOT NULL,<br />
&nbsp; `id3` int(11) DEFAULT NULL,<br />
&nbsp; PRIMARY KEY (`id`),<br />
&nbsp; KEY `id2` (`id2`)<br />
) ENGINE=PBXT DEFAULT CHARSET=latin1 <br />
</p>
Dies wurde - um auch Daten für die Grafik zu haben - in 300 x
1.000.000 Inserts gesplittet. So beschreibt folgende Grafik wieviel
Sekunden pro 1.000.000 Inserts benötigt wurden. Sprich: Kleinere
Werte sind besser.<br />
<img style="width: 480px; height: 480px;" alt="Zeitverbrauch Insers PBXT vs. InnoDB" src="http://linsenraum.de/erkules/png//insert.png" align="left" /><br />
<br />
<br />
Die ersten paar Millionen Rows laufen für PBXT zwar wunderbar.
Aber dann sackt PBXT förmlich ein. Während InnoDB nahezu
konstant durchmarschirt.<br />
Trägt man auf der x-Achse die Inserts/Sekunde bekommt man sehr
schnell auch ein Gefühl für die Performance.<br />
<img alt="Rows/s" src="http://linsenraum.de/erkules/png//insert-row_pro_s.png" height="480" width="480" align="right" /><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Von "kleinen" Tabellen abgesehen, gewinnt hier PBXT kein Land.
Unangenehm sind die starken Schwankungen bei PBXT. Ob das an den
Hintergrundthreads lag und wie diese die Last verarbeiten, kann ich
nicht (hoffentlich noch nicht) sagen. Auffällig war allerdings,
dass PBXT das RAID10 stärker zum Anschlag brachte (war fast
durchgängig bei einer %util von 100%) als das InnoDB-Plugin. Mit
knapp über 16000 Inserts pro Sekunde ist PBXT auch nicht wirklich
langsam, aber über 60000 Inserts pro Sekunde bei InnoDB ist schon
entscheidend mehr.<br />
<br />
<h2><br /></h2><h2><b>UUID</b></h2><br />Doch wie
sieht es mit einem Workload aus, bei der InnoDB eben nicht so
schön skaliert? Nun wird als PK UUID() verwendet und zudem
noch ein Text-Column.<br />
<br />
<p style="font-family: Courier New,Courier,monospace; background-color: rgb(240, 192, 172); margin-left: 40px; margin-right: 40px;">CREATE
TABLE
`reinUUID` (<br />
&nbsp; `uid` char(32) NOT NULL,<br />
&nbsp; `id` int(11) NOT NULL,<br />
&nbsp; `id2` int(11) NOT NULL,<br />
&nbsp; `mail` text,<br />
&nbsp; PRIMARY KEY (`uid`)<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1<br />
</p>
<br /><b>[UPDATE: Oli Sennhauser wies mich darauf hin, dass&nbsp;
innodb_flush_log_at_trx_commit = 2 nicht die beste Konfiguration für 
InnoDB ist. Daher wurde der Test für beide auf UUID-PK gehende Tests 
wiederholt. Wobei sowohl für innodb_flush_log_at_trx_commit, alsauch für
 pbxt_flush_log_at_trx_commit. <br />
i := Innodb, p:=pbxt die folgende Zahl gibt jeweils den Wert der Variable an.]</b><br /><br />
<img style="width: 480px; height: 480px;" alt="UUID-Insert-Vergleich" src="http://linsenraum.de/erkules/png//uuid-insert.png" align="left" /><br />
<br />
Hier ist ziemlich eindeutig zu sehen, wie InnoDB sich quasi
verabschiedet. Nach 16000000 Rows brach ich den Versuch dann schlicht und
ergeifend ab. <br />
PBXT hatte - im Vergleich zu InnoDB - keinerlei Probleme mit diesem
Workload. <br />
Um noch ein Gefühl für die Performance zu geben, auch hier
die selben Daten anders dargestellt. <br />
<br />
<img style="width: 480px; height: 480px;" alt="Insert pro Sekunde (UUID)" src="http://linsenraum.de/erkules/png/uuid-insert-pro-sek.png" align="right" /><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
&nbsp;<br />
An dieser Grafik erkennt man gut, das auch PBXT langsamer wird. Im
Vergleich zu InnoDB ist bei diesem Workload und dieser Config klar PBXT
überlegen und eine interessante Wahl.<br />
<br />
<br />
Beim nächsten mal werden UPDATEs und SELECTs auf PK und secondary
Indizes verglichen. Stay tuned:)<br />
<br /><br />]]>
        
    </content>
</entry>

</feed>
