From 0b12e7f86035122fbde8f85a9460767c1294ae04 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 20 Dec 2010 15:51:58 +0000 Subject: [PATCH] Add additional DBSTATUS options for measuring the hit and miss rates against the lookaside memory pool - information useful in tuning the lookaside size. Currently experimental pending analysis of performance impact. FossilOrigin-Name: 34613f1dc54c638531ca2f5907b71fbe8841233e --- manifest | 28 ++++++++++++++++------------ manifest.uuid | 2 +- src/malloc.c | 20 +++++++++++++------- src/sqlite.h.in | 35 ++++++++++++++++++++++++++++++----- src/sqliteInt.h | 1 + src/status.c | 16 ++++++++++++++++ 6 files changed, 77 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index 8023d4f93e..c423fa11b3 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,8 @@ -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 -C Add\sthe\s"-heap"\soption\sto\sthe\scommand-line\sshell\s-\sto\sallocate\sa\sfixed\sheap\nfor\suse\swith\sSQLITE_ENABLE_MEMSYS5. -D 2010-12-17T14:03:02 +C Add\sadditional\sDBSTATUS\soptions\sfor\smeasuring\sthe\shit\sand\smiss\srates\sagainst\nthe\slookaside\smemory\spool\s-\sinformation\suseful\sin\stuning\sthe\slookaside\ssize.\nCurrently\sexperimental\spending\sanalysis\sof\sperformance\simpact. +D 2010-12-20T15:51:59 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 4547616ad2286053af6ccccefa242dc925e49bf0 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -145,7 +145,7 @@ F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e F src/loadext.c 8af9fcc75708d60b88636ccba38b4a7b3c155c3e F src/main.c b82ea116fc9e2e059e77b9a1aba76267681f7149 -F src/malloc.c 3d7284cd9346ab6e3945535761e68c23c6cf40ef +F src/malloc.c 92d59a007d7a42857d4e9454aa25b6b703286be1 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 00bd8265c81abb665c48fea1e0c234eb3b922206 F src/mem2.c e307323e86b5da1853d7111b68fd6b84ad6f09cf @@ -179,11 +179,11 @@ F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 F src/select.c 8a7ba246b0b4bb45df7fbc52681728a0e3deaaa7 F src/shell.c 9afa9bdd62142e254b4581a77b43080d3ffd4ef4 -F src/sqlite.h.in 83fed95ea6acbac51c48eba5bd93933f3795ee91 +F src/sqlite.h.in 2f1fd40e8ba7c0a51eb755e0b6af236ce692325b F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 -F src/sqliteInt.h b96d5ddb8b419a2ed7cf69a7778b53872d73e8a7 +F src/sqliteInt.h 3ef5fc89a4c9755a08a68de107493785a284e27c F src/sqliteLimit.h a17dcd3fb775d63b64a43a55c54cb282f9726f44 -F src/status.c 496913d4e8441195f6f2a75b1c95993a45b9b30b +F src/status.c 4997380fbb915426fef9e500b4872e79c99267fc F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/tclsqlite.c 77c5c4b8ac7b2d94ee480e1ad626fbd921d948e4 F src/test1.c 397809a3069c171a507a49b6f6edfc4255b0afbc @@ -897,14 +897,18 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P df430be59d0766a34a94ab85fec9aa3c3baeb740 -R 393588dace853776e15dcf6aab702ada +P 74fff692345fed4b247e2b34c1e63b4d50cddfd4 +R 5082873d15f794ab949991323071e42f +T *bgcolor * #c0ffc0 +T *branch * experimental +T *sym-experimental * +T -sym-trunk * U drh -Z 6ec40d9633f2b97ac37609013c97cbd2 +Z d0e19bf0b71d36c4c32d327aba382999 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) -iD8DBQFNC22aoxKgR168RlERAm4mAJ9G1zGhPNOGmUpwiD7fc9SFGpgP5ACeMlV3 -fsznZTHZc81uTNgquU68if8= -=DrJ4 +iD8DBQFND3uioxKgR168RlERAirTAJ0bHLsmerXov5fiom51y80kBrhKkACfXfos +ossaFA/wslQt5YU5JPaXj1I= +=Q2Je -----END PGP SIGNATURE----- diff --git a/manifest.uuid b/manifest.uuid index 0a6617ada8..dfd9a9a2d1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -74fff692345fed4b247e2b34c1e63b4d50cddfd4 \ No newline at end of file +34613f1dc54c638531ca2f5907b71fbe8841233e \ No newline at end of file diff --git a/src/malloc.c b/src/malloc.c index 2c78979498..a3a9e0fe2c 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -616,14 +616,20 @@ void *sqlite3DbMallocRaw(sqlite3 *db, int n){ if( db->mallocFailed ){ return 0; } - if( db->lookaside.bEnabled && n<=db->lookaside.sz - && (pBuf = db->lookaside.pFree)!=0 ){ - db->lookaside.pFree = pBuf->pNext; - db->lookaside.nOut++; - if( db->lookaside.nOut>db->lookaside.mxOut ){ - db->lookaside.mxOut = db->lookaside.nOut; + if( db->lookaside.bEnabled ){ + if( n>db->lookaside.sz ){ + db->lookaside.anStat[1]++; + }else if( (pBuf = db->lookaside.pFree)==0 ){ + db->lookaside.anStat[2]++; + }else{ + db->lookaside.pFree = pBuf->pNext; + db->lookaside.nOut++; + db->lookaside.anStat[0]++; + if( db->lookaside.nOut>db->lookaside.mxOut ){ + db->lookaside.mxOut = db->lookaside.nOut; + } + return (void*)pBuf; } - return (void*)pBuf; } } #else diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 84999d4b1a..226c5f97f5 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -5509,6 +5509,28 @@ int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); **
This parameter returns the number of lookaside memory slots currently ** checked out.
)^ ** +** ^(
SQLITE_DBSTATUS_LOOKASIDE_HIT
+**
This parameter returns the number malloc attempts that were +** satisfied using lookaside memory. Only the high-water value is meaningful; +** the current value is always zero. +** checked out.
)^ +** +** ^(
SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
+**
This parameter returns the number malloc attempts that might have +** been satisfied using lookaside memory but failed due to the amount of +** memory requested being larger than the lookaside slot size. +** Only the high-water value is meaningful; +** the current value is always zero. +** checked out.
)^ +** +** ^(
SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
+**
This parameter returns the number malloc attempts that might have +** been satisfied using lookaside memory but failed due to all lookaside +** memory already being in use. +** Only the high-water value is meaningful; +** the current value is always zero. +** checked out.
)^ +** ** ^(
SQLITE_DBSTATUS_CACHE_USED
**
This parameter returns the approximate number of of bytes of heap ** memory used by all pager caches associated with the database connection.)^ @@ -5531,11 +5553,14 @@ int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); **
** */ -#define SQLITE_DBSTATUS_LOOKASIDE_USED 0 -#define SQLITE_DBSTATUS_CACHE_USED 1 -#define SQLITE_DBSTATUS_SCHEMA_USED 2 -#define SQLITE_DBSTATUS_STMT_USED 3 -#define SQLITE_DBSTATUS_MAX 3 /* Largest defined DBSTATUS */ +#define SQLITE_DBSTATUS_LOOKASIDE_USED 0 +#define SQLITE_DBSTATUS_CACHE_USED 1 +#define SQLITE_DBSTATUS_SCHEMA_USED 2 +#define SQLITE_DBSTATUS_STMT_USED 3 +#define SQLITE_DBSTATUS_LOOKASIDE_HIT 4 +#define SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE 5 +#define SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL 6 +#define SQLITE_DBSTATUS_MAX 6 /* Largest defined DBSTATUS */ /* diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 4f0e08ea76..5233e99f09 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -737,6 +737,7 @@ struct Lookaside { u8 bMalloced; /* True if pStart obtained from sqlite3_malloc() */ int nOut; /* Number of buffers currently checked out */ int mxOut; /* Highwater mark for nOut */ + int anStat[3]; /* 0: hits. 1: size misses. 2: full misses */ LookasideSlot *pFree; /* List of available buffers */ void *pStart; /* First byte of available memory space */ void *pEnd; /* First byte past end of available space */ diff --git a/src/status.c b/src/status.c index 7f05f1c68e..96759fda7e 100644 --- a/src/status.c +++ b/src/status.c @@ -116,6 +116,22 @@ int sqlite3_db_status( break; } + case SQLITE_DBSTATUS_LOOKASIDE_HIT: + case SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE: + case SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL: { + testcase( op==SQLITE_DBSTATUS_LOOKASIDE_HIT ); + testcase( op==SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE ); + testcase( op==SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL ); + assert( (op-SQLITE_DBSTATUS_LOOKASIDE_HIT)>=0 ); + assert( (op-SQLITE_DBSTATUS_LOOKASIDE_HIT)<3 ); + *pCurrent = 0; + *pHighwater = db->lookaside.anStat[op - SQLITE_DBSTATUS_LOOKASIDE_HIT]; + if( resetFlag ){ + db->lookaside.anStat[op - SQLITE_DBSTATUS_LOOKASIDE_HIT] = 0; + } + break; + } + /* ** Return an approximation for the amount of memory currently used ** by all pagers associated with the given database connection. The -- 2.47.2