Sorry, but I could not understand the meaning of back-bdb residing in HEAD.
I have attached a diff over openldap-2.3.35 for changes regarding BDB
in-memory.
This mainly has changes for keeping logs,environment and databases in
memory.
The bdb in-memory code is under #ifdef BDB_INMEMORY
I am trying out different environment cache sizes to check any performance
difference.
Thanks and Regards,
Suhel
On 8/31/07, Howard Chu <[EMAIL PROTECTED]> wrote:
> Suhel Momin wrote:
> > Hi,
> >
> > I have made changes such that backend BDB ( ver 4.5 ) resides in
> > memory instead of on disk . This is with default slapd configuration.
> > I was hoping to have a better performance with this.
>
> back-bdb as currently residing in HEAD already yields efficiencies of 95%
> of
> available system bandwidth. It is extremely unlikely that you are going to
> be
> able to improve the performance significantly, most changes you could make
> to
> the code at this point will only yield performance losses.
>
> > But what I now see
> > is that do_add takes much more time then what it use to take when BDB
> > was on-Disk. Indexing is done on objectclass in both the cases.
> >
> > Any pointers on why this could be an issue?
>
> --
> -- Howard Chu
> Chief Architect, Symas Corp. http://www.symas.com
> Director, Highland Sun http://highlandsun.com/hyc/
> Chief Architect, OpenLDAP http://www.openldap.org/project/
>
diff -Narup openldap-2.3.35/servers/slapd/back-bdb/dbcache.c inmemory_openldap-2.3.35/servers/slapd/back-bdb/dbcache.c
--- openldap-2.3.35/servers/slapd/back-bdb/dbcache.c 2007-01-03 03:14:00.000000000 +0530
+++ inmemory_openldap-2.3.35/servers/slapd/back-bdb/dbcache.c 2007-09-04 19:05:57.000000000 +0530
@@ -116,6 +116,12 @@ bdb_db_cache(
file = ch_malloc( strlen( name ) + sizeof(BDB_SUFFIX) );
sprintf( file, "%s" BDB_SUFFIX, name );
+#ifdef BDB_INMEMORY
+ /* DB_MPOOL_NOFILE is set to specify database will remain in memory*/
+ db->bdi_db->mpf->set_flags(db->bdi_db->mpf,DB_MPOOL_NOFILE,1);
+#endif
+
+
#ifdef HAVE_EBCDIC
__atoe( file );
#endif
@@ -129,10 +135,16 @@ bdb_db_cache(
(SLAP_TOOL_QUICK|SLAP_TRUNCATE_MODE))
flags |= DB_TRUNCATE;
+#ifdef BDB_INMEMORY
+ rc = DB_OPEN( db->bdi_db,
+ NULL, /*No need to specify the name as the database will reside in-memory*/
+ NULL /* name */,
+ BDB_INDEXTYPE, bdb->bi_db_opflags | flags, bdb->bi_dbenv_mode );
+#else
rc = DB_OPEN( db->bdi_db,
file, NULL /* name */,
BDB_INDEXTYPE, bdb->bi_db_opflags | flags, bdb->bi_dbenv_mode );
-
+#endif
ch_free( file );
if( rc != 0 ) {
diff -Narup openldap-2.3.35/servers/slapd/back-bdb/init.c inmemory_openldap-2.3.35/servers/slapd/back-bdb/init.c
--- openldap-2.3.35/servers/slapd/back-bdb/init.c 2007-02-25 00:58:11.000000000 +0530
+++ inmemory_openldap-2.3.35/servers/slapd/back-bdb/init.c 2007-09-04 19:01:25.000000000 +0530
@@ -58,10 +58,17 @@ bdb_db_init( BackendDB *be )
bdb = (struct bdb_info *) ch_calloc( 1, sizeof(struct bdb_info) );
/* DBEnv parameters */
+
+#ifdef BDB_INMEMORY
+ /* keep logs in memory*/
+ bdb->bi_dbenv_home = NULL;
+ bdb->bi_dbenv_xflags = DB_LOG_INMEMORY;
+ bdb->bi_dbenv_mode = 0;
+#else
bdb->bi_dbenv_home = ch_strdup( SLAPD_DEFAULT_DB_DIR );
bdb->bi_dbenv_xflags = 0;
bdb->bi_dbenv_mode = SLAPD_DEFAULT_DB_MODE;
-
+#endif
bdb->bi_cache.c_maxsize = DEFAULT_CACHE_SIZE;
bdb->bi_cache.c_minfree = 1;
@@ -278,8 +285,12 @@ shm_retry:
LDAP_XSTRING(bdb_db_open) ": dbenv_open(%s)\n",
bdb->bi_dbenv_home, 0, 0);
+#ifdef BDB_INMEMORY
+ /* DB_PRIVATE flag is added to keep environment in memory */
+ flags = DB_INIT_MPOOL | DB_CREATE | DB_THREAD | DB_PRIVATE;
+#else
flags = DB_INIT_MPOOL | DB_CREATE | DB_THREAD;
-
+#endif
if ( !quick )
flags |= BDB_TXN_FLAGS;
@@ -359,6 +370,9 @@ shm_retry:
goto fail;
}
+#ifdef BDB_INMEMORY
+ db->bdi_db->mpf->set_flags(db->bdi_db->mpf,DB_MPOOL_NOFILE,1);
+#endif
if( i == BDB_ID2ENTRY ) {
if ( slapMode & SLAP_TOOL_MODE )
db->bdi_db->mpf->set_priority( db->bdi_db->mpf,
@@ -391,6 +405,29 @@ shm_retry:
BDB_PAGESIZE );
}
+
+#ifdef BDB_INMEMORY
+
+#ifdef HAVE_EBCDIC
+ strcpy( path, bdbi_databases[i].file );
+ __atoe( path );
+ rc = DB_OPEN( db->bdi_db,
+ /* path*/NULL, /* don't need path for in-memory db*/
+ /* bdbi_databases[i].name, */ NULL,
+ bdbi_databases[i].type,
+ bdbi_databases[i].flags | flags,
+ bdb->bi_dbenv_mode );
+#else
+ rc = DB_OPEN( db->bdi_db,
+ /* bdbi_databases[i].file*/NULL, /* don't need file for in-memory db */
+ /* bdbi_databases[i].name, */ NULL,
+ bdbi_databases[i].type,
+ bdbi_databases[i].flags | flags,
+ bdb->bi_dbenv_mode );
+#endif
+
+#else
+
#ifdef HAVE_EBCDIC
strcpy( path, bdbi_databases[i].file );
__atoe( path );
@@ -409,6 +446,7 @@ shm_retry:
bdb->bi_dbenv_mode );
#endif
+#endif /*BDB_INMEMORY */
if ( rc != 0 ) {
char buf[SLAP_TEXT_BUFLEN];
diff -Narup openldap-2.3.35/servers/slapd/back-hdb/dbcache.c inmemory_openldap-2.3.35/servers/slapd/back-hdb/dbcache.c
--- openldap-2.3.35/servers/slapd/back-hdb/dbcache.c 2007-01-03 03:14:00.000000000 +0530
+++ inmemory_openldap-2.3.35/servers/slapd/back-hdb/dbcache.c 2007-09-04 19:05:57.000000000 +0530
@@ -116,6 +116,12 @@ bdb_db_cache(
file = ch_malloc( strlen( name ) + sizeof(BDB_SUFFIX) );
sprintf( file, "%s" BDB_SUFFIX, name );
+#ifdef BDB_INMEMORY
+ /* DB_MPOOL_NOFILE is set to specify database will remain in memory*/
+ db->bdi_db->mpf->set_flags(db->bdi_db->mpf,DB_MPOOL_NOFILE,1);
+#endif
+
+
#ifdef HAVE_EBCDIC
__atoe( file );
#endif
@@ -129,10 +135,16 @@ bdb_db_cache(
(SLAP_TOOL_QUICK|SLAP_TRUNCATE_MODE))
flags |= DB_TRUNCATE;
+#ifdef BDB_INMEMORY
+ rc = DB_OPEN( db->bdi_db,
+ NULL, /*No need to specify the name as the database will reside in-memory*/
+ NULL /* name */,
+ BDB_INDEXTYPE, bdb->bi_db_opflags | flags, bdb->bi_dbenv_mode );
+#else
rc = DB_OPEN( db->bdi_db,
file, NULL /* name */,
BDB_INDEXTYPE, bdb->bi_db_opflags | flags, bdb->bi_dbenv_mode );
-
+#endif
ch_free( file );
if( rc != 0 ) {
diff -Narup openldap-2.3.35/servers/slapd/back-hdb/init.c inmemory_openldap-2.3.35/servers/slapd/back-hdb/init.c
--- openldap-2.3.35/servers/slapd/back-hdb/init.c 2007-02-25 00:58:11.000000000 +0530
+++ inmemory_openldap-2.3.35/servers/slapd/back-hdb/init.c 2007-09-04 19:01:25.000000000 +0530
@@ -58,10 +58,17 @@ bdb_db_init( BackendDB *be )
bdb = (struct bdb_info *) ch_calloc( 1, sizeof(struct bdb_info) );
/* DBEnv parameters */
+
+#ifdef BDB_INMEMORY
+ /* keep logs in memory*/
+ bdb->bi_dbenv_home = NULL;
+ bdb->bi_dbenv_xflags = DB_LOG_INMEMORY;
+ bdb->bi_dbenv_mode = 0;
+#else
bdb->bi_dbenv_home = ch_strdup( SLAPD_DEFAULT_DB_DIR );
bdb->bi_dbenv_xflags = 0;
bdb->bi_dbenv_mode = SLAPD_DEFAULT_DB_MODE;
-
+#endif
bdb->bi_cache.c_maxsize = DEFAULT_CACHE_SIZE;
bdb->bi_cache.c_minfree = 1;
@@ -278,8 +285,12 @@ shm_retry:
LDAP_XSTRING(bdb_db_open) ": dbenv_open(%s)\n",
bdb->bi_dbenv_home, 0, 0);
+#ifdef BDB_INMEMORY
+ /* DB_PRIVATE flag is added to keep environment in memory */
+ flags = DB_INIT_MPOOL | DB_CREATE | DB_THREAD | DB_PRIVATE;
+#else
flags = DB_INIT_MPOOL | DB_CREATE | DB_THREAD;
-
+#endif
if ( !quick )
flags |= BDB_TXN_FLAGS;
@@ -359,6 +370,9 @@ shm_retry:
goto fail;
}
+#ifdef BDB_INMEMORY
+ db->bdi_db->mpf->set_flags(db->bdi_db->mpf,DB_MPOOL_NOFILE,1);
+#endif
if( i == BDB_ID2ENTRY ) {
if ( slapMode & SLAP_TOOL_MODE )
db->bdi_db->mpf->set_priority( db->bdi_db->mpf,
@@ -391,6 +405,29 @@ shm_retry:
BDB_PAGESIZE );
}
+
+#ifdef BDB_INMEMORY
+
+#ifdef HAVE_EBCDIC
+ strcpy( path, bdbi_databases[i].file );
+ __atoe( path );
+ rc = DB_OPEN( db->bdi_db,
+ /* path*/NULL, /* don't need path for in-memory db*/
+ /* bdbi_databases[i].name, */ NULL,
+ bdbi_databases[i].type,
+ bdbi_databases[i].flags | flags,
+ bdb->bi_dbenv_mode );
+#else
+ rc = DB_OPEN( db->bdi_db,
+ /* bdbi_databases[i].file*/NULL, /* don't need file for in-memory db */
+ /* bdbi_databases[i].name, */ NULL,
+ bdbi_databases[i].type,
+ bdbi_databases[i].flags | flags,
+ bdb->bi_dbenv_mode );
+#endif
+
+#else
+
#ifdef HAVE_EBCDIC
strcpy( path, bdbi_databases[i].file );
__atoe( path );
@@ -409,6 +446,7 @@ shm_retry:
bdb->bi_dbenv_mode );
#endif
+#endif /*BDB_INMEMORY */
if ( rc != 0 ) {
char buf[SLAP_TEXT_BUFLEN];