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

Alexander Shorin commented on COUCHDB-1986:
-------------------------------------------

Ok, here I got some numbers for the update. Long post.

- FreeBSD 9.1 with Erlang R15B02, clean install (vbox, 512 MB, 2 CPU)
- FreeBSD 10 with Erlang R16B02, clean install (vbox, 512 MB, 2 CPU)

I ran 04-replication-large-atts.t test on all of them:

{code}
$ ./test/etap/run src/couch_replicator/test/04-replication-large-atts.t
{code}

And there is the results for the [master's 
HEAD|https://github.com/apache/couchdb/commit/5d17c204]:

- FreeBSD 9.1: {{Files=1, Tests=1192, 47 wallclock secs ( 0.19 usr  0.20 sys + 
17.39 cusr 18.25 csys = 36.03 CPU)}}
- FreeBSD 10: Bailout called.  Further testing stopped:  Timeout waiting for 
replication to finish


Not the news at all.

Then, I applied small patch to measure the response time:

{code}
diff --git a/src/couch_replicator/src/couch_replicator_httpc.erl 
b/src/couch_replicator/src/couch_replicator_httpc.erl
index b8fb31b..ff90456 100644
--- a/src/couch_replicator/src/couch_replicator_httpc.erl
+++ b/src/couch_replicator/src/couch_replicator_httpc.erl
@@ -61,8 +61,11 @@ send_ibrowse_req(#httpdb{headers = BaseHeaders} = HttpDb, 
Params) ->
         lists:ukeymerge(1, get_value(ibrowse_options, Params, []),
             HttpDb#httpdb.ibrowse_options)
     ],
-     Response = ibrowse:send_req_direct(
-         Worker, Url, Headers2, Method, Body, IbrowseOptions, infinity),
+    {_, E, _} = erlang:now(),
+    ?LOG_INFO("Made request ~p ~p in ~p secs ~n", [Method, Url, E - S]),
     {Worker, Response}.

{code}

Since the most heavies requests are attachments uploading, let's filter the 
output:

{code}
$ ./test/etap/run src/couch_replicator/test/04-replication-large-atts.t | egrep 
"Made request (post|put)"
{code}

FreeBSD 9.1:

{code}
[info] [<0.345.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_a/_ensure_full_commit"; in 0.101148 
secs 
[info] [<0.208.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_a/_local/ed1e1b8b6cc2aea9eaeb935affe17fdd";
 in 0.194595 secs 
[info] [<0.351.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_a/_ensure_full_commit"; in 0.115996 
secs 
[info] [<0.208.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_a/_local/ed1e1b8b6cc2aea9eaeb935affe17fdd";
 in 0.19801 secs 
[info] [<0.376.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_b/_revs_diff"; in 0.198322 secs 
[info] [<0.379.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_b/_revs_diff"; in 0.196964 secs 
[info] [<0.378.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_b/_revs_diff"; in 0.197843 secs 
[info] [<0.377.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_b/_revs_diff"; in 0.198358 secs 
[info] [<0.377.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc8?new_edits=false"; in 0.995802 
secs 
[info] [<0.378.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc7?new_edits=false"; in 0.996697 
secs 
[info] [<0.376.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc9?new_edits=false"; in 0.998658 
secs 
[info] [<0.379.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc6?new_edits=false"; in 0.998032 
secs 
[info] [<0.377.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_b/_revs_diff"; in 0.198479 secs 
[info] [<0.377.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc5?new_edits=false"; in 0.328846 
secs 
[info] [<0.377.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc4?new_edits=false"; in 0.329292 
secs 
[info] [<0.377.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc3?new_edits=false"; in 0.339167 
secs 
[info] [<0.377.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc2?new_edits=false"; in 0.329193 
secs 
[info] [<0.377.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc11?new_edits=false"; in 0.329162 
secs 
[info] [<0.377.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc10?new_edits=false"; in 0.329075 
secs 
[info] [<0.377.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc1?new_edits=false"; in 0.329311 
secs 
[info] [<0.368.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_b/_ensure_full_commit"; in 0.099283 
secs 
[info] [<0.368.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/_local/76054f0aaccade46a4806b08a211bc16";
 in 0.198862 secs 
[info] [<0.462.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_b/_revs_diff"; in 0.199692 secs 
[info] [<0.466.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_b/_revs_diff"; in 0.198908 secs 
[info] [<0.464.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_b/_revs_diff"; in 0.199588 secs 
[info] [<0.468.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_b/_revs_diff"; in 0.199018 secs 
[info] [<0.500.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc9?new_edits=false"; in 2.522225 
secs 
[info] [<0.510.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc6?new_edits=false"; in 2.514634 
secs 
[info] [<0.506.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc7?new_edits=false"; in 2.51673 
secs 
[info] [<0.505.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc8?new_edits=false"; in 2.517766 
secs 
[info] [<0.462.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_b/_revs_diff"; in 0.197848 secs 
[info] [<0.616.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_a/_ensure_full_commit"; in 0.108526 
secs 
[info] [<0.450.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_b/_ensure_full_commit"; in 0.107361 
secs 
[info] [<0.450.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_a/_local/e8009d39fc94c9267bf51e9863c46895";
 in 0.202483 secs 
[info] [<0.450.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/_local/e8009d39fc94c9267bf51e9863c46895";
 in 0.197966 secs 
[info] [<0.570.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc4?new_edits=false"; in 4.332465 
secs 
[info] [<0.567.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc5?new_edits=false"; in 4.33544 
secs 
[info] [<0.578.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc2?new_edits=false"; in 4.335835 
secs 
[info] [<0.574.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc3?new_edits=false"; in 4.33976 
secs 
[info] [<0.588.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc1?new_edits=false"; in 4.328189 
secs 
[info] [<0.585.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc10?new_edits=false"; in 4.329808 
secs 
[info] [<0.582.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/doc11?new_edits=false"; in 4.331474 
secs 
[info] [<0.625.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_a/_ensure_full_commit"; in 0.099479 
secs 
[info] [<0.450.0>] Made request post 
"http://127.0.0.1:64967/couch_test_rep_db_b/_ensure_full_commit"; in 0.099653 
secs 
[info] [<0.450.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_a/_local/e8009d39fc94c9267bf51e9863c46895";
 in 0.198995 secs 
[info] [<0.450.0>] Made request put 
"http://127.0.0.1:64967/couch_test_rep_db_b/_local/e8009d39fc94c9267bf51e9863c46895";
 in 0.199502 secs 

{code}

Nothing looks criminal. 

FreeBSD 10:

{code}
# Creating target database
# Triggering replication
[info] [<0.309.0>] 127.0.0.1 - - HEAD /couch_test_rep_db_b/ 200
[info] [<0.370.0>] Made request head 
"http://127.0.0.1:11166/couch_test_rep_db_b/"; in 0.004577 secs 
[info] [<0.309.0>] 127.0.0.1 - - GET /couch_test_rep_db_b/ 200
[info] [<0.370.0>] Made request get 
"http://127.0.0.1:11166/couch_test_rep_db_b/"; in 0.100691 secs 
[info] [<0.309.0>] 127.0.0.1 - - GET 
/couch_test_rep_db_b/_local/2eaa8e3e950d010d82b20eff81e9f651 404
[info] [<0.370.0>] Made request get 
"http://127.0.0.1:11166/couch_test_rep_db_b/_local/2eaa8e3e950d010d82b20eff81e9f651";
 in 0.098708 secs 
[info] [<0.309.0>] 127.0.0.1 - - GET 
/couch_test_rep_db_b/_local/38bbd51d509064584b986ecfc71e443a 404
[info] [<0.370.0>] Made request get 
"http://127.0.0.1:11166/couch_test_rep_db_b/_local/38bbd51d509064584b986ecfc71e443a";
 in 0.099318 secs 
[info] [<0.309.0>] 127.0.0.1 - - GET 
/couch_test_rep_db_b/_local/eaecd74f7be532d2b82aa4c137cc0b11 404
[info] [<0.370.0>] Made request get 
"http://127.0.0.1:11166/couch_test_rep_db_b/_local/eaecd74f7be532d2b82aa4c137cc0b11";
 in 0.099245 secs 
[info] [<0.370.0>] Replication `"2eaa8e3e950d010d82b20eff81e9f651"` is using:
        4 worker processes
        a worker batch size of 500
        20 HTTP connections
        a connection timeout of 30000 milliseconds
        10 retries per request
        socket options are: [{keepalive,true},{nodelay,false}]
[info] [<0.2.0>] starting new replication `2eaa8e3e950d010d82b20eff81e9f651` at 
<0.370.0> (`couch_test_rep_db_a` -> 
`http://127.0.0.1:11166/couch_test_rep_db_b/`)
[info] [<0.309.0>] 127.0.0.1 - - POST /couch_test_rep_db_b/_revs_diff 200
[info] [<0.307.0>] 127.0.0.1 - - POST /couch_test_rep_db_b/_revs_diff 200
[info] [<0.310.0>] 127.0.0.1 - - POST /couch_test_rep_db_b/_revs_diff 200
[info] [<0.302.0>] 127.0.0.1 - - POST /couch_test_rep_db_b/_revs_diff 200
[info] [<0.378.0>] Made request post 
"http://127.0.0.1:11166/couch_test_rep_db_b/_revs_diff"; in 0.198793 secs 
[info] [<0.380.0>] Made request post 
"http://127.0.0.1:11166/couch_test_rep_db_b/_revs_diff"; in 0.200831 secs 
[info] [<0.379.0>] Made request post 
"http://127.0.0.1:11166/couch_test_rep_db_b/_revs_diff"; in 0.20114 secs 
[info] [<0.381.0>] Made request post 
"http://127.0.0.1:11166/couch_test_rep_db_b/_revs_diff"; in 0.20127 secs 
[info] [<0.310.0>] 127.0.0.1 - - PUT /couch_test_rep_db_b/doc8?new_edits=false 
201
[info] [<0.309.0>] 127.0.0.1 - - PUT /couch_test_rep_db_b/doc9?new_edits=false 
201
[info] [<0.302.0>] 127.0.0.1 - - PUT /couch_test_rep_db_b/doc6?new_edits=false 
201
[info] [<0.307.0>] 127.0.0.1 - - PUT /couch_test_rep_db_b/doc7?new_edits=false 
201
[info] [<0.378.0>] Made request put 
"http://127.0.0.1:11166/couch_test_rep_db_b/doc9?new_edits=false"; in 116.229091 
secs 
[info] [<0.379.0>] Made request put 
"http://127.0.0.1:11166/couch_test_rep_db_b/doc8?new_edits=false"; in 116.223251 
secs 
[info] [<0.381.0>] Made request put 
"http://127.0.0.1:11166/couch_test_rep_db_b/doc6?new_edits=false"; in 116.226021 
secs 
[info] [<0.380.0>] Made request put 
"http://127.0.0.1:11166/couch_test_rep_db_b/doc7?new_edits=false"; in 116.227487 
secs 
[info] [<0.310.0>] 127.0.0.1 - - POST /couch_test_rep_db_b/_revs_diff 200
[info] [<0.378.0>] Made request post 
"http://127.0.0.1:11166/couch_test_rep_db_b/_revs_diff"; in 0.198398 secs 
[info] [<0.307.0>] 127.0.0.1 - - POST /couch_test_rep_db_b/_ensure_full_commit 
201
[info] [<0.370.0>] Made request post 
"http://127.0.0.1:11166/couch_test_rep_db_b/_ensure_full_commit"; in 0.099793 
secs 
[info] [<0.370.0>] recording a checkpoint for `couch_test_rep_db_a` -> 
`http://127.0.0.1:11166/couch_test_rep_db_b/` at source update_seq 3
[info] [<0.307.0>] 127.0.0.1 - - PUT 
/couch_test_rep_db_b/_local/2eaa8e3e950d010d82b20eff81e9f651 201
[info] [<0.370.0>] Made request put 
"http://127.0.0.1:11166/couch_test_rep_db_b/_local/2eaa8e3e950d010d82b20eff81e9f651";
 in 0.20571 secs 
[info] [<0.310.0>] 127.0.0.1 - - PUT /couch_test_rep_db_b/doc5?new_edits=false 
201
[info] [<0.378.0>] Made request put 
"http://127.0.0.1:11166/couch_test_rep_db_b/doc5?new_edits=false"; in 115.208404 
secs 
Bailout called.  Further testing stopped:  Timeout waiting for replication to 
finish
Bail out! Timeout waiting for replication to finish
FAILED--Further testing stopped: Timeout waiting for replication to finish
{code}


Hold on a second: 115 seconds for pushing single doc to localhost. Btw, on 
1.6.x branch this time equals to 120 secs so Nicks patch really works, but 
doesn't actually solves the issue.

Ok, to make testing more fair let's try use Erlang R15B03 on FreeBSD 10:

{code}
# Creating target database
# Triggering replication
[info] [<0.307.0>] 127.0.0.1 - - HEAD /couch_test_rep_db_b/ 200
[info] [<0.370.0>] Made request head 
"http://127.0.0.1:51750/couch_test_rep_db_b/"; in 0.003978 secs 
[info] [<0.307.0>] 127.0.0.1 - - GET /couch_test_rep_db_b/ 200
[info] [<0.370.0>] Made request get 
"http://127.0.0.1:51750/couch_test_rep_db_b/"; in 0.098668 secs 
[info] [<0.307.0>] 127.0.0.1 - - GET 
/couch_test_rep_db_b/_local/1fef0ca5eb7ea55b37727c12cbb474b6 404
[info] [<0.370.0>] Made request get 
"http://127.0.0.1:51750/couch_test_rep_db_b/_local/1fef0ca5eb7ea55b37727c12cbb474b6";
 in 0.107729 secs 
[info] [<0.307.0>] 127.0.0.1 - - GET 
/couch_test_rep_db_b/_local/0344c3dab39f52994346ee2f286a109c 404
[info] [<0.370.0>] Made request get 
"http://127.0.0.1:51750/couch_test_rep_db_b/_local/0344c3dab39f52994346ee2f286a109c";
 in 0.09909 secs 
[info] [<0.307.0>] 127.0.0.1 - - GET 
/couch_test_rep_db_b/_local/2c46e037f893bea49f746b1c89fb073b 404
[info] [<0.370.0>] Made request get 
"http://127.0.0.1:51750/couch_test_rep_db_b/_local/2c46e037f893bea49f746b1c89fb073b";
 in 0.099404 secs 
[info] [<0.370.0>] Replication `"1fef0ca5eb7ea55b37727c12cbb474b6"` is using:
        4 worker processes
        a worker batch size of 500
        20 HTTP connections
        a connection timeout of 30000 milliseconds
        10 retries per request
        socket options are: [{keepalive,true},{nodelay,false}]
[info] [<0.2.0>] starting new replication `1fef0ca5eb7ea55b37727c12cbb474b6` at 
<0.370.0> (`couch_test_rep_db_a` -> 
`http://127.0.0.1:51750/couch_test_rep_db_b/`)
[info] [<0.307.0>] 127.0.0.1 - - POST /couch_test_rep_db_b/_revs_diff 200
[info] [<0.306.0>] 127.0.0.1 - - POST /couch_test_rep_db_b/_revs_diff 200
[info] [<0.303.0>] 127.0.0.1 - - POST /couch_test_rep_db_b/_revs_diff 200
[info] [<0.311.0>] 127.0.0.1 - - POST /couch_test_rep_db_b/_revs_diff 200
[info] [<0.382.0>] Made request post 
"http://127.0.0.1:51750/couch_test_rep_db_b/_revs_diff"; in 0.19943 secs 
[info] [<0.379.0>] Made request post 
"http://127.0.0.1:51750/couch_test_rep_db_b/_revs_diff"; in 0.201037 secs 
[info] [<0.380.0>] Made request post 
"http://127.0.0.1:51750/couch_test_rep_db_b/_revs_diff"; in 0.200908 secs 

[info] [<0.381.0>] Made request post 
"http://127.0.0.1:51750/couch_test_rep_db_b/_revs_diff"; in 0.200642 secs 
[info] [<0.311.0>] 127.0.0.1 - - PUT /couch_test_rep_db_b/doc9?new_edits=false 
201
[info] [<0.303.0>] 127.0.0.1 - - PUT /couch_test_rep_db_b/doc7?new_edits=false 
201
[info] [<0.307.0>] 127.0.0.1 - - PUT /couch_test_rep_db_b/doc8?new_edits=false 
201
[info] [<0.306.0>] 127.0.0.1 - - PUT /couch_test_rep_db_b/doc6?new_edits=false 
201
[info] [<0.379.0>] Made request put 
"http://127.0.0.1:51750/couch_test_rep_db_b/doc9?new_edits=false"; in 115.210925 
secs 
[info] [<0.381.0>] Made request put 
"http://127.0.0.1:51750/couch_test_rep_db_b/doc7?new_edits=false"; in 115.212048 
secs 
[info] [<0.382.0>] Made request put 
"http://127.0.0.1:51750/couch_test_rep_db_b/doc6?new_edits=false"; in 115.21568 
secs 
[info] [<0.380.0>] Made request put 
"http://127.0.0.1:51750/couch_test_rep_db_b/doc8?new_edits=false"; in 115.216761 
secs 
[info] [<0.311.0>] 127.0.0.1 - - POST /couch_test_rep_db_b/_revs_diff 200
[info] [<0.381.0>] Made request post 
"http://127.0.0.1:51750/couch_test_rep_db_b/_revs_diff"; in 0.198427 secs 
[info] [<0.307.0>] 127.0.0.1 - - POST /couch_test_rep_db_b/_ensure_full_commit 
201
[info] [<0.370.0>] Made request post 
"http://127.0.0.1:51750/couch_test_rep_db_b/_ensure_full_commit"; in 0.107235 
secs 
[info] [<0.370.0>] recording a checkpoint for `couch_test_rep_db_a` -> 
`http://127.0.0.1:51750/couch_test_rep_db_b/` at source update_seq 2
[info] [<0.307.0>] 127.0.0.1 - - PUT 
/couch_test_rep_db_b/_local/1fef0ca5eb7ea55b37727c12cbb474b6 201
[info] [<0.370.0>] Made request put 
"http://127.0.0.1:51750/couch_test_rep_db_b/_local/1fef0ca5eb7ea55b37727c12cbb474b6";
 in 0.206531 secs 
[info] [<0.311.0>] 127.0.0.1 - - PUT /couch_test_rep_db_b/doc5?new_edits=false 
201
[info] [<0.381.0>] Made request put 
"http://127.0.0.1:51750/couch_test_rep_db_b/doc5?new_edits=false"; in 115.208751 
secs 
Bailout called.  Further testing stopped:  Timeout waiting for replication to 
finish
Bail out! Timeout waiting for replication to finish
FAILED--Further testing stopped: Timeout waiting for replication to finish
{code}

Still the same picture. Ok, so the problem could be either in FreeBSD 10 
default configuration or in our code. Let's assume that it's the latter.

First, it looks like client (ibrowser) works too slow. On previous debug I 
found that 
[gen_tcp:send()|https://github.com/apache/couchdb/blob/master/src/ibrowse/ibrowse_http_client.erl#L560]
 takes about 200 milliseconds to send chunk with 8192 bytes to server. Not 
really sure what I tried to find by searching 8192 string in the source code, 
but I found that exactly the same numbers are used by mochiweb to define read 
buffer chunk size. So that's the idea: what will happens if I increase it?

{code}
diff --git a/src/mochiweb/internal.hrl b/src/mochiweb/internal.hrl
index 6db899a..338edca 100644
--- a/src/mochiweb/internal.hrl
+++ b/src/mochiweb/internal.hrl
@@ -1,3 +1,3 @@
 
--define(RECBUF_SIZE, 8192).
+-define(RECBUF_SIZE, 8192 * 4).

{code}


After the patch:

FreeBSD 9.1

{code}
[info] [<0.343.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_a/_ensure_full_commit"; in 0.098174 
secs 
[info] [<0.206.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_a/_local/5852f11ad174ce93069e8d2f2da026fc";
 in 0.197739 secs 
[info] [<0.347.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_a/_ensure_full_commit"; in 0.106469 
secs 
[info] [<0.206.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_a/_local/5852f11ad174ce93069e8d2f2da026fc";
 in 0.199129 secs 
[info] [<0.372.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_b/_revs_diff"; in 0.198386 secs 
[info] [<0.375.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_b/_revs_diff"; in 0.196966 secs 
[info] [<0.374.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_b/_revs_diff"; in 0.197865 secs 
[info] [<0.373.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_b/_revs_diff"; in 0.198386 secs 
[info] [<0.373.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc8?new_edits=false"; in 1.035908 
secs 
[info] [<0.374.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc7?new_edits=false"; in 1.036799 
secs 
[info] [<0.372.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc9?new_edits=false"; in 1.038673 
secs 
[info] [<0.375.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc6?new_edits=false"; in 1.038161 
secs 
[info] [<0.373.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_b/_revs_diff"; in 0.198448 secs 
[info] [<0.373.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc5?new_edits=false"; in 0.339051 
secs 
[info] [<0.373.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc4?new_edits=false"; in 0.329205 
secs 
[info] [<0.373.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc3?new_edits=false"; in 0.339112 
secs 
[info] [<0.373.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc2?new_edits=false"; in 0.329233 
secs 
[info] [<0.373.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc11?new_edits=false"; in 0.368982 
secs 
[info] [<0.373.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc10?new_edits=false"; in 0.329167 
secs 
[info] [<0.373.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc1?new_edits=false"; in 0.389066 
secs 
[info] [<0.364.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_b/_ensure_full_commit"; in 0.1194 secs 
[info] [<0.364.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/_local/85777ae3396849e65c872e08a7b42144";
 in 0.198753 secs 
[info] [<0.459.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_b/_revs_diff"; in 0.199771 secs 
[info] [<0.463.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_b/_revs_diff"; in 0.198931 secs 
[info] [<0.461.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_b/_revs_diff"; in 0.199617 secs 
[info] [<0.465.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_b/_revs_diff"; in 0.198968 secs 
[info] [<0.496.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc9?new_edits=false"; in 2.842012 
secs 
[info] [<0.505.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc6?new_edits=false"; in 2.835165 
secs 
[info] [<0.504.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc7?new_edits=false"; in 2.836418 
secs 
[info] [<0.500.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc8?new_edits=false"; in 2.83799 
secs 
[info] [<0.459.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_b/_revs_diff"; in 0.197864 secs 
[info] [<0.446.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_b/_ensure_full_commit"; in 0.106626 
secs 
[info] [<0.613.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_a/_ensure_full_commit"; in 0.108089 
secs 
[info] [<0.446.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_a/_local/91cabaf2492f2bd2a4ca92a53f02ca2f";
 in 0.203431 secs 
[info] [<0.446.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/_local/91cabaf2492f2bd2a4ca92a53f02ca2f";
 in 0.19678 secs 
[info] [<0.574.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc2?new_edits=false"; in 4.516424 
secs 
[info] [<0.570.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc3?new_edits=false"; in 4.520756 
secs 
[info] [<0.566.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc4?new_edits=false"; in 4.523575 
secs 
[info] [<0.563.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc5?new_edits=false"; in 4.527971 
secs 
[info] [<0.584.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc1?new_edits=false"; in 4.510487 
secs 
[info] [<0.581.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc10?new_edits=false"; in 4.512293 
secs 
[info] [<0.578.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/doc11?new_edits=false"; in 4.522901 
secs 
[info] [<0.622.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_a/_ensure_full_commit"; in 0.099445 
secs 
[info] [<0.446.0>] Made request post 
"http://127.0.0.1:14927/couch_test_rep_db_b/_ensure_full_commit"; in 0.099696 
secs 
[info] [<0.446.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_a/_local/91cabaf2492f2bd2a4ca92a53f02ca2f";
 in 0.198469 secs 
[info] [<0.446.0>] Made request put 
"http://127.0.0.1:14927/couch_test_rep_db_b/_local/91cabaf2492f2bd2a4ca92a53f02ca2f";
 in 0.199494 secs 
{code}

Nothing changed at all.

FreeBSD 10:

{code}
$ ./test/etap/run src/couch_replicator/test/04-replication-large-atts.t
src/couch_replicator/test/04-replication-large-atts.t .. 
...
All tests successful.
Files=1, Tests=1192, 47 wallclock secs ( 0.43 usr  0.09 sys + 33.72 cusr 13.70 
csys = 47.95 CPU)
Result: PASS
{code}
    
*Whoa!* 

Part of output with POST/PUT requests:

{code}
info] [<0.349.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_a/_ensure_full_commit"; in 0.094218 
secs 
[info] [<0.205.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_a/_local/05e6f7426223b3f0da8371efda4fa1a6";
 in 0.198086 secs 
[info] [<0.352.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_a/_ensure_full_commit"; in 0.109214 
secs 
[info] [<0.205.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_a/_local/05e6f7426223b3f0da8371efda4fa1a6";
 in 0.198422 secs 
[info] [<0.378.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_b/_revs_diff"; in 0.195682 secs 
[info] [<0.379.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_b/_revs_diff"; in 0.195524 secs 
[info] [<0.381.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_b/_revs_diff"; in 0.195412 secs 
[info] [<0.380.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_b/_revs_diff"; in 0.195646 secs 
[info] [<0.381.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc6?new_edits=false"; in 0.706663 
secs 
[info] [<0.380.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc7?new_edits=false"; in 0.754916 
secs 
[info] [<0.379.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc8?new_edits=false"; in 0.755129 
secs 
[info] [<0.378.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc9?new_edits=false"; in 0.871189 
secs 
[info] [<0.381.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_b/_revs_diff"; in 0.203772 secs 
[info] [<0.381.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc5?new_edits=false"; in 0.378326 
secs 
[info] [<0.381.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc4?new_edits=false"; in 0.409232 
secs 
[info] [<0.381.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc3?new_edits=false"; in 0.418802 
secs 
[info] [<0.381.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc2?new_edits=false"; in 0.399084 
secs 
[info] [<0.381.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc11?new_edits=false"; in 0.404278 
secs 
[info] [<0.381.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc10?new_edits=false"; in 0.323305 
secs 
[info] [<0.381.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc1?new_edits=false"; in 0.359326 
secs 
[info] [<0.369.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_b/_ensure_full_commit"; in 0.108647 
secs 
[info] [<0.369.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/_local/76d88aed4242930e5cc84e6f22fb5cc7";
 in 0.206168 secs 
[info] [<0.465.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_b/_revs_diff"; in 0.199665 secs 
[info] [<0.467.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_b/_revs_diff"; in 0.199372 secs 
[info] [<0.471.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_b/_revs_diff"; in 0.199052 secs 
[info] [<0.469.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_b/_revs_diff"; in 0.199648 secs 
[info] [<0.502.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc9?new_edits=false"; in 1.746967 
secs 
[info] [<0.507.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc8?new_edits=false"; in 1.879406 
secs 
[info] [<0.513.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc7?new_edits=false"; in 1.890523 
secs 
[info] [<0.465.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_b/_revs_diff"; in 0.203363 secs 
[info] [<0.506.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc6?new_edits=false"; in 1.993508 
secs 
[info] [<0.623.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_a/_ensure_full_commit"; in 0.100955 
secs 
[info] [<0.452.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_b/_ensure_full_commit"; in 0.101679 
secs 
[info] [<0.452.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_a/_local/f3b6cede324c784647b987424bb0aa7c";
 in 0.23693 secs 
[info] [<0.452.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/_local/f3b6cede324c784647b987424bb0aa7c";
 in 0.191251 secs 
[info] [<0.579.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc1?new_edits=false"; in 3.288234 
secs 
[info] [<0.569.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc5?new_edits=false"; in 3.306066 
secs 
[info] [<0.590.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc11?new_edits=false"; in 3.319111 
secs 
[info] [<0.572.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc4?new_edits=false"; in 3.343141 
secs 
[info] [<0.576.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc2?new_edits=false"; in 3.352749 
secs 
[info] [<0.584.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc10?new_edits=false"; in 3.480288 
secs 
[info] [<0.594.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/doc3?new_edits=false"; in 3.478705 
secs 
[info] [<0.452.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_b/_ensure_full_commit"; in 0.109566 
secs 
[info] [<0.628.0>] Made request post 
"http://127.0.0.1:27440/couch_test_rep_db_a/_ensure_full_commit"; in 0.109595 
secs 
[info] [<0.452.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_a/_local/f3b6cede324c784647b987424bb0aa7c";
 in 0.198072 secs 
[info] [<0.452.0>] Made request put 
"http://127.0.0.1:27440/couch_test_rep_db_b/_local/f3b6cede324c784647b987424bb0aa7c";
 in 0.199271 secs 
{code}

Looks quite like as expected. But why?

[~paul.joseph.davis] suggested me to track down the place where 
{{?RECVBUF_SIZE}} matters - that's actually socket base options 
[definition|https://github.com/apache/couchdb/blob/master/src/mochiweb/mochiweb_socket_server.erl#L168]
 - and wrap with timer {{gen_tcp:recv/3}} calls for mochiweb. The result was 
pretty interesting.

Patch for logging:

{code}
diff --git a/src/ibrowse/ibrowse_http_client.erl 
b/src/ibrowse/ibrowse_http_client.erl
index a1cf6eb..6d05f29 100644
--- a/src/ibrowse/ibrowse_http_client.erl
+++ b/src/ibrowse/ibrowse_http_client.erl
@@ -557,7 +557,11 @@ do_send(Req, #state{socket = Sock,
                     use_http_proxy = true,
                     proxy_tunnel_setup = Pts}) when Pts /= done ->  
gen_tcp:send(Sock, Req);
 do_send(Req, #state{socket = Sock, is_ssl = true})  ->  ssl:send(Sock, Req);
-do_send(Req, #state{socket = Sock, is_ssl = false}) ->  gen_tcp:send(Sock, 
Req).
+do_send(Req, #state{socket = Sock, is_ssl = false}) ->  
+  {Delay, Value} = timer:tc(gen_tcp, send, [Sock, Req]),
+  io:fwrite("Sent ~p bytes in ~p sec ~n", [size(iolist_to_binary(Req)), Delay 
/ 1000000]),
+  Value.
+
 
 %% @spec do_send_body(Sock::socket_descriptor(), Source::source_descriptor(), 
IsSSL::boolean()) -> ok | error()
 %% source_descriptor() = fun_arity_0           |

diff --git a/src/mochiweb/mochiweb_socket.erl b/src/mochiweb/mochiweb_socket.erl
index ad27204..8917f06 100644
--- a/src/mochiweb/mochiweb_socket.erl
+++ b/src/mochiweb/mochiweb_socket.erl
@@ -44,7 +44,9 @@ after_accept(_Socket) -> ok.
 recv({ssl, Socket}, Length, Timeout) ->
     ssl:recv(Socket, Length, Timeout);
 recv(Socket, Length, Timeout) ->
-    gen_tcp:recv(Socket, Length, Timeout).
+    {Time, Value} = timer:tc(gen_tcp, recv, [Socket, Length, Timeout]),
+    io:fwrite("  mochiweb_socket:recv / gen_tcp:recv(Socket, ~p, ~p) -- ~p sec 
~n", [Length, Timeout, Time / 1000000]),
+    Value.
 
 send({ssl, Socket}, Data) ->
     ssl:send(Socket, Data);
{code}


And here is the output:

- [Factor 1 (RECBUF == 8192)| 
https://www.friendpaste.com/7IH6C4z31Lu5ZvCpz3svZa]
- [Factor 2 (RECBUF == 16384)| 
https://www.friendpaste.com/7IH6C4z31Lu5ZvCpz3sug7]
- [Factor 4 (RECBUF == 32768)| 
https://www.friendpaste.com/7fmjcrJpF3BobxbzNpapEe] - blindly fast
- [Factor 1/2 (RECBUF == 4096)| 
https://www.friendpaste.com/7fmjcrJpF3BobxbzNpaniM] - recbuf == read chunk size

So, actually this problem could be easily solved by changing [socket 
options|http://docs.couchdb.org/en/latest/config/http.html#httpd/socket_options]
 in config file with adding {{\{recbuf,32768\}}} value to the list (or by using 
one from example without patching anything.

But this looks as workaround, isn't so? The question why so is remains opened.

> 04-replication-large-atts.t times out
> -------------------------------------
>
>                 Key: COUCHDB-1986
>                 URL: https://issues.apache.org/jira/browse/COUCHDB-1986
>             Project: CouchDB
>          Issue Type: Bug
>          Components: Replication
>    Affects Versions: 1.5.0
>            Reporter: Jan Lehnardt
>
> 04-replication-large-atts.t gets stuck around 558, sometimes a little earlier 
> or later, but it times out eventually, regardless of the timeout. I tried 
> doubling and such.



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

Reply via email to