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

Mayur Srivastava commented on ARROW-8562:
-----------------------------------------

[~apitrou], [~lidavidm], I've created a PR for this work: 
[https://github.com/apache/arrow/pull/7022]

Please take a look when you get a chance.

 

Thanks,

Mayur

> [C++] IO: Parameterize I/O coalescing using S3 storage metrics
> --------------------------------------------------------------
>
>                 Key: ARROW-8562
>                 URL: https://issues.apache.org/jira/browse/ARROW-8562
>             Project: Apache Arrow
>          Issue Type: Improvement
>          Components: C++
>            Reporter: Mayur Srivastava
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> Related to https://issues.apache.org/jira/browse/ARROW-7995
> The adaptive I/O coalescing algorithm uses two parameters:
>  1. max_io_gap: Max I/O gap/hole size in bytes
>  2. ideal_request_size = Ideal I/O Request size in bytes
> These parameters can be derived from S3 metrics as described below:
> In an S3 compatible storage, there are two main metrics:
>  1. Seek-time or Time-To-First-Byte (TTFB) in seconds: call setup latency of 
> a new S3 request
>  2. Transfer Bandwidth (BW) for data in bytes/sec
> 1. Computing max_io_gap:
> max_io_gap = TTFB * BW
> This is also called Bandwidth-Delay-Product (BDP).
> Two byte ranges that have a gap can still be mapped to the same read if the 
> gap is less than the bandwidt-delay product [TTFB * TransferBandwidth], i.e. 
> if the Time-To-First-Byte (or call setup latency of a new S3 request) is 
> expected to be greater than just reading and discarding the extra bytes on an 
> existing HTTP request.
> 2. Computing ideal_request_size:
> We want to have high bandwidth utilization per S3 connections, i.e. transfer 
> large amounts of data to amortize the seek overhead.
>  But, we also want to leverage parallelism by slicing very large IO chunks. 
> We define two more config parameters with suggested default values to control 
> the slice size and seek to balance the two effects with the goal of 
> maximizing net data load performance.
> BW_util (ideal bandwidth utilization):
>  This means what fraction of per connection bandwidth should be utilized to 
> maximize net data load.
>  A good default value is 90% or 0.9.
> MAX_IDEAL_REQUEST_SIZE:
>  This means what is the maximum single request size (in bytes) to maximize 
> net data load.
>  A good default value is 64 MiB.
> The amount of data that needs to be transferred in a single S3 get_object 
> request to achieve effective bandwidth eff_BW = BW_util * BW is as follows:
>  eff_BW = ideal_request_size / (TTFB + ideal_request_size / BW)
> Substituting TTFB = max_io_gap / BW and eff_BW = BW_util * BW, we get the 
> following result:
>  ideal_request_size = max_io_gap * BW_util / (1 - BW_util)
> Applying the MAX_IDEAL_REQUEST_SIZE, we get the following:
>  ideal_request_size = min(MAX_IDEAL_REQUEST_SIZE, max_io_gap * BW_util / (1 - 
> BW_util))
> The proposal is to create a named constructor in the io::CacheOptions (PR: 
> [https://github.com/apache/arrow/pull/6744] created by [~lidavidm]) to 
> compute max_io_gap and ideal_request_size from TTFB and BW which will then be 
> passed to reader to configure the I/O coalescing.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to