]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Add KSTAT_TYPE_TXG type
authorBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 22 Oct 2012 23:57:27 +0000 (16:57 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 2 Nov 2012 22:17:40 +0000 (15:17 -0700)
Add a new kstat type for tracking useful statistics about a TXG.
The new KSTAT_TYPE_TXG type can be used to tracks the following
statistics per-txg.

  txg          - Unique txg number
  state        - State (O)pen/(Q)uiescing/(S)yncing/(C)ommitted
  birth;       - Creation time
  nread        - Bytes read
  nwritten;    - Bytes written
  reads        - IOPs read
  writes       - IOPs write
  open_time;   - Length in nanoseconds the txg was open
  quiesce_time - Length in nanoseconds the txg was quiescing
  sync_time;   - Length in nanoseconds the txg was syncing

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
include/sys/kstat.h
module/spl/spl-kstat.c

index 45386d49acb4e66deb287b2e28c0231da70bea09..06379f827e9e4433d9c230e9d52755496a92dc3d 100644 (file)
@@ -43,7 +43,8 @@
 #define KSTAT_TYPE_INTR         2       /* interrupt stats; ks_ndata == 1 */
 #define KSTAT_TYPE_IO           3       /* I/O stats; ks_ndata == 1 */
 #define KSTAT_TYPE_TIMER        4       /* event timer; ks_ndata >= 1 */
-#define KSTAT_NUM_TYPES         5
+#define KSTAT_TYPE_TXG          5       /* txg sync; ks_ndata >= 1 */
+#define KSTAT_NUM_TYPES         6
 
 #define KSTAT_DATA_CHAR         0
 #define KSTAT_DATA_INT32        1
@@ -156,6 +157,26 @@ typedef struct kstat_timer {
         hrtime_t     stop_time;            /* previous event stop time */
 } kstat_timer_t;
 
+typedef enum kstat_txg_state {
+        TXG_STATE_OPEN      = 1,
+        TXG_STATE_QUIESCING = 2,
+        TXG_STATE_SYNCING   = 3,
+        TXG_STATE_COMMITTED = 4,
+} kstat_txg_state_t;
+
+typedef struct kstat_txg {
+        u_longlong_t       txg;         /* txg id */
+        kstat_txg_state_t  state;       /* txg state */
+        hrtime_t           birth;       /* birth time stamp */
+        u_longlong_t       nread;       /* number of bytes read */
+        u_longlong_t       nwritten;    /* number of bytes written */
+        uint_t             reads;       /* number of read operations */
+        uint_t             writes;      /* number of write operations */
+        hrtime_t           open_time;   /* open time */
+        hrtime_t           quiesce_time;/* quiesce time */
+        hrtime_t           sync_time;   /* sync time */
+} kstat_txg_t;
+
 int spl_kstat_init(void);
 void spl_kstat_fini(void);
 
index 164a8436d0c93ca6f472e7890e30610b2890b8c2..ea2d67dd41a908633b941ab704ee4a76ba41112d 100644 (file)
@@ -78,6 +78,14 @@ kstat_seq_show_headers(struct seq_file *f)
                                    "name", "events", "elapsed",
                                    "min", "max", "start", "stop");
                         break;
+                case KSTAT_TYPE_TXG:
+                        seq_printf(f,
+                                   "%-8s %-5s %-13s %-12s %-12s %-8s %-8s "
+                                   "%-12s %-12s %-12s\n",
+                                   "txg", "state", "birth",
+                                   "nread", "nwritten", "reads", "writes",
+                                   "otime", "qtime", "stime");
+                        break;
                 default:
                         PANIC("Undefined kstat type %d\n", ksp->ks_type);
         }
@@ -190,6 +198,27 @@ kstat_seq_show_timer(struct seq_file *f, kstat_timer_t *ktp)
         return 0;
 }
 
+static int
+kstat_seq_show_txg(struct seq_file *f, kstat_txg_t *ktp)
+{
+       char state;
+
+       switch (ktp->state) {
+               case TXG_STATE_OPEN:            state = 'O';    break;
+               case TXG_STATE_QUIESCING:       state = 'Q';    break;
+               case TXG_STATE_SYNCING:         state = 'S';    break;
+               case TXG_STATE_COMMITTED:       state = 'C';    break;
+               default:                        state = '?';    break;
+       }
+
+        seq_printf(f,
+                   "%-8llu %-5c %-13llu %-12llu %-12llu %-8u %-8u "
+                   "%12lld %12lld %12lld\n", ktp->txg, state, ktp->birth,
+                    ktp->nread, ktp->nwritten, ktp->reads, ktp->writes,
+                    ktp->open_time, ktp->quiesce_time, ktp->sync_time);
+       return 0;
+}
+
 static int
 kstat_seq_show(struct seq_file *f, void *p)
 {
@@ -216,6 +245,9 @@ kstat_seq_show(struct seq_file *f, void *p)
                 case KSTAT_TYPE_TIMER:
                         rc = kstat_seq_show_timer(f, (kstat_timer_t *)p);
                         break;
+                case KSTAT_TYPE_TXG:
+                        rc = kstat_seq_show_txg(f, (kstat_txg_t *)p);
+                        break;
                 default:
                         PANIC("Undefined kstat type %d\n", ksp->ks_type);
         }
@@ -252,6 +284,9 @@ kstat_seq_data_addr(kstat_t *ksp, loff_t n)
                 case KSTAT_TYPE_TIMER:
                         rc = ksp->ks_data + n * sizeof(kstat_timer_t);
                         break;
+                case KSTAT_TYPE_TXG:
+                        rc = ksp->ks_data + n * sizeof(kstat_txg_t);
+                        break;
                 default:
                         PANIC("Undefined kstat type %d\n", ksp->ks_type);
         }
@@ -396,6 +431,10 @@ __kstat_create(const char *ks_module, int ks_instance, const char *ks_name,
                        ksp->ks_ndata = ks_ndata;
                         ksp->ks_data_size = ks_ndata * sizeof(kstat_timer_t);
                         break;
+               case KSTAT_TYPE_TXG:
+                       ksp->ks_ndata = ks_ndata;
+                       ksp->ks_data_size = ks_ndata * sizeof(kstat_timer_t);
+                       break;
                 default:
                         PANIC("Undefined kstat type %d\n", ksp->ks_type);
         }