Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

hackney slow on reading chunked reply of ~20mb #690

Open
nateless opened this issue Jun 25, 2021 · 1 comment
Open

hackney slow on reading chunked reply of ~20mb #690

nateless opened this issue Jun 25, 2021 · 1 comment

Comments

@nateless
Copy link

Hello,

We've been thinking its Tesla's problem (elixir-tesla/tesla#471) but after profiling we get that reading the large body takes roughly 40 seconds.

Response headers:

<<< RESPONSE <<<
content-lenght:
content-type: application/json
etag: "123-1624560200-ba73c0"
date: Fri, 25 Jun 2021 17:20:10 GMT
transfer-encoding: chunked

profile:

io_lib_fread:fread_skip_white/1                  11057     0.00      2178  [      0.20]
io_lib_fread:fread_result/3                      11057     0.00      2182  [      0.20]
prim_inet:enc_time/1                             11057     0.00      2345  [      0.21]
io_lib_fread:fread/2                             11057     0.01      2447  [      0.22]
hackney_http:read_chunk/2                        11056     0.01      2623  [      0.24]
io_lib_fread:fread1/8                            11057     0.01      2632  [      0.24]
prim_inet:recv/3                                 11056     0.01      2656  [      0.24]
hackney_http:'-fun.te_chunked/2-'/2              11057     0.01      2660  [      0.24]
io_lib_fread:fread_field/3                       11057     0.01      3053  [      0.28]
io_lib_fread:fread_field/1                       11057     0.01      3697  [      0.33]
io_lib:fread/2                                   11057     0.01      3770  [      0.34]
erlang:list_to_integer/2                         11065     0.01      4087  [      0.37]
inet_tcp:recv/3                                  11056     0.01      4200  [      0.38]
io_lib_fread:fread_field/4                       22114     0.01      4220  [      0.19]
erlang:port_get_data/1                           11059     0.01      4906  [      0.44]
inet_db:lookup_socket/1                          11059     0.01      4910  [      0.44]
lists:reverse/2                                  22121     0.01      5107  [      0.23]
hackney_response:stream_body1/2                  11057     0.01      5242  [      0.47]
gen:do_call/4                                        5     0.01      5411  [   1082.20]
hackney_tcp:recv/3                               11056     0.01      5507  [      0.50]
prim_inet:ctl_cmd/3                              11063     0.01      5975  [      0.54]
hackney_response:stream_body_recv/2              11055     0.01      5994  [      0.54]
erlang:port_control/3                            11063     0.01      6007  [      0.54]
hackney_response:recv/1                          11056     0.01      6048  [      0.55]
hackney_response:stream_body/2                   11055     0.01      6424  [      0.58]
io_lib_fread:fread1/7                            11057     0.01      6915  [      0.63]
prim_inet:recv0/3                                11056     0.02      7441  [      0.67]
hackney_response:read_body/3                         2     0.02      7485  [   3742.50]
hackney_http:te_chunked/2                        11057     0.02      7831  [      0.71]
hackney_http:parse_body/1                        11058     0.02      7901  [      0.71]
erlang:send/2                                        2     0.02      8016  [   4008.00]
prim_inet:async_recv/3                           11056     0.02      8423  [      0.76]
hackney_http:transfer_decode/2                   11057     0.02      8967  [      0.81]
io_lib_fread:fread/4                             22114     0.02      9052  [      0.41]
hackney_http:read_size/1                         11057     0.02      9683  [      0.88]
gen_tcp:recv/3                                   11056     0.02      9914  [      0.90]
lists:reverse/1                                  33187     0.02     10943  [      0.33]
io_lib_fread:fread_unsigned/7                    11057     0.03     13152  [      1.19]
io_lib_fread:fread_digits/4                      77394     0.03     13471  [      0.17]
hackney_http:read_size/3                         77394     0.26    123753  [      1.60]
erts_internal:port_control/3                     11063     0.27    129846  [     11.74]
erlang:setelement/3                              44314    11.24   5414710  [    122.19]
hackney_http:execute/2                           11067    87.74  42250379  [   3817.69]
----------------------------------------------  ------  -------  --------  [----------]
Total:                                          665854  100.00%  48154095  [     72.32]
"total = 100.02"
@Polexy
Copy link
Contributor

Polexy commented Nov 21, 2022

i have also reproduced, execution time is increased with chunk size

    N = 100,
    Start = erlang:system_time(microsecond),
    [begin
         {ok, _Code, _Headers, Ref} = hackney:request(get, Url, [], [], []),
         hackney:body(Ref)
    end
        || _X <- lists:seq(1, N)],
    Diff = erlang:system_time(microsecond) - Start,
    io:format("~p requests, total time: ~ps~n",[N, Diff/1000000]).
without chunks, Total size: 1301.7705078125KB
100 requests, total time: 0.649146s

Total size: 1301.7705078125KB, chunk size: 1024, chunks: 1302
100 requests, total time: 0.461806s

Total size: 1301.7705078125KB, chunk size: 10240, chunks: 131
100 requests, total time: 0.467853s

Total size: 1301.7705078125KB, chunk size: 102400, chunks: 14
100 requests, total time: 0.623883s

Total size: 1301.7705078125KB, chunk size: 1024000, chunks: 2
100 requests, total time: 9.556485s
---

Total size: 13096.701171875KB, chunk size: 1024000, chunks: 14
100 requests, total time: 53.445918s
vs
without chunks, Total size: 13096.701171875KB
100 requests, total time: 6.320183s


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants