[ 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)