Browse Source

[2040] README migrated to dhcp-perf-guide

Tomek Mrugalski 12 years ago
parent
commit
9cb393ea43

+ 2 - 0
tests/tools/dhcp-ubench/Makefile

@@ -8,6 +8,8 @@ SQLITE_LDFLAGS=`pkg-config sqlite3 --libs`
 
 
 all: mysql_ubench sqlite_ubench memfile_ubench
 all: mysql_ubench sqlite_ubench memfile_ubench
 
 
+doc: dhcp-perf-guide.html dhcp-perf-guide.pdf
+
 mysql_ubench.o: mysql_ubench.cc mysql_ubench.h
 mysql_ubench.o: mysql_ubench.cc mysql_ubench.h
 	$(CXX) $< -c $(CFLAGS) $(MYSQL_CFLAGS)
 	$(CXX) $< -c $(CFLAGS) $(MYSQL_CFLAGS)
 
 

+ 0 - 149
tests/tools/dhcp-ubench/README

@@ -1,149 +0,0 @@
-
- DHCP micro-benchmarks
------------------------
-
- Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC")
-
- by Tomasz Mrugalski
-
-This directory contains simplified prototypes for various DB back-ends
-that are planned or considered as a backend engine for BIND10 DHCP.
-Athough trivial now, they are expected to evolve into useful tools
-that will allow users to measure performance in their specific environment.
-
-Currently the following benchmarks are planned:
-- in memory+flat file
-- SQLite
-- MySQL
-
-As they require additional (sometimes heavy) dependencies, they are not
-built by default. Actually, their build system completely separated.
-It will be eventually merged with the main BIND10 makefile system, but
-that is a low priority for now.
-
-All planned benchmarks will follow the same pattern.
-
-1. prepare operation (connect to a database, create a file etc.)
-2. Measure timestamp 0
-3. commit new lease4 (step repeated X times)
-4. Measure timestamp 1
-5. search for random lease4 (step repeated X times)
-6. Measure timestamp 2
-7. update existing lease4 (step repeated X times)
-8. Measure timestamp 3
-9. delete existing lease4 (step repeated X times)
-10. Measure timestamp 4
-11. Print out statistics, based on X and measured timestamps.
-
-Although this approach does not attempt to simulate actual DHCP server
-operation that has mix of all steps intervening, it answers the
-questions about basic database strenghts and weak points. In particular
-it can show what is the impact of specific DB optimizations, like
-changing engine, optimizing for writes/reads etc.
-
-The framework attempts to do the same amount of operations for every
-backend thus allowing fair complarison between them.
-
- MySQL backend
----------------
-
-MySQL backend requires MySQL client development libraries. It uses
-mysql_config tool (that works similar to pkg-config) to discover
-required compilation and linking options. To install required packages
-on Ubuntu, use the following command:
-
-sudo apt-get install mysql-client mysql-server libmysqlclient-dev
-
-Running MySQL server is required. Make sure that you have your setup
-configured so there is a user that is able to create databases.
-
-Before running tests, you need to initialize your database. You can
-use mysql-schema.sql script for that purpose.
-
-WARNING: It will drop existing Kea database. Do not run this on
-your production server. Assuming your MySQL user is kea, you can
-initialize your test database by:
-
-mysql -u kea -p < mysql.schema
-
-After that step, you are ready to run the test:
-
-./mysql_ubench
-
-or
-
-./mysql_ubench > results-mysql.txt
-
-Redirecting output to a file is important, because for each operation
-there is a single character printed to show progress. If you have a slow
-terminal, this may considerably affect test perfromance. On the other hand,
-printing something after each operation is required, as poor DB setting
-may slow down operations to around 20 per second. Observant user is expected
-to note that initial dots are printed too slowly and abort the test.
-
-Currently all parameters are hardcoded. To modify them, one needs to
-modify source code and recompile. Fortunately, that is quite easy.
-To modify MySQL parameters, see main() method at the end of mysql_ubench.c
-file. That is the plase where one can modify MySQL connection
-parameters (MySQL server hostname, user and password and database name).
-
-One parameter that has huge impact on performance is a a backend engine.
-You can get a list of engines of your MySQL implementation by using
-
-> show engines;
-
-in your mysql client. Two notable engines are MyISAM and InnoDB. You
-can tweak it by using the following command in mysql:
-
-> alter table lease4 engine=MyISAM;
-
-or
-
-> alter table lease4 engine=InnoDB;
-
- SQLite backend
-----------------
-SQLite backend requires both sqlite3 development and run-time package. Their
-names may vary from system to system, but on Ubuntu 12.04 they are called
-sqlite3 libsqlite3-dev. To install them, use the following command:
-
-sudo apt-get install sqlite3 libsqlite3-dev
-
-To run SQLite3 tests, first create the database:
-
-cat sqlite.schema | sqlite3 sqlite.db
-
-A new database called sqlite.db will be created. That is the default name used
-by sqlite_ubench test. If you prefer other name, make sure you update
-sqlite_ubench.cc accordingly. Once the database is created, you can run
-tests:
-
-./sqlite_ubench > results-sqlite.txt
-
-Make sure to tweak number of iterations in sqlite_ubench.cc. See num variable
-in main() function near the end of sqlite_ubench.cc file.
-
-To improve performance, asynchronous mode is used (PRAGMA synchronous = OFF).
-If you do not like it, modify SQLite_uBenchmark::connect() by commenting it out
-and suffer the pain of having around 10 inserts per seconds.
-
-Another tweakable feature is journal mode. It can be turned to several modes
-of operation. Its value can be modified in SQLite_uBenchmark::connect().
-See http://www.sqlite.org/pragma.html#pragma_journal_mode for detailed
-explanantion.
-
- Performance optimizations
----------------------------
-
-The following section is a collection of loose notes, ideas and comments that
-could be investigated to possibly improve (or thrash) performance. Please
-consider them as developer's scratchpad only. However, if you are experienced
-programmer or a DB admin, you are welcome to try some of them. ISC engineers
-are more than welcome to discuss pros and cons of various approaches on
-bind10-dev@lists.isc.org list.
-
-- SQLite: Excellent article that discusses performance optimizations:
-  - http://stackoverflow.com/questions/1711631/how-do-i-improve-the-performance-of-sqlite
-  - http://blog.quibb.org/2010/08/fast-bulk-inserts-into-sqlite/
-  - use prepared statements
-  - use journal mode in memory (or disable it completely)

+ 165 - 33
tests/tools/dhcp-ubench/dhcp-perf-guide.xml

@@ -32,6 +32,10 @@
     <copyright>
     <copyright>
       <year>2012</year><holder>Internet Systems Consortium, Inc.</holder>
       <year>2012</year><holder>Internet Systems Consortium, Inc.</holder>
     </copyright>
     </copyright>
+    <author>
+      <firstname>Tomasz</firstname>
+      <surname>Mrugalski</surname>
+    </author>
 
 
     <abstract>
     <abstract>
       <para>BIND 10 is a framework that features Domain Name System
       <para>BIND 10 is a framework that features Domain Name System
@@ -71,6 +75,43 @@
       pros an cons of various optimization techniques and
       pros an cons of various optimization techniques and
       tools.
       tools.
     </para>
     </para>
+
+  </chapter>
+
+  <chapter id="dhcp4">
+    <title>ISC DHCP 4.x</title>
+    <para>
+      TODO: Write something about ISC DHCP4 here.
+    </para>
+  </chapter>
+
+  <chapter id="kea">
+    <title>Kea</title>
+    <para>
+
+    </para>
+
+    <section>
+      <title>Backend performance evaluation</title>
+      <para>
+        Kea will support several different database backends, using
+        both popular databases (like MySQL or SQLite) and
+        custom-developed solutions (like in-memory database).  BIND 10
+        source code features set of performance microbenchmarks.
+        These are small tools written in C/C++ that simulate expected
+        DHCP server behaviour and evaluate the performance of
+        considered databases.
+      </para>
+
+      <para>
+        Those benchmarks are stored in tests/tools/dhcp-ubench
+        directory.  This directory contains simplified prototypes for
+        various DB back-ends that are planned or considered as a
+        backend engine for BIND10 DHCP.  Athough trivial now, they are
+        expected to evolve into useful tools that will allow users to
+        measure performance in their specific environment.
+      </para>
+
     <para>
     <para>
       Currently the following benchmarks are implemented:
       Currently the following benchmarks are implemented:
       <itemizedlist>
       <itemizedlist>
@@ -82,7 +123,7 @@
 
 
     <para>
     <para>
       As they require additional (sometimes heavy) dependencies, they are not
       As they require additional (sometimes heavy) dependencies, they are not
-      built by default. Actually, their build system completely separated.
+      built by default. Actually, their build system is completely separated.
       It will be eventually merged with the main BIND10 makefile system, but
       It will be eventually merged with the main BIND10 makefile system, but
       that is a low priority for now.
       that is a low priority for now.
     </para>
     </para>
@@ -92,13 +133,13 @@
       <orderedlist>
       <orderedlist>
         <listitem><para>prepare operation (connect to a database, create a file etc.)</para></listitem>
         <listitem><para>prepare operation (connect to a database, create a file etc.)</para></listitem>
         <listitem><para>Measure timestamp 0</para></listitem>
         <listitem><para>Measure timestamp 0</para></listitem>
-        <listitem><para>Commit new lease4 (step repeated X times)</para></listitem>
+        <listitem><para>Commit new lease4 (repeated X times)</para></listitem>
         <listitem><para>Measure timestamp 1</para></listitem>
         <listitem><para>Measure timestamp 1</para></listitem>
-        <listitem><para>Search for random lease4 (step repeated X times)</para></listitem>
+        <listitem><para>Search for random lease4 (repeated X times)</para></listitem>
         <listitem><para>Measure timestamp 2</para></listitem>
         <listitem><para>Measure timestamp 2</para></listitem>
-        <listitem><para>Update existing lease4 (step repeated X times)</para></listitem>
+        <listitem><para>Update existing lease4 (repeated X times)</para></listitem>
         <listitem><para>Measure timestamp 3</para></listitem>
         <listitem><para>Measure timestamp 3</para></listitem>
-        <listitem><para>Delete existing lease4 (step repeated X times)</para></listitem>
+        <listitem><para>Delete existing lease4 (repeated X times)</para></listitem>
         <listitem><para>Measure timestamp 4</para></listitem>
         <listitem><para>Measure timestamp 4</para></listitem>
         <listitem><para>Print out statistics, based on X and measured timestamps.</para></listitem>
         <listitem><para>Print out statistics, based on X and measured timestamps.</para></listitem>
       </orderedlist>
       </orderedlist>
@@ -114,44 +155,135 @@
       The framework attempts to do the same amount of operations for every
       The framework attempts to do the same amount of operations for every
       backend thus allowing fair complarison between them.
       backend thus allowing fair complarison between them.
     </para>
     </para>
+    </section>
 
 
-  </chapter>
+    <section id="mysql-backend">
+      <title>MySQL backend</title>
+      <para>MySQL backend requires MySQL client development libraries. It uses
+      mysql_config tool (that works similar to pkg-config) to discover required
+      compilation and linking options. To install required packages on Ubuntu,
+      use the following command:
 
 
-  <chapter id="dhcp4">
-    <title>ISC DHCP 4.x</title>
-    <para>
-      TODO: Write something about ISC DHCP4 here.
-    </para>
-  </chapter>
+      <screen>$ <userinput>sudo apt-get install mysql-client mysql-server libmysqlclient-dev</userinput></screen>
 
 
-  <chapter id="kea">
-    <title>Kea</title>
-    <para>
+      Make sure that MySQL server is running. Make sure that you have your setup
+      configured so there is a user that is able to modify used database.</para>
 
 
-    </para>
+      <para>Before running tests, you need to initialize your database. You can
+      use mysql.schema script for that purpose. WARNING: It will drop existing
+      Kea database. Do not run this on your production server. Assuming your
+      MySQL user is kea, you can initialize your test database by:
 
 
-    <section>
-      <title>Backend performance evaluation</title>
-      <para>
-        Kea will support several different database backends, using
-        both popular databases (like MySQL or SQLite) and
-        custom-developed solutions (like in-memory database).  BIND 10
-        source code features set of performance microbenchmarks.
-        These are small tools written in C/C++ that simulate expected
-        DHCP server behaviour and evaluate the performance of
-        considered databases.
+      <screen>$ <userinput>mysql -u kea -p &lt; mysql.schema</userinput></screen>
       </para>
       </para>
 
 
-      <para>
-        Those benchmarks are stored in tests/tools/dhcp-ubench
-        directory.  This directory contains simplified prototypes for
-        various DB back-ends that are planned or considered as a
-        backend engine for BIND10 DHCP.  Athough trivial now, they are
-        expected to evolve into useful tools that will allow users to
-        measure performance in their specific environment.
+      <para>After database is initialized, you are ready to run the test:
+      <screen>$ <userinput>./mysql_ubench</userinput></screen>
+
+      or
+
+      <screen>$ <userinput>./mysql_ubench &gt; results->mysql.txt</userinput></screen>
+
+      Redirecting output to a file is important, because for each operation
+      there is a single character printed to show progress. If you have a slow
+      terminal, this may considerably affect test perfromance. On the other hand,
+      printing something after each operation is required, as poor DB setting
+      may slow down operations to around 20 per second. Observant user is expected
+      to note that initial dots are printed too slowly and abort the test.</para>
+
+      <para>Currently all parameters are hardcoded. To modify them, one needs to
+      modify source code and recompile. Fortunately, that is quite easy.
+      To modify MySQL parameters, see main() method at the end of mysql_ubench.c
+      file. That is the plase where one can modify MySQL connection
+      parameters (MySQL server hostname, user and password and database name).</para>
+
+      <section>
+        <title>MySQL tweaks</title>
+        <para>To reconfigure mysql_ubench parameters, a modification to the source
+        code and recompilation is required. All parameters are listed in main()
+        function in mysql_ubench.cc file, near the end of the file. Currently supported
+        parameter are (default values specified in brackets):
+        <orderedlist>
+          <listitem><para>hostname - name of the host to connect to ("localhost")</para></listitem>
+          <listitem><para>user - MySQL username ("root")</para></listitem>
+          <listitem><para>passwd - MySQL password ("secret")</para></listitem>
+          <listitem><para>dbname - MySQL database name ("kea")</para></listitem>
+          <listitem><para>num - number of iterations (100)</para></listitem>
+          <listitem><para>sync - should the operations be performend in synchronous (true)
+          or asynchronous (false) manner (true)</para></listitem>
+          <listitem><para>verbose - should the test print out progress? (true)</para></listitem>
+        </orderedlist>
+        </para>
+
+        <para>One parameter that has huge impact on performance is a a backend engine.
+        You can get a list of engines of your MySQL implementation by using
+
+        <screen>&gt; <userinput>show engines;</userinput></screen>
+
+        in your mysql client. Two notable engines are MyISAM and InnoDB. mysql_ubench will
+        use MyISAM for synchronous mode and InnoDB for asynchronous.</para>
+    </section>
+    </section>
+
+
+    <section id="sqlite-ubench">
+      <title>SQLite-ubench</title>
+      <para>SQLite backend requires both sqlite3 development and run-time package. Their
+      names may vary from system to system, but on Ubuntu 12.04 they are called
+      sqlite3 libsqlite3-dev. To install them, use the following command:
+
+      <screen>&gt; <userinput>sudo apt-get install sqlite3 libsqlite3-dev</userinput></screen>
+
+      Before running the test the database has to be created. Use the following command for that:
+      <screen>&gt; <userinput>cat sqlite.schema | sqlite3 sqlite.db</userinput></screen>
+
+      A new database called sqlite.db will be created. That is the default name used
+      by sqlite_ubench test. If you prefer other name, make sure you update
+      sqlite_ubench.cc accordingly.</para>
+
+      <para>Once the database is created, you can run tests:
+      <screen>&gt; <userinput>./sqlite_ubench</userinput></screen>
+      or
+      <screen>&gt; <userinput>./sqlite_ubench > results-sqlite.txt</userinput></screen>
       </para>
       </para>
 
 
+      <section id="sqlite-tweaks">
+        <title>SQLite tweaks</title>
+        <para>To reconfigure sqlite_ubench parameters, a modification to the source
+        code and recompilation is required. All parameters are listed in main()
+        function in sqlite_ubench.cc file, near the end of the file. Currently supported
+        parameter are (default values specified in brackets):
+        <orderedlist>
+          <listitem><para>filename - name of the database file ("sqlite.db")</para></listitem>
+          <listitem><para>num - number of iterations (100)</para></listitem>
+          <listitem><para>sync - should the operations be performend in synchronous (true)
+          or asynchronous (false) manner (true)</para></listitem>
+          <listitem><para>verbose - should the test print out progress? (true)</para></listitem>
+        </orderedlist>
+        </para>
+
+        <para>SQLite can run in asynchronous or synchronous mode. This
+        mode can be controlled by using sync parameter. It is set
+        using (PRAGMA synchronous = ON or OFF).</para>
+
+        <para>Another tweakable feature is journal mode. It can be
+        turned to several modes of operation. Its value can be
+        modified in SQLite_uBenchmark::connect().  See
+        http://www.sqlite.org/pragma.html#pragma_journal_mode for
+        detailed explanantion.</para>
+      </section>
     </section>
     </section>
+
+    <section id="memfile-ubench">
+      <title>memfile-ubench</title>
+      <para> TODO </para>
+
+      <section id="memfile-tweaks">
+        <title>SQLite tweaks</title>
+        <para> ... </para>
+      </section>
+    </section>
+
   </chapter>
   </chapter>
 
 
   <chapter id="perfdhcp">
   <chapter id="perfdhcp">