Performance Optimization
Last updated
Last updated
This document introduces features to improve Alluxio performance for specific scenarios.
If the current file is being read sequentially, the Alluxio client will prefetch a range of data after the current read position and start to cache this data on the client. When the current read reaches the cached data, the Alluxio client will return the cached data instead of sending an RPC to the worker.
The prefetch window is self-adjusting. If the reads always starts at the end of last read position, the prefetch window will increase. If the reads are not continuous, the prefetch window will decrease. In the case that the reads are completely random reads, the prefetch window will eventually be reduced to 0.
Async prefetch caches data in client direct memory. Performance can be improved by increasing the direct memory assigned to the jvm process.
The client async prefetch is always enabled. The following parameters allow the user to tune the feature.
Configuration item | Recommended value | Description |
---|---|---|
Users may have different situations that require different async prefetch parameters, such as for cold reads vs cache filter reads. Cold reads usually require more concurrency to maximize the network bandwidth and achieve the best performance. Alluxio has a secondary async prefetch pool dedicated for alternative configurations, labeled as the slow thread pool. To enable and configure this secondary pool, set the following configuration:
Configuration item | Recommended value | Description |
---|---|---|
Large file preload is an optimization for the cold read of large files. If the feature is enabled, Alluxio will load the whole file concurrently into Alluxio workers as the file is read initially by the client. When running the FIO benchmark for a single 100GB file stored on S3, Alluxio's cold read performance with this feature achieves a comparable read performance as a fully cached hot read.
Deduplication is handled on both the client and worker side to avoid excessive RPC calls and redundant traffic to the UFS. Note that since Alluxio always fully loads the file, this feature can cause read amplification if the application does not need to read the whole file.
Configuration item | Recommended value | Description |
---|---|---|
alluxio.user.position.reader.streaming.async.prefetch.thread
64
The overall async prefetch concurrency
alluxio.user.position.reader.streaming.async.prefetch.part.length
4MB
The size of the prefetch unit
alluxio.user.position.reader.streaming.async.prefetch.max.part.number
8
The maximum number of units a single opened file can have. For example, if the prefetch unit size is 4MB and the max number of unit is 8, Alluxio will fetch at most 32MB data ahead for an opened file.
alluxio.user.position.reader.streaming.async.prefetch.file.length.threshold
4MB
If the file size is less than the specified threshold, Alluxio will max out the prefetch window immediately instead of starting with a small window. This configuration is used to improve small file read performance.
alluxio.user.position.reader.streaming.async.prefetch.use.slow.thread.pool
true
Set to true to enable the slow pool
alluxio.user.position.reader.streaming.async.prefetch.use.slow.thread.pool.for.cold.read
true
If set to true, the slow pool will be used for cold read as well. Otherwise, the slow pool will only be used cache filter read.
alluxio.user.position.reader.streaming.slow.async.prefetch.thread
256
The overall async prefetch concurrency for the slow pool
alluxio.user.position.reader.streaming.slow.async.prefetch.part.length
1MB
The size of the prefetch unit used by the slow pool
alluxio.user.position.reader.streaming.slow.async.prefetch.max.part.number
64
The maximum number of units a single opened file can have for the slow pool
alluxio.user.position.reader.preload.data.enabled
true
Set to true to enable large file preloading
alluxio.user.position.reader.preload.data.file.size.threshold.min
1GB
The minimum file size to trigger the async preload
alluxio.user.position.reader.preload.data.file.size.threshold.max
200GB
The maximum file size to trigger the async preload. This is useful to avoid loading extremely large files that would completely fill up the page store capacity and trigger cache eviction.
alluxio.worker.preload.data.thread.pool.size
64
The number of concurrent jobs on the worker to load the data of the file into UFS in parallel. Each job loads a page into Alluxio. For example, if the page size is 4MB and this config is set to 64, the worker will concurrently load 256M per iteration.