I've run checkIndex against the index and the results are below. That net is that it's telling me nothing is wrong with the index.
I did not have any instrumentation around the opening of the IndexSearcher (we don't use an IndexReader), just around the actual query execution so I had to add some additional logging. What I found surprised me, opening a search against this index takes the same 6 to 8 seconds that closing the indexWriter takes. Thanks for your help, Mark ----------------------------------- Segments file=segments_9hir numSegments=4 version=FORMAT_DIAGNOSTICS [Lucene 2.9] 1 of 4: name=_aiaz docCount=5886773 compound=true hasProx=true numFiles=2 size (MB)=3,628.377 diagnostics = {optimize=true, mergeFactor=4, os.version=2.6.18-194.17.1.el5, os=Linux, mergeDocStores=true, lucene.version=3.0.0 883080 - 2009-11-22 15:43:58, source=merge, os.arch=amd64, java.version=1.6.0_20, java.vendor=Sun Microsystems Inc.} has deletions [delFileName=_aiaz_1.del] test: open reader.........OK [1 deleted docs] test: fields..............OK [296713 fields] test: field norms.........OK [296713 fields] test: terms, freq, prox...OK [43933037 terms; 669926342 terms/docs pairs; 669957608 tokens] test: stored fields.......OK [173363203 total field count; avg 29.45 fields per doc] test: term vectors........OK [0 total vector count; avg 0 term/freq vector fields per doc] 2 of 4: name=_aib0 docCount=1 compound=true hasProx=true numFiles=2 size (MB)=0.002 diagnostics = {os.version=2.6.18-194.17.1.el5, os=Linux, lucene.version=3.0.0 883080 - 2009-11-22 15:43:58, source=flush, os.arch=amd64, java.version=1.6.0_20, java.vendor=Sun Microsystems Inc.} has deletions [delFileName=_aib0_1.del] test: open reader.........OK [1 deleted docs] test: fields..............OK [28 fields] test: field norms.........OK [28 fields] test: terms, freq, prox...OK [79 terms; 79 terms/docs pairs; 0 tokens] test: stored fields.......OK [0 total field count; avg � fields per doc] test: term vectors........OK [0 total vector count; avg � term/freq vector fields per doc] 3 of 4: name=_aib1 docCount=3 compound=true hasProx=true numFiles=1 size (MB)=0.003 diagnostics = {os.version=2.6.18-194.17.1.el5, os=Linux, lucene.version=3.0.0 883080 - 2009-11-22 15:43:58, source=flush, os.arch=amd64, java.version=1.6.0_20, java.vendor=Sun Microsystems Inc.} no deletions test: open reader.........OK test: fields..............OK [28 fields] test: field norms.........OK [28 fields] test: terms, freq, prox...OK [109 terms; 237 terms/docs pairs; 237 tokens] test: stored fields.......OK [60 total field count; avg 20 fields per doc] test: term vectors........OK [0 total vector count; avg 0 term/freq vector fields per doc] 4 of 4: name=_aib2 docCount=1 compound=true hasProx=true numFiles=1 size (MB)=0.002 diagnostics = {os.version=2.6.18-194.17.1.el5, os=Linux, lucene.version=3.0.0 883080 - 2009-11-22 15:43:58, source=flush, os.arch=amd64, java.version=1.6.0_20, java.vendor=Sun Microsystems Inc.} no deletions test: open reader.........OK test: fields..............OK [28 fields] test: field norms.........OK [28 fields] test: terms, freq, prox...OK [79 terms; 79 terms/docs pairs; 79 tokens] test: stored fields.......OK [20 total field count; avg 20 fields per doc] test: term vectors........OK [0 total vector count; avg 0 term/freq vector fields per doc] No problems were detected with this index. On Nov 3, 2010, at 12:03 PM, Michael McCandless wrote: > Can you run CheckIndex (command line tool) and post the output? > > How long does it take to open a reader on this same index, and perform > a simple query (eg TermQuery)? > > Mike > > On Wed, Nov 3, 2010 at 2:53 PM, Mark Kristensson > <mark.kristens...@smartsheet.com> wrote: >> I've successfully reproduced the issue in our lab with a copy from >> production and have broken the close() call into parts, as suggested, with >> one addition. >> >> Previously, the call was simply >> >> ... >> } finally { >> // Close >> if (indexWriter != null) { >> try { >> indexWriter.close(); >> ... >> >> >> Now, that is broken into the various parts, including a prepareCommit(); >> >> ... >> } finally { >> // Close >> if (indexWriter != null) { >> try { >> indexWriter.prepareCommit(); >> Logger.debug("prepareCommit() complete"); >> indexWriter.commit(); >> Logger.debug("commit() complete"); >> indexWriter.maybeMerge(); >> Logger.debug("maybeMerge() complete"); >> indexWriter.waitForMerges(); >> Logger.debug("waitForMerges() complete"); >> indexWriter.close(); >> ... >> >> >> It turns out that the prepareCommit() is the slow call here, taking several >> seconds to complete. >> >> I've done some reading about it, but have not found anything that might be >> helpful here. The fact that it is slow every single time, even when I'm >> adding exactly one document to the index, is perplexing and leads to me to >> think something must be corrupt with the index. >> >> Furthermore, I tried optimizing the index to see if that would have any >> impact (I wasn't expecting much) and it did not. >> >> I'm stumped at this point and am thinking I may have to rebuild the index, >> though I would definitely prefer to avoid doing that and would like to know >> why this is happening. >> >> Thanks for your help, >> Mark >> >> >> On Nov 2, 2010, at 9:26 AM, Mark Kristensson wrote: >> >>> >>> Wonderful information on what happens during indexWriter.close(), thank you >>> very much! I've got some testing to do as a result. >>> >>> We are on Lucene 3.0.0 right now. >>> >>> One other detail that I neglected to mention is that the batch size does >>> not seem to have any relation to the time it takes to close on the index >>> where we are having issues. We've had batches add as few as 3 documents and >>> batches add as many as 2500 documents in the last hour and every single >>> close() call for that index takes 6 to 8 seconds. While I won't know until >>> I am able to individually test the different pieces of the close() >>> operation, I'd be very surprised if a batch that adds just 3 new documents >>> results in very much merge work being done. It seems as if there is some >>> task happening during merge that the indexWriter is never able to >>> successfully complete and so it tries to complete that task every single >>> time close() is called. >>> >>> So, my working theory until I can dig deeper is that something is mildly >>> corrupt with the index (though not serious enough to affect most operations >>> on the index). Are there any good utilities for examining the health of an >>> index? >>> >>> I've dabbled with the experimental checkIndex object in the past (before we >>> upgraded to 3.0), but have found it to be incredibly slow and of marginal >>> value. Does anyone have any experience using CheckIndex to track down an >>> issue with a production index? >>> >>> Thanks again! >>> Mark >>> >>> On Nov 2, 2010, at 2:20 AM, Shai Erera wrote: >>> >>>> When you close IndexWriter, it performs several operations that might have >>>> a >>>> connection to the problem you describe: >>>> >>>> * Commit all the pending updates -- if your update batch size is more or >>>> less the same (i.e., comparable # of docs and total # bytes indexed), then >>>> you should not see a performance difference between closes. >>>> >>>> * Consults the MergePolicy and runs any merges it returns as candidates. >>>> >>>> * Waits for the merges to finish. >>>> >>>> Roughly, IndexWriter.close() can be substituted w/: >>>> writer.commit(false); // commits the changes, but does not run merges. >>>> writer.maybeMerge(); // runs merges returned by MergePolicy. >>>> writer.waitForMerges(); // if you use ConcurrentMergeScheduler, the above >>>> call returns immediately, not waiting for the merges to finish. >>>> writer.close(); // at this point, commit + merging has finished, so it does >>>> very little. >>>> >>>> As your index grows in size, so does its # of segments, and the segments >>>> size as well. So tweaking some parameters on the MergePolicy (such as >>>> mergeFactor, maxMergeMB etc.) can result in not attempting to merge too >>>> large segments. >>>> >>>> Alternatively, you can try the following: >>>> >>>> 1) Replace the call to writer.close() w/ the above sequence. Then, measure >>>> each call and report back which of them takes the suspicious amount of >>>> time. >>>> >>>> 2) Not running optimize() on a regular basis doesn't mean merges don't >>>> happen in the background. So if you want close() to return as fast as >>>> possible, you should call close(false). Note though that from time to time >>>> you should allow merges to finish, in order to reduce the # of segments. >>>> >>>> 3) If you want to control when the merges are run, you can open IndexWriter >>>> with NoMergePolicy, which always returns 0 merges to perform, or >>>> NoMergeScheduler which never executes merges. But be aware that this is >>>> dangerous as the # of segments in the index will continue to grow and >>>> search >>>> performance will degrade. >>>> >>>> The answers above is relevant for 3x, but most of them are also relevant >>>> for >>>> 2.9. If you have an older version of Lucene, then some of the solutions >>>> might still apply (such as close(false)). >>>> >>>> Hope this helps, >>>> Shai >>>> >>>> On Tue, Nov 2, 2010 at 12:55 AM, Mark Kristensson < >>>> mark.kristens...@smartsheet.com> wrote: >>>> >>>>> Hello, >>>>> >>>>> One of our Lucene indexes has started misbehaving on indexWriter.close >>>>> and >>>>> I'm searching for ideas about what may have happened and how to fix it. >>>>> >>>>> Here's our scenario: >>>>> - We have seven Lucene indexes that contain different sets of data from a >>>>> web application are indexed for searching by end users >>>>> - A java service runs twice a minute to pull changes from SQL DB queue >>>>> tables and update the relevant Lucene index(es) >>>>> - The two largest indexes (3.4GB and 3.8GB in size with 8 million and 6 >>>>> million records, respectively) contain similar sets of data, but are >>>>> structured differently for different consumption (e.g. one has an All >>>>> field >>>>> for general purpose searching, the other does not; one has numeric fields >>>>> for ranges, the other does not, etc.) >>>>> - We expunge deletes from our indexes twice per day >>>>> - A couple of weeks ago, one of the two large indexes became very slow to >>>>> close after each round of changes is applied by our indexing service. >>>>> Specifically, all of our indexes usually close in no more than 200 >>>>> milliseconds, but this one index is now taking 6 to 8 seconds to close >>>>> with >>>>> every single pass (and is leading to delays which are affecting end >>>>> users). >>>>> >>>>> Questions from my attempts to troubleshoot the problem: >>>>> - Has anyone else seen behavior similar to this? What did you do to >>>>> resolve >>>>> it? >>>>> - Does the size of an index or its documents (record count, disk size, avg >>>>> document size, max document size, etc.) have any correlation to the length >>>>> of time it takes to close an index? >>>>> - We are not currently optimizing any of our indexes on a regular basis, >>>>> could that have any impact upon indexing operations (e.g. >>>>> indexWriter.close())? My understanding is that optimization only affects >>>>> search performance, not indexing performance and to date we have not seen >>>>> any need to optimize based upon the performance of the search queries. >>>>> >>>>> Thanks, >>>>> Mark >>>>> --------------------------------------------------------------------- >>>>> To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org >>>>> For additional commands, e-mail: java-user-h...@lucene.apache.org >>>>> >>>>> >>> >> >> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org > For additional commands, e-mail: java-user-h...@lucene.apache.org > --------------------------------------------------------------------- To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org For additional commands, e-mail: java-user-h...@lucene.apache.org