Author: mjg
Date: Sat Oct 31 19:07:32 2020
New Revision: 367229
URL: https://svnweb.freebsd.org/changeset/base/367229

Log:
  zfs: zstd: track allocator statistics
  
  This applies:
  commit c4ede65bdfca11b532403620bbf0d6e33f0c1c1d
  Author: Mateusz Guzik <mjgu...@gmail.com>
  Date:   Fri Oct 30 23:26:10 2020 +0100
  
      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.
  
  from openzfs

Modified:
  head/sys/contrib/openzfs/include/sys/zstd/zstd.h
  head/sys/contrib/openzfs/module/zstd/zfs_zstd.c

Modified: head/sys/contrib/openzfs/include/sys/zstd/zstd.h
==============================================================================
--- head/sys/contrib/openzfs/include/sys/zstd/zstd.h    Sat Oct 31 18:42:03 
2020        (r367228)
+++ head/sys/contrib/openzfs/include/sys/zstd/zstd.h    Sat Oct 31 19:07:32 
2020        (r367229)
@@ -75,9 +75,11 @@ typedef struct zfs_zstd_header {
  * kstat helper macros
  */
 #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))
-#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 */
 int zstd_init(void);

Modified: head/sys/contrib/openzfs/module/zstd/zfs_zstd.c
==============================================================================
--- head/sys/contrib/openzfs/module/zstd/zfs_zstd.c     Sat Oct 31 18:42:03 
2020        (r367228)
+++ head/sys/contrib/openzfs/module/zstd/zfs_zstd.c     Sat Oct 31 19:07:32 
2020        (r367229)
@@ -62,6 +62,8 @@ typedef struct zstd_stats {
        kstat_named_t   zstd_stat_dec_header_inval;
        kstat_named_t   zstd_stat_com_fail;
        kstat_named_t   zstd_stat_dec_fail;
+       kstat_named_t   zstd_stat_buffers;
+       kstat_named_t   zstd_stat_size;
 } zstd_stats_t;
 
 static zstd_stats_t zstd_stats = {
@@ -74,6 +76,8 @@ static zstd_stats_t zstd_stats = {
        { "decompress_header_invalid",  KSTAT_DATA_UINT64 },
        { "compress_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 */
@@ -248,6 +252,8 @@ zstd_mempool_alloc(struct zstd_pool *zstd_mempool, siz
                        /* Free memory if unused object older than 2 minutes */
                        if (pool->mem && gethrestime_sec() > pool->timeout) {
                                vmem_free(pool->mem, pool->size);
+                               ZSTDSTAT_SUB(zstd_stat_buffers, 1);
+                               ZSTDSTAT_SUB(zstd_stat_size, pool->size);
                                pool->mem = NULL;
                                pool->size = 0;
                                pool->timeout = 0;
@@ -275,12 +281,13 @@ zstd_mempool_alloc(struct zstd_pool *zstd_mempool, siz
                        /* Object is free, try to allocate new one */
                        if (!pool->mem) {
                                mem = vmem_alloc(size, KM_SLEEP);
-                               pool->mem = mem;
-
-                               if (pool->mem) {
+                               if (mem) {
+                                       ZSTDSTAT_ADD(zstd_stat_buffers, 1);
+                                       ZSTDSTAT_ADD(zstd_stat_size, size);
+                                       pool->mem = mem;
+                                       pool->size = size;
                                        /* Keep track for later release */
                                        mem->pool = pool;
-                                       pool->size = size;
                                        mem->kmem_type = ZSTD_KMEM_POOL;
                                        mem->kmem_size = size;
                                }
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to