mirror of
https://github.com/scylladb/scylladb.git
synced 2026-04-30 05:07:05 +00:00
data::cell targets 8KB as its maximum allocations size to avoid pressuring the allocator. This 8KB target is used for internal storage -- values small enough to be stored inside the cell itself -- as well for external storage. Externally stored values use 8KB fragment sizes. The problem is that only the size of data itself was considered when making the allocations. For example when allocating the fragments (chunks) for external storage, each fragment stored 8KB of data. But fragments have overhead, they have next and back pointers. This resulted in a 8KB + 2 * sizeof(void*) allocation. IMR uses the allocation strategy mechanism, which works with aligned allocations. As the seastar allocation only guarantees aligned allocations for power of two sizes, it ends up allocating a 16KB slot. This results in the mutation fragment using almost twice as much memory as would be required. This is a huge waste. This patch fixes the problem by considering the overhead of both internal and external storage ensuring allocations are 8KB or less. Fixes: #6043 Tests: unit(debug, dev, release) Signed-off-by: Botond Dénes <bdenes@scylladb.com> Message-Id: <20200910171359.1438029-1-bdenes@scylladb.com>
7.3 KiB
7.3 KiB