summaryrefslogtreecommitdiff
path: root/docs/programmer_reference/transapp_tune.html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/programmer_reference/transapp_tune.html')
-rw-r--r--docs/programmer_reference/transapp_tune.html328
1 files changed, 196 insertions, 132 deletions
diff --git a/docs/programmer_reference/transapp_tune.html b/docs/programmer_reference/transapp_tune.html
index 7bdc1049..7f8dfd51 100644
--- a/docs/programmer_reference/transapp_tune.html
+++ b/docs/programmer_reference/transapp_tune.html
@@ -14,7 +14,7 @@
<body>
<div xmlns="" class="navheader">
<div class="libver">
- <p>Library Version 11.2.5.3</p>
+ <p>Library Version 12.1.6.1</p>
</div>
<table width="100%" summary="Navigation header">
<tr>
@@ -22,9 +22,7 @@
</tr>
<tr>
<td width="20%" align="left"><a accesskey="p" href="transapp_reclimit.html">Prev</a> </td>
- <th width="60%" align="center">Chapter 11. 
- Berkeley DB Transactional Data Store Applications
- </th>
+ <th width="60%" align="center">Chapter 11.  Berkeley DB Transactional Data Store Applications </th>
<td width="20%" align="right"> <a accesskey="n" href="transapp_throughput.html">Next</a></td>
</tr>
</table>
@@ -38,192 +36,257 @@
</div>
</div>
</div>
- <p>There are a few different issues to consider when tuning the performance
-of Berkeley DB transactional applications. First, you should review
-<a class="xref" href="am_misc_tune.html" title="Access method tuning">Access method tuning</a>, as the
-tuning issues for access method applications are applicable to
-transactional applications as well. The following are additional tuning
-issues for Berkeley DB transactional applications:</p>
+ <p>
+ There are a few different issues to consider when tuning the
+ performance of Berkeley DB transactional applications. First,
+ you should review <a class="xref" href="am_misc_tune.html" title="Access method tuning">Access method tuning</a>, as the tuning issues for
+ access method applications are applicable to transactional
+ applications as well. The following are additional tuning
+ issues for Berkeley DB transactional applications:
+ </p>
<div class="variablelist">
<dl>
<dt>
<span class="term">access method</span>
</dt>
- <dd>Highly concurrent applications should use the Queue access method, where
-possible, as it provides finer-granularity of locking than the other
-access methods. Otherwise, applications usually see better concurrency
-when using the Btree access method than when using either the Hash or
-Recno access methods.</dd>
+ <dd>
+ Highly concurrent applications should use the
+ Queue access method, where possible, as it provides
+ finer-granularity of locking than the other access
+ methods. Otherwise, applications usually see better
+ concurrency when using the Btree access method than
+ when using either the Hash or Recno access
+ methods.
+ </dd>
<dt>
<span class="term">record numbers</span>
</dt>
- <dd>Using record numbers outside of the Queue access method will often slow
-down concurrent applications as they limit the degree of concurrency
-available in the database. Using the Recno access method, or the Btree
-access method with retrieval by record number configured can slow
-applications down.</dd>
+ <dd>
+ Using record numbers outside of the Queue access
+ method will often slow down concurrent applications as
+ they limit the degree of concurrency available in the
+ database. Using the Recno access method, or the Btree
+ access method with retrieval by record number
+ configured can slow applications down.
+ </dd>
<dt>
<span class="term">Btree database size</span>
</dt>
- <dd>When using the Btree access method, applications supporting concurrent
-access may see excessive numbers of deadlocks in small databases. There
-are two different approaches to resolving this problem. First, as the
-Btree access method uses page-level locking, decreasing the database
-page size can result in fewer lock conflicts. Second, in the case of
-databases that are cyclically growing and shrinking, turning off reverse
-splits (with <a href="../api_reference/C/dbset_flags.html#dbset_flags_DB_REVSPLITOFF" class="olink">DB_REVSPLITOFF</a>) can leave the database with enough
-pages that there will be fewer lock conflicts.</dd>
+ <dd>
+ When using the Btree access method, applications
+ supporting concurrent access may see excessive numbers
+ of deadlocks in small databases. There are two
+ different approaches to resolving this problem. First,
+ as the Btree access method uses page-level locking,
+ decreasing the database page size can result in fewer
+ lock conflicts. Second, in the case of databases that
+ are cyclically growing and shrinking, turning off
+ reverse splits (with <a href="../api_reference/C/dbset_flags.html#dbset_flags_DB_REVSPLITOFF" class="olink">DB_REVSPLITOFF</a>) can leave the
+ database with enough pages that there will be fewer
+ lock conflicts.
+ </dd>
<dt>
<span class="term">read locks</span>
</dt>
- <dd>Performing all read operations outside of transactions or at
-<a class="xref" href="transapp_read.html" title="Degrees of isolation">Degrees of isolation</a> can often
-significantly increase application throughput. In addition, limiting
-the lifetime of non-transactional cursors will reduce the length of
-times locks are held, thereby improving concurrency.</dd>
+ <dd>
+ Performing all read operations outside of
+ transactions or at <a class="xref" href="transapp_read.html" title="Degrees of isolation">Degrees of isolation</a> can often
+ significantly increase application throughput. In
+ addition, limiting the lifetime of non-transactional
+ cursors will reduce the length of times locks are
+ held, thereby improving concurrency.
+ </dd>
<dt>
<span class="term"><a href="../api_reference/C/envset_flags.html#set_flags_DB_DIRECT_DB" class="olink">DB_DIRECT_DB</a>, <a href="../api_reference/C/envlog_set_config.html#log_set_config_DB_LOG_DIRECT" class="olink">DB_LOG_DIRECT</a></span>
</dt>
<dd>
-On some systems, avoiding caching in the operating system can improve
-write throughput and allow the creation of larger Berkeley DB caches.</dd>
+ On some systems, avoiding caching in the
+ operating system can improve write throughput and
+ allow the creation of larger Berkeley DB
+ caches.
+ </dd>
<dt>
<span class="term"><a href="../api_reference/C/dbopen.html#dbopen_DB_READ_UNCOMMITTED" class="olink">DB_READ_UNCOMMITTED</a>, <a href="../api_reference/C/dbcget.html#dbcget_DB_READ_COMMITTED" class="olink">DB_READ_COMMITTED</a></span>
</dt>
<dd>
<p>
- Consider decreasing the level of isolation of transaction using
- the <a href="../api_reference/C/dbopen.html#dbopen_DB_READ_UNCOMMITTED" class="olink">DB_READ_UNCOMMITTED</a>, or <a href="../api_reference/C/dbcget.html#dbcget_DB_READ_COMMITTED" class="olink">DB_READ_COMMITTED</a> flags for
- transactions or cursors or the <a href="../api_reference/C/dbopen.html#dbopen_DB_READ_UNCOMMITTED" class="olink">DB_READ_UNCOMMITTED</a> flag on
- individual read operations. The <a href="../api_reference/C/dbcget.html#dbcget_DB_READ_COMMITTED" class="olink">DB_READ_COMMITTED</a> flag will
- release read locks on cursors as soon as the data page is
- nolonger referenced. This is also called
- <span class="emphasis"><em> degree 2 isolation</em></span>. This will
- tend to block write operations for shorter periods for
- applications that do not need to have repeatable reads for
- cursor operations.
- </p>
- <p>
- The <a href="../api_reference/C/dbcget.html#dbcget_DB_READ_COMMITTED" class="olink">DB_READ_COMMITTED</a> flag will allow read operations to
- potentially return data which has been modified but not yet
- committed, and can significantly increase application
- throughput in applications that do not require data be
- guaranteed to be permanent in the database. This is also
- called <span class="emphasis"><em>degree 1 isolation</em></span>,
- or <span class="emphasis"><em>dirty reads</em></span>.
- </p>
+ Consider decreasing the level of isolation of
+ transaction using the <a href="../api_reference/C/dbopen.html#dbopen_DB_READ_UNCOMMITTED" class="olink">DB_READ_UNCOMMITTED</a>, or
+ <a href="../api_reference/C/dbcget.html#dbcget_DB_READ_COMMITTED" class="olink">DB_READ_COMMITTED</a> flags for transactions or
+ cursors or the <a href="../api_reference/C/dbopen.html#dbopen_DB_READ_UNCOMMITTED" class="olink">DB_READ_UNCOMMITTED</a> flag on
+ individual read operations. The
+ <a href="../api_reference/C/dbcget.html#dbcget_DB_READ_COMMITTED" class="olink">DB_READ_COMMITTED</a> flag will release read locks
+ on cursors as soon as the data page is nolonger
+ referenced. This is also called <span class="emphasis"><em> degree
+ 2 isolation</em></span>. This will tend to
+ block write operations for shorter periods for
+ applications that do not need to have repeatable
+ reads for cursor operations.
+ </p>
+ <p>
+ The <a href="../api_reference/C/dbopen.html#dbopen_DB_READ_UNCOMMITTED" class="olink">DB_READ_UNCOMMITTED</a> flag will allow read
+ operations to potentially return data which has
+ been modified but not yet committed, and can
+ significantly increase application throughput in
+ applications that do not require data be
+ guaranteed to be permanent in the database. This
+ is also called <span class="emphasis"><em>degree 1
+ isolation</em></span>, or <span class="emphasis"><em>dirty
+ reads</em></span>.
+ </p>
</dd>
<dt>
<span class="term">
<a href="../api_reference/C/dbcget.html#dbcget_DB_RMW" class="olink">DB_RMW</a>
</span>
</dt>
- <dd> If there are many deadlocks, consider
-using the <a href="../api_reference/C/dbcget.html#dbcget_DB_RMW" class="olink">DB_RMW</a> flag to
-immediately acquire write locks when reading data items that will
-subsequently be modified. Although this flag may increase contention
-(because write locks are held longer than they would otherwise be), it
-may decrease the number of deadlocks that occur.</dd>
+ <dd>
+ If there are many deadlocks, consider using the
+ <a href="../api_reference/C/dbcget.html#dbcget_DB_RMW" class="olink">DB_RMW</a> flag to immediately acquire write locks when
+ reading data items that will subsequently be modified.
+ Although this flag may increase contention (because
+ write locks are held longer than they would otherwise
+ be), it may decrease the number of deadlocks that
+ occur.
+ </dd>
<dt>
<span class="term"><a href="../api_reference/C/envset_flags.html#set_flags_DB_TXN_WRITE_NOSYNC" class="olink">DB_TXN_WRITE_NOSYNC</a>, <a href="../api_reference/C/envset_flags.html#envset_flags_DB_TXN_NOSYNC" class="olink">DB_TXN_NOSYNC</a></span>
</dt>
- <dd>By default, transactional commit in Berkeley DB implies durability, that is,
-all committed operations will be present in the database after recovery
-from any application or system failure. For applications not requiring
-that level of certainty, specifying the <a href="../api_reference/C/envset_flags.html#envset_flags_DB_TXN_NOSYNC" class="olink">DB_TXN_NOSYNC</a> flag will
-often provide a significant performance improvement. In this case, the
-database will still be fully recoverable, but some number of committed
-transactions might be lost after application or system failure.</dd>
+ <dd>
+ By default, transactional commit in Berkeley DB
+ implies durability, that is, all committed operations
+ will be present in the database after recovery from
+ any application or system failure. For applications
+ not requiring that level of certainty, specifying the
+ <a href="../api_reference/C/envset_flags.html#envset_flags_DB_TXN_NOSYNC" class="olink">DB_TXN_NOSYNC</a> flag will often provide a significant
+ performance improvement. In this case, the database
+ will still be fully recoverable, but some number of
+ committed transactions might be lost after application
+ or system failure.
+ </dd>
<dt>
<span class="term">access databases in order</span>
</dt>
- <dd>When modifying multiple databases in a single transaction, always access
-physical files and databases within physical files, in the same order
-where possible. In addition, avoid returning to a physical file or
-database, that is, avoid accessing a database, moving on to another
-database and then returning to the first database. This can
-significantly reduce the chance of deadlock between threads of
-control.</dd>
+ <dd>
+ When modifying multiple databases in a single
+ transaction, always access physical files and
+ databases within physical files, in the same order
+ where possible. In addition, avoid returning to a
+ physical file or database, that is, avoid accessing a
+ database, moving on to another database and then
+ returning to the first database. This can
+ significantly reduce the chance of deadlock between
+ threads of control.
+ </dd>
<dt>
<span class="term">large key/data items</span>
</dt>
- <dd>Transactional protections in Berkeley DB are guaranteed by before and after
-physical image logging. This means applications modifying large
-key/data items also write large log records, and, in the case of the
-default transaction commit, threads of control must wait until those
-log records have been flushed to disk. Applications supporting
-concurrent access should try and keep key/data items small wherever
-possible.</dd>
+ <dd>
+ Transactional protections in Berkeley DB are
+ guaranteed by before and after physical image logging.
+ This means applications modifying large key/data items
+ also write large log records, and, in the case of the
+ default transaction commit, threads of control must
+ wait until those log records have been flushed to
+ disk. Applications supporting concurrent access should
+ try and keep key/data items small wherever
+ possible.
+ </dd>
<dt>
<span class="term">mutex selection</span>
</dt>
<dd>
<p>
- During configuration, Berkeley DB selects a mutex implementation
- for the architecture. Berkeley DB normally prefers blocking-mutex
- implementations over non-blocking ones. For example, Berkeley DB
- will select POSIX pthread mutex interfaces rather than
- assembly-code test-and-set spin mutexes because pthread mutexes are
- usually more efficient and less likely to waste CPU cycles spinning
- without getting any work accomplished.
- </p>
- <p>
- For some applications and systems (generally highly concurrent
- applications on large multiprocessor systems), Berkeley DB makes
- the wrong choice. In some cases, better performance can be
- achieved by configuring with the <a href="../installation/build_unix_conf.html#build_unix_conf.--with-mutex" class="olink">--with-mutex</a>
- argument and selecting a different mutex implementation than the
- one selected by Berkeley DB. When a test-and-set spin mutex
- implementation is selected, it may be useful to tune the number of
- spins made before yielding the processor and sleeping. For more
- information, see the <a href="../api_reference/C/mutexset_tas_spins.html" class="olink">DB_ENV-&gt;mutex_set_tas_spins()</a> method.
- </p>
+ During configuration, Berkeley DB selects a
+ mutex implementation for the architecture.
+ Berkeley DB normally prefers blocking-mutex
+ implementations over non-blocking ones. For
+ example, Berkeley DB will select POSIX pthread
+ mutex interfaces rather than assembly-code
+ test-and-set spin mutexes because pthread mutexes
+ are usually more efficient and less likely to
+ waste CPU cycles spinning without getting any work
+ accomplished.
+ </p>
<p>
- Finally, Berkeley DB may put multiple mutexes on individual cache
- lines. When tuning Berkeley DB for large multiprocessor systems,
- it may be useful to tune mutex alignment using the <a href="../api_reference/C/mutexset_align.html" class="olink">DB_ENV-&gt;mutex_set_align()</a>
- method.
- </p>
+ For some applications and systems (generally
+ highly concurrent applications on large
+ multiprocessor systems), Berkeley DB makes the
+ wrong choice. In some cases, better performance
+ can be achieved by configuring with the
+ <a href="../installation/build_unix_conf.html#build_unix_conf.--with-mutex" class="olink">--with-mutex</a> argument and selecting a different
+ mutex implementation than the one selected by
+ Berkeley DB. When a test-and-set spin mutex
+ implementation is selected, it may be useful to
+ tune the number of spins made before yielding the
+ processor and sleeping. This may be particularly
+ beneficial for systems containing several
+ hyperthreaded processor cores. For more
+ information, see the <a href="../api_reference/C/mutexset_tas_spins.html" class="olink">DB_ENV-&gt;mutex_set_tas_spins()</a> method.
+ </p>
+ <p>
+ Finally, Berkeley DB may put multiple mutexes
+ on individual cache lines. When tuning Berkeley DB
+ for large multiprocessor systems, it may be useful
+ to tune mutex alignment using the <a href="../api_reference/C/mutexset_align.html" class="olink">DB_ENV-&gt;mutex_set_align()</a>
+ method.
+ </p>
</dd>
<dt>
<span class="term">
<a href="../installation/build_unix_conf.html#build_unix_conf.--enable-posixmutexes" class="olink">--enable-posix-mutexes</a>
</span>
</dt>
- <dd>By default, the Berkeley DB library will only select the POSIX pthread mutex
-implementation if it supports mutexes shared between multiple processes.
-If your application does not share its database environment between
-processes and your system's POSIX mutex support was not selected because
-it did not support inter-process mutexes, you may be able to increase
-performance and transactional throughput by configuring with the
-<a href="../installation/build_unix_conf.html#build_unix_conf.--enable-posixmutexes" class="olink">--enable-posix-mutexes</a> argument.</dd>
+ <dd>
+ By default, the Berkeley DB library will only
+ select the POSIX pthread mutex implementation if it
+ supports mutexes shared between multiple processes. If
+ your application does not share its database
+ environment between processes and your system's POSIX
+ mutex support was not selected because it did not
+ support inter-process mutexes, you may be able to
+ increase performance and transactional throughput by
+ configuring with the <a href="../installation/build_unix_conf.html#build_unix_conf.--enable-posixmutexes" class="olink">--enable-posix-mutexes</a>
+ argument.
+ </dd>
<dt>
<span class="term">log buffer size</span>
</dt>
- <dd>Berkeley DB internally maintains a buffer of log writes. The buffer is
-written to disk at transaction commit, by default, or, whenever it
-is filled. If it is consistently being filled before transaction
-commit, it will be written multiple times per transaction, costing
-application performance. In these cases, increasing the size of the
-log buffer can increase application throughput.</dd>
+ <dd>
+ Berkeley DB internally maintains a buffer of log
+ writes. The buffer is written to disk at transaction
+ commit, by default, or, whenever it is filled. If it
+ is consistently being filled before transaction
+ commit, it will be written multiple times per
+ transaction, costing application performance. In these
+ cases, increasing the size of the log buffer can
+ increase application throughput.
+ </dd>
<dt>
<span class="term">log file location</span>
</dt>
- <dd>If the database environment's log files are on the same disk as the
-databases, the disk arms will have to seek back-and-forth between the
-two. Placing the log files and the databases on different disk arms
-can often increase application throughput.</dd>
+ <dd>
+ If the database environment's log files are on
+ the same disk as the databases, the disk arms will
+ have to seek back-and-forth between the two. Placing
+ the log files and the databases on different disk arms
+ can often increase application throughput.
+ </dd>
<dt>
<span class="term">trickle write</span>
</dt>
- <dd>In some applications, the cache is sufficiently active and dirty that
-readers frequently need to write a dirty page in order to have space in
-which to read a new page from the backing database file. You can use
-the <a href="../api_reference/C/db_stat.html" class="olink">db_stat</a> utility (or the statistics returned by the
-<a href="../api_reference/C/mempstat.html" class="olink">DB_ENV-&gt;memp_stat()</a> method) to see how often this is happening in your
-application's cache. In this case, using a separate thread of control
-and the <a href="../api_reference/C/memptrickle.html" class="olink">DB_ENV-&gt;memp_trickle()</a> method to trickle-write pages can often increase
-the overall throughput of the application.</dd>
+ <dd>
+ In some applications, the cache is sufficiently
+ active and dirty that readers frequently need to write
+ a dirty page in order to have space in which to read a
+ new page from the backing database file. You can use
+ the <a href="../api_reference/C/db_stat.html" class="olink">db_stat</a> utility (or the statistics returned by the
+ <a href="../api_reference/C/mempstat.html" class="olink">DB_ENV-&gt;memp_stat()</a> method) to see how often this is happening
+ in your application's cache. In this case, using a
+ separate thread of control and the <a href="../api_reference/C/memptrickle.html" class="olink">DB_ENV-&gt;memp_trickle()</a>
+ method to trickle-write pages can often increase the
+ overall throughput of the application.
+ </dd>
</dl>
</div>
</div>
@@ -242,7 +305,8 @@ the overall throughput of the application.</dd>
<td width="20%" align="center">
<a accesskey="h" href="index.html">Home</a>
</td>
- <td width="40%" align="right" valign="top"> Transaction throughput</td>
+ <td width="40%" align="right" valign="top"> Transaction
+ throughput</td>
</tr>
</table>
</div>