mirror of
https://github.com/apache/impala.git
synced 2025-12-19 18:12:08 -05:00
IMPALA-13478: Sync tuple cache files to disk asynchronously
When a tuple cache entry is first being written, we want to sync the contents to disk. Currently, that happens on the fast path and delays the query results, sometimes significantly. This moves the Sync() call off of the fast path by passing the work to a thread pool. The threads in the pool open the file, sync it to disk, then close the file. If anything goes wrong, the cache entry is evicted. The tuple cache can generate writes very quickly, so this needs a backpressure mechanism to avoid overwhelming the disk. In particular, it needs to avoid accumulating dirty buffers to the point that the OS throttles new writes, delaying the query fast path. This implements a limit on outstanding writes (i.e. writes that have not been flushed to disk). To enforce it, writers now call UpdateWriteSize() to reserve space before writing. UpdateWriteSize() can fail if it hits the limit on outstanding writes or if this particular cache entry has hit the maximum size. When it fails, the writer should abort writing the cache entry. Since UpdateWriteSize() is updating the charge in the cache, the outstanding writes are being counted against the capacity, triggering evictions. This improves the tuple cache's adherence to the capacity limit. The outstanding writes limits is configured via the tuple_cache_outstanding_write_limit startup flag, which is either a specific size string (e.g. 1GB) or a percentage of the process memory limit. To avoid updating the cache charge very frequently, this has an update chunk size specified by tuple_cache_outstanding_write_chunk_bytes. This adds counters at the daemon level: - outstanding write bytes - number of writes halted due to backpressure - number of sync calls that fail (due to IO errors) - number of sync calls dropped due to queue backpressure The runtime profile adds a NumTupleCacheBackpressureHalted counter that is set when a write hits the outstanding write limit. This has a startup option to add randomness to the tuple cache keys to make it easy to test a scenario with no cache hits. Testing: - Added unit tests to tuple-cache-mgr-test - Testing with TPC-DS on a cluster with fast NVME SSDs showed a significant improvement in the first-run times due to the asynchronous syncs. - Testing with TPC-H on a system with a slow disk and zero cache hits showed improved behavior with the backpressure Change-Id: I646bb56300656d8b8ac613cb8fe2f85180b386d3 Reviewed-on: http://gerrit.cloudera.org:8080/22215 Reviewed-by: Joe McDonnell <joemcdonnell@cloudera.com> Reviewed-by: Michael Smith <michael.smith@cloudera.com> Tested-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com>
This commit is contained in:
@@ -494,7 +494,13 @@ error_codes = (
|
||||
|
||||
("TUPLE_CACHE_INCONSISTENCY", 160, "Inconsistent tuple cache found: $0."),
|
||||
|
||||
("OAUTH_VERIFY_FAILED", 161, "Error verifying OAuth Token: $0.")
|
||||
("OAUTH_VERIFY_FAILED", 161, "Error verifying OAuth Token: $0."),
|
||||
|
||||
("TUPLE_CACHE_ENTRY_SIZE_LIMIT_EXCEEDED", 162, "Exceeded the maximum size for a tuple "
|
||||
"cache entry ($0 bytes)"),
|
||||
|
||||
("TUPLE_CACHE_OUTSTANDING_WRITE_LIMIT_EXCEEDED", 163, "Outstanding tuple cache writes "
|
||||
"exceeded the limit ($0 bytes)")
|
||||
)
|
||||
|
||||
import sys
|
||||
|
||||
@@ -119,6 +119,46 @@
|
||||
"kind": "COUNTER",
|
||||
"key": "impala.tuple-cache.halted"
|
||||
},
|
||||
{
|
||||
"description": "The total number of Tuple Cache that halted writing due to backpressure",
|
||||
"contexts": [
|
||||
"IMPALAD"
|
||||
],
|
||||
"label": "Tuple Cache Halted Writing Due to Backpressure",
|
||||
"units": "UNIT",
|
||||
"kind": "COUNTER",
|
||||
"key": "impala.tuple-cache.backpressure-halted"
|
||||
},
|
||||
{
|
||||
"description": "The total number of Tuple Cache syncs to disk that failed",
|
||||
"contexts": [
|
||||
"IMPALAD"
|
||||
],
|
||||
"label": "Tuple Cache Failed Syncs",
|
||||
"units": "UNIT",
|
||||
"kind": "COUNTER",
|
||||
"key": "impala.tuple-cache.failed-syncs"
|
||||
},
|
||||
{
|
||||
"description": "The total number of Tuple Cache syncs to disk dropped due to backpressure",
|
||||
"contexts": [
|
||||
"IMPALAD"
|
||||
],
|
||||
"label": "Tuple Cache Dropped Syncs",
|
||||
"units": "UNIT",
|
||||
"kind": "COUNTER",
|
||||
"key": "impala.tuple-cache.dropped-syncs"
|
||||
},
|
||||
{
|
||||
"description": "The total outstanding bytes of Tuple Cache Writes",
|
||||
"contexts": [
|
||||
"IMPALAD"
|
||||
],
|
||||
"label": "Outstanding Tuple Cache Writes total bytes",
|
||||
"units": "BYTES",
|
||||
"kind": "GAUGE",
|
||||
"key": "impala.tuple-cache.outstanding-writes-bytes"
|
||||
},
|
||||
{
|
||||
"description": "The number of in-use Tuple Cache Entries",
|
||||
"contexts": [
|
||||
|
||||
Reference in New Issue
Block a user