couchdb-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Brian Candler (JIRA)" <j...@apache.org>
Subject [jira] Commented: (COUCHDB-620) Generating views is extremely slow - makes CouchDB hard to use with non-trivial number of docs
Date Thu, 14 Jan 2010 08:14:54 GMT

    [ https://issues.apache.org/jira/browse/COUCHDB-620?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12800145#action_12800145
] 

Brian Candler commented on COUCHDB-620:
---------------------------------------

>The error reporting issue is that if you've got four docs in the pipeline, and the process
dies, then its hard to tell which document caused the error.

Well, I guess it is on the 'push' side. But if you update your pointers on the 'pull' side,
and you've had two documents back, then the error must be in the third.

> And generally retrying will just cause another error.

If the view server *crashes* when fed document X, then I think document X should be retried
- i.e. this was probably an intermittent server error.

But if processing document X raised an *exception* (i.e. map function cannot handle the content)
then I'd have thought that couchjs should catch, serialise and return the exception. That
would allow the document to be skipped cleanly.


> Generating views is extremely slow - makes CouchDB hard to use with non-trivial number
of docs
> ----------------------------------------------------------------------------------------------
>
>                 Key: COUCHDB-620
>                 URL: https://issues.apache.org/jira/browse/COUCHDB-620
>             Project: CouchDB
>          Issue Type: Improvement
>          Components: Infrastructure
>    Affects Versions: 0.10
>         Environment: Ubuntu 9.10 64 bit, CouchDB 0.10
>            Reporter: Roger Binns
>            Assignee: Damien Katz
>         Attachments: pipelining.jpg
>
>
> Generating views is extremely slow.  For example adding 10 million documents takes less
than 10 minutes but generating some simple views on the same docs takes over 4 hours.
> Using top you can see that CouchDB (erlang) and couchjs between them cannot even saturate
a single CPU let alone the I/O system.  Under ideal conditions performance should be limited
by cpu, disk or memory.  This implies that the processes are doing simple things in lockstep
accumulating latencies in each process as well as the communication between them which when
multiplied by the number of documents can amount to a lot.
> Some suggestions:
> * Run as many couchjs instances as there are processor cores and scatter work amongst
them
> * Have some sort of pipelining in the erlang so that the moment the first byte of response
is received from couchjs the data is sent for the next request (the JSON conversion, HTTP
headers etc should all have been assembled already) to reduce latencies.  Do whatever is most
similar in couchjs (eg use separate threads to read requests, process them and write responses).
> * Use the equivalent of HTTP pipelining when talking to couchjs so that it always has
a doc ready to work on rather than having to transmit an entire response and then wait for
erlang to think and provide an entire new request
> A simple test of success is to have a database with a million or so documents with a
trivial view and have view creation max out the CPU,. memory or disk.
> Some things in CouchDB make this a particularly nasty problem.  View data is not replicated
so replicating documents can lead the view data by a large margin on the recipient database.
 This can lead to inconsistencies.  You also can't expect users to then wait minutes (or hours)
for a request to complete because the view generation got that far behind.  (My own plans
now are to not use replication and instead create the database file on another couchdb instance
and then rsync the binary database file over instead!)
> Although stale=ok is available, you still have no idea if the response will be quick
or take however long view generation does.  (Sure I could add some sort of timeout and complicate
the code but then what value do I pick?  If I have a user waiting I want an answer ASAP or
I have to give them some horrible error message.  Taking a long wait and then giving a timeout
is even worse!)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message