zstd: track allocator statistics
Note that this only tracks sizes as requested by the caller. Actual allocated space will almost always be bigger (e.g., rounded up to the next power of 2 or page size). Additionally the allocated buffer may be holding other areas hostage. Nonetheless, this is a starting point for tracking memory usage in zstd. Reviewed-by: Allan Jude <allan@klarasystems.com> Reviewed-by: Ryan Moeller <ryan@ixsystems.com> Reviewed-by: Kjeld Schouten <kjeld@schouten-lebbing.nl> Signed-off-by: Mateusz Guzik <mjguzik@gmail.com> Closes #11129
This commit is contained in:
parent
c6b0680d9b
commit
52f1ef3b2d
|
@ -75,9 +75,11 @@ typedef struct zfs_zstd_header {
|
||||||
* kstat helper macros
|
* kstat helper macros
|
||||||
*/
|
*/
|
||||||
#define ZSTDSTAT(stat) (zstd_stats.stat.value.ui64)
|
#define ZSTDSTAT(stat) (zstd_stats.stat.value.ui64)
|
||||||
#define ZSTDSTAT_INCR(stat, val) \
|
#define ZSTDSTAT_ADD(stat, val) \
|
||||||
atomic_add_64(&zstd_stats.stat.value.ui64, (val))
|
atomic_add_64(&zstd_stats.stat.value.ui64, (val))
|
||||||
#define ZSTDSTAT_BUMP(stat) ZSTDSTAT_INCR(stat, 1)
|
#define ZSTDSTAT_SUB(stat, val) \
|
||||||
|
atomic_sub_64(&zstd_stats.stat.value.ui64, (val))
|
||||||
|
#define ZSTDSTAT_BUMP(stat) ZSTDSTAT_ADD(stat, 1)
|
||||||
|
|
||||||
/* (de)init for user space / kernel emulation */
|
/* (de)init for user space / kernel emulation */
|
||||||
int zstd_init(void);
|
int zstd_init(void);
|
||||||
|
|
|
@ -62,6 +62,8 @@ typedef struct zstd_stats {
|
||||||
kstat_named_t zstd_stat_dec_header_inval;
|
kstat_named_t zstd_stat_dec_header_inval;
|
||||||
kstat_named_t zstd_stat_com_fail;
|
kstat_named_t zstd_stat_com_fail;
|
||||||
kstat_named_t zstd_stat_dec_fail;
|
kstat_named_t zstd_stat_dec_fail;
|
||||||
|
kstat_named_t zstd_stat_buffers;
|
||||||
|
kstat_named_t zstd_stat_size;
|
||||||
} zstd_stats_t;
|
} zstd_stats_t;
|
||||||
|
|
||||||
static zstd_stats_t zstd_stats = {
|
static zstd_stats_t zstd_stats = {
|
||||||
|
@ -74,6 +76,8 @@ static zstd_stats_t zstd_stats = {
|
||||||
{ "decompress_header_invalid", KSTAT_DATA_UINT64 },
|
{ "decompress_header_invalid", KSTAT_DATA_UINT64 },
|
||||||
{ "compress_failed", KSTAT_DATA_UINT64 },
|
{ "compress_failed", KSTAT_DATA_UINT64 },
|
||||||
{ "decompress_failed", KSTAT_DATA_UINT64 },
|
{ "decompress_failed", KSTAT_DATA_UINT64 },
|
||||||
|
{ "buffers", KSTAT_DATA_UINT64 },
|
||||||
|
{ "size", KSTAT_DATA_UINT64 },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Enums describing the allocator type specified by kmem_type in zstd_kmem */
|
/* Enums describing the allocator type specified by kmem_type in zstd_kmem */
|
||||||
|
@ -248,6 +252,8 @@ zstd_mempool_alloc(struct zstd_pool *zstd_mempool, size_t size)
|
||||||
/* Free memory if unused object older than 2 minutes */
|
/* Free memory if unused object older than 2 minutes */
|
||||||
if (pool->mem && gethrestime_sec() > pool->timeout) {
|
if (pool->mem && gethrestime_sec() > pool->timeout) {
|
||||||
vmem_free(pool->mem, pool->size);
|
vmem_free(pool->mem, pool->size);
|
||||||
|
ZSTDSTAT_SUB(zstd_stat_buffers, 1);
|
||||||
|
ZSTDSTAT_SUB(zstd_stat_size, pool->size);
|
||||||
pool->mem = NULL;
|
pool->mem = NULL;
|
||||||
pool->size = 0;
|
pool->size = 0;
|
||||||
pool->timeout = 0;
|
pool->timeout = 0;
|
||||||
|
@ -275,12 +281,13 @@ zstd_mempool_alloc(struct zstd_pool *zstd_mempool, size_t size)
|
||||||
/* Object is free, try to allocate new one */
|
/* Object is free, try to allocate new one */
|
||||||
if (!pool->mem) {
|
if (!pool->mem) {
|
||||||
mem = vmem_alloc(size, KM_SLEEP);
|
mem = vmem_alloc(size, KM_SLEEP);
|
||||||
pool->mem = mem;
|
if (mem) {
|
||||||
|
ZSTDSTAT_ADD(zstd_stat_buffers, 1);
|
||||||
if (pool->mem) {
|
ZSTDSTAT_ADD(zstd_stat_size, size);
|
||||||
|
pool->mem = mem;
|
||||||
|
pool->size = size;
|
||||||
/* Keep track for later release */
|
/* Keep track for later release */
|
||||||
mem->pool = pool;
|
mem->pool = pool;
|
||||||
pool->size = size;
|
|
||||||
mem->kmem_type = ZSTD_KMEM_POOL;
|
mem->kmem_type = ZSTD_KMEM_POOL;
|
||||||
mem->kmem_size = size;
|
mem->kmem_size = size;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue