summaryrefslogtreecommitdiff
path: root/src/pmdas/linux_xfs/proc_fs_xfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pmdas/linux_xfs/proc_fs_xfs.c')
-rw-r--r--src/pmdas/linux_xfs/proc_fs_xfs.c278
1 files changed, 278 insertions, 0 deletions
diff --git a/src/pmdas/linux_xfs/proc_fs_xfs.c b/src/pmdas/linux_xfs/proc_fs_xfs.c
new file mode 100644
index 0000000..6ee83d4
--- /dev/null
+++ b/src/pmdas/linux_xfs/proc_fs_xfs.c
@@ -0,0 +1,278 @@
+/*
+ * Linux /proc/fs/xfs metrics cluster
+ *
+ * Copyright (c) 2014 Red Hat.
+ * Copyright (c) 2010 Aconex. All Rights Reserved.
+ * Copyright (c) 2000,2004 Silicon Graphics, Inc. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+#include "pmapi.h"
+#include "proc_fs_xfs.h"
+
+int
+refresh_proc_fs_xfs(proc_fs_xfs_t *proc_fs_xfs)
+{
+ char buf[4096];
+ FILE *fp;
+
+ memset(proc_fs_xfs, 0, sizeof(proc_fs_xfs_t));
+
+ if ((fp = xfs_statsfile("/proc/fs/xfs/stat", "r")) == NULL)
+ proc_fs_xfs->errcode = -oserror();
+ else {
+ proc_fs_xfs->errcode = 0;
+ while (fgets(buf, sizeof(buf), fp) != NULL) {
+ if (strncmp(buf, "extent_alloc ", 13) == 0)
+ sscanf(buf, "extent_alloc %u %u %u %u",
+ &proc_fs_xfs->xs_allocx,
+ &proc_fs_xfs->xs_allocb,
+ &proc_fs_xfs->xs_freex,
+ &proc_fs_xfs->xs_freeb);
+ else
+ if (strncmp(buf, "abt ", 4) == 0)
+ sscanf(buf, "abt %u %u %u %u",
+ &proc_fs_xfs->xs_abt_lookup,
+ &proc_fs_xfs->xs_abt_compare,
+ &proc_fs_xfs->xs_abt_insrec,
+ &proc_fs_xfs->xs_abt_delrec);
+ else
+ if (strncmp(buf, "blk_map ", 8) == 0)
+ sscanf(buf, "blk_map %u %u %u %u %u %u %u",
+ &proc_fs_xfs->xs_blk_mapr,
+ &proc_fs_xfs->xs_blk_mapw,
+ &proc_fs_xfs->xs_blk_unmap,
+ &proc_fs_xfs->xs_add_exlist,
+ &proc_fs_xfs->xs_del_exlist,
+ &proc_fs_xfs->xs_look_exlist,
+ &proc_fs_xfs->xs_cmp_exlist);
+ else
+ if (strncmp(buf, "bmbt ", 5) == 0)
+ sscanf(buf, "bmbt %u %u %u %u",
+ &proc_fs_xfs->xs_bmbt_lookup,
+ &proc_fs_xfs->xs_bmbt_compare,
+ &proc_fs_xfs->xs_bmbt_insrec,
+ &proc_fs_xfs->xs_bmbt_delrec);
+ else
+ if (strncmp(buf, "dir ", 4) == 0)
+ sscanf(buf, "dir %u %u %u %u",
+ &proc_fs_xfs->xs_dir_lookup,
+ &proc_fs_xfs->xs_dir_create,
+ &proc_fs_xfs->xs_dir_remove,
+ &proc_fs_xfs->xs_dir_getdents);
+ else
+ if (strncmp(buf, "trans ", 6) == 0)
+ sscanf(buf, "trans %u %u %u",
+ &proc_fs_xfs->xs_trans_sync,
+ &proc_fs_xfs->xs_trans_async,
+ &proc_fs_xfs->xs_trans_empty);
+ else
+ if (strncmp(buf, "ig ", 3) == 0)
+ sscanf(buf, "ig %u %u %u %u %u %u %u",
+ &proc_fs_xfs->xs_ig_attempts,
+ &proc_fs_xfs->xs_ig_found,
+ &proc_fs_xfs->xs_ig_frecycle,
+ &proc_fs_xfs->xs_ig_missed,
+ &proc_fs_xfs->xs_ig_dup,
+ &proc_fs_xfs->xs_ig_reclaims,
+ &proc_fs_xfs->xs_ig_attrchg);
+ else
+ if (strncmp(buf, "log ", 4) == 0) {
+ sscanf(buf, "log %u %u %u %u %u",
+ &proc_fs_xfs->xs_log_writes,
+ &proc_fs_xfs->xs_log_blocks,
+ &proc_fs_xfs->xs_log_noiclogs,
+ &proc_fs_xfs->xs_log_force,
+ &proc_fs_xfs->xs_log_force_sleep);
+ }
+ else
+ if (strncmp(buf, "push_ail ", 9) == 0)
+ sscanf(buf, "push_ail %u %u %u %u %u %u %u %u %u %u",
+ &proc_fs_xfs->xs_try_logspace,
+ &proc_fs_xfs->xs_sleep_logspace,
+ &proc_fs_xfs->xs_push_ail,
+ &proc_fs_xfs->xs_push_ail_success,
+ &proc_fs_xfs->xs_push_ail_pushbuf,
+ &proc_fs_xfs->xs_push_ail_pinned,
+ &proc_fs_xfs->xs_push_ail_locked,
+ &proc_fs_xfs->xs_push_ail_flushing,
+ &proc_fs_xfs->xs_push_ail_restarts,
+ &proc_fs_xfs->xs_push_ail_flush);
+ else
+ if (strncmp(buf, "xstrat ", 7) == 0)
+ sscanf(buf, "xstrat %u %u",
+ &proc_fs_xfs->xs_xstrat_quick,
+ &proc_fs_xfs->xs_xstrat_split);
+ else
+ if (strncmp(buf, "rw ", 3) == 0)
+ sscanf(buf, "rw %u %u",
+ &proc_fs_xfs->xs_write_calls,
+ &proc_fs_xfs->xs_read_calls);
+ else
+ if (strncmp(buf, "attr ", 5) == 0)
+ sscanf(buf, "attr %u %u %u %u",
+ &proc_fs_xfs->xs_attr_get,
+ &proc_fs_xfs->xs_attr_set,
+ &proc_fs_xfs->xs_attr_remove,
+ &proc_fs_xfs->xs_attr_list);
+ else
+ if (strncmp(buf, "qm ", 3) == 0)
+ sscanf(buf, "qm %u %u %u %u %u %u %u %u",
+ &proc_fs_xfs->xs_qm_dqreclaims,
+ &proc_fs_xfs->xs_qm_dqreclaim_misses,
+ &proc_fs_xfs->xs_qm_dquot_dups,
+ &proc_fs_xfs->xs_qm_dqcachemisses,
+ &proc_fs_xfs->xs_qm_dqcachehits,
+ &proc_fs_xfs->xs_qm_dqwants,
+ &proc_fs_xfs->xs_qm_dqshake_reclaims,
+ &proc_fs_xfs->xs_qm_dqinact_reclaims);
+ else
+ if (strncmp(buf, "icluster ", 9) == 0)
+ sscanf(buf, "icluster %u %u %u",
+ &proc_fs_xfs->xs_iflush_count,
+ &proc_fs_xfs->xs_icluster_flushcnt,
+ &proc_fs_xfs->xs_icluster_flushinode);
+ else
+ if (strncmp(buf, "buf ", 4) == 0) {
+ sscanf(buf, "buf %u %u %u %u %u %u %u %u %u",
+ &proc_fs_xfs->xs_buf_get,
+ &proc_fs_xfs->xs_buf_create,
+ &proc_fs_xfs->xs_buf_get_locked,
+ &proc_fs_xfs->xs_buf_get_locked_waited,
+ &proc_fs_xfs->xs_buf_busy_locked,
+ &proc_fs_xfs->xs_buf_miss_locked,
+ &proc_fs_xfs->xs_buf_page_retries,
+ &proc_fs_xfs->xs_buf_page_found,
+ &proc_fs_xfs->xs_buf_get_read);
+ } else
+ if (strncmp(buf, "vnodes ", 7) == 0) {
+ sscanf(buf, "vnodes %u %u %u %u %u %u %u %u",
+ &proc_fs_xfs->vnodes.vn_active,
+ &proc_fs_xfs->vnodes.vn_alloc,
+ &proc_fs_xfs->vnodes.vn_get,
+ &proc_fs_xfs->vnodes.vn_hold,
+ &proc_fs_xfs->vnodes.vn_rele,
+ &proc_fs_xfs->vnodes.vn_reclaim,
+ &proc_fs_xfs->vnodes.vn_remove,
+ &proc_fs_xfs->vnodes.vn_free);
+ } else
+ if (strncmp(buf, "abtb2 ", 6) == 0) {
+ sscanf(buf, "abtb2 %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u",
+ &proc_fs_xfs->xs_abtb_2_lookup,
+ &proc_fs_xfs->xs_abtb_2_compare,
+ &proc_fs_xfs->xs_abtb_2_insrec,
+ &proc_fs_xfs->xs_abtb_2_delrec,
+ &proc_fs_xfs->xs_abtb_2_newroot,
+ &proc_fs_xfs->xs_abtb_2_killroot,
+ &proc_fs_xfs->xs_abtb_2_increment,
+ &proc_fs_xfs->xs_abtb_2_decrement,
+ &proc_fs_xfs->xs_abtb_2_lshift,
+ &proc_fs_xfs->xs_abtb_2_rshift,
+ &proc_fs_xfs->xs_abtb_2_split,
+ &proc_fs_xfs->xs_abtb_2_join,
+ &proc_fs_xfs->xs_abtb_2_alloc,
+ &proc_fs_xfs->xs_abtb_2_free,
+ &proc_fs_xfs->xs_abtb_2_moves);
+ } else
+ if (strncmp(buf, "abtc2 ", 6) == 0) {
+ sscanf(buf, "abtc2 %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u",
+ &proc_fs_xfs->xs_abtc_2_lookup,
+ &proc_fs_xfs->xs_abtc_2_compare,
+ &proc_fs_xfs->xs_abtc_2_insrec,
+ &proc_fs_xfs->xs_abtc_2_delrec,
+ &proc_fs_xfs->xs_abtc_2_newroot,
+ &proc_fs_xfs->xs_abtc_2_killroot,
+ &proc_fs_xfs->xs_abtc_2_increment,
+ &proc_fs_xfs->xs_abtc_2_decrement,
+ &proc_fs_xfs->xs_abtc_2_lshift,
+ &proc_fs_xfs->xs_abtc_2_rshift,
+ &proc_fs_xfs->xs_abtc_2_split,
+ &proc_fs_xfs->xs_abtc_2_join,
+ &proc_fs_xfs->xs_abtc_2_alloc,
+ &proc_fs_xfs->xs_abtc_2_free,
+ &proc_fs_xfs->xs_abtc_2_moves);
+ } else
+ if (strncmp(buf, "bmbt2 ", 6) == 0) {
+ sscanf(buf, "bmbt2 %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u",
+ &proc_fs_xfs->xs_bmbt_2_lookup,
+ &proc_fs_xfs->xs_bmbt_2_compare,
+ &proc_fs_xfs->xs_bmbt_2_insrec,
+ &proc_fs_xfs->xs_bmbt_2_delrec,
+ &proc_fs_xfs->xs_bmbt_2_newroot,
+ &proc_fs_xfs->xs_bmbt_2_killroot,
+ &proc_fs_xfs->xs_bmbt_2_increment,
+ &proc_fs_xfs->xs_bmbt_2_decrement,
+ &proc_fs_xfs->xs_bmbt_2_lshift,
+ &proc_fs_xfs->xs_bmbt_2_rshift,
+ &proc_fs_xfs->xs_bmbt_2_split,
+ &proc_fs_xfs->xs_bmbt_2_join,
+ &proc_fs_xfs->xs_bmbt_2_alloc,
+ &proc_fs_xfs->xs_bmbt_2_free,
+ &proc_fs_xfs->xs_bmbt_2_moves);
+ } else
+ if (strncmp(buf, "ibt2 ", 5) == 0) {
+ sscanf(buf, "ibt2 %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u",
+ &proc_fs_xfs->xs_ibt_2_lookup,
+ &proc_fs_xfs->xs_ibt_2_compare,
+ &proc_fs_xfs->xs_ibt_2_insrec,
+ &proc_fs_xfs->xs_ibt_2_delrec,
+ &proc_fs_xfs->xs_ibt_2_newroot,
+ &proc_fs_xfs->xs_ibt_2_killroot,
+ &proc_fs_xfs->xs_ibt_2_increment,
+ &proc_fs_xfs->xs_ibt_2_decrement,
+ &proc_fs_xfs->xs_ibt_2_lshift,
+ &proc_fs_xfs->xs_ibt_2_rshift,
+ &proc_fs_xfs->xs_ibt_2_split,
+ &proc_fs_xfs->xs_ibt_2_join,
+ &proc_fs_xfs->xs_ibt_2_alloc,
+ &proc_fs_xfs->xs_ibt_2_free,
+ &proc_fs_xfs->xs_ibt_2_moves);
+ } else
+ if (strncmp(buf, "xpc", 3) == 0)
+ sscanf(buf, "xpc %llu %llu %llu",
+ (unsigned long long *)&proc_fs_xfs->xpc.xs_xstrat_bytes,
+ (unsigned long long *)&proc_fs_xfs->xpc.xs_write_bytes,
+ (unsigned long long *)&proc_fs_xfs->xpc.xs_read_bytes);
+ }
+ fclose(fp);
+
+ if (proc_fs_xfs->xs_log_writes)
+ proc_fs_xfs->xs_log_write_ratio =
+ proc_fs_xfs->xs_log_blocks / proc_fs_xfs->xs_log_writes;
+ /*
+ * Bug #824382. xs_log_blocks is counted in units
+ * of 512 bytes/block, but PCP exports it as Kbytes.
+ */
+ proc_fs_xfs->xs_log_blocks >>= 1;
+
+ fp = xfs_statsfile("/proc/fs/xfs/xqmstat", "r");
+ if (fp != (FILE *)NULL) {
+ if (fgets(buf, sizeof(buf), fp) != NULL) {
+ if (strncmp(buf, "qm", 2) == 0)
+ sscanf(buf, "qm %u %u %u %u %u %u %u %u",
+ &proc_fs_xfs->xs_qm_dqreclaims,
+ &proc_fs_xfs->xs_qm_dqreclaim_misses,
+ &proc_fs_xfs->xs_qm_dquot_dups,
+ &proc_fs_xfs->xs_qm_dqcachemisses,
+ &proc_fs_xfs->xs_qm_dqcachehits,
+ &proc_fs_xfs->xs_qm_dqwants,
+ &proc_fs_xfs->xs_qm_dqshake_reclaims,
+ &proc_fs_xfs->xs_qm_dqinact_reclaims);
+ }
+ fclose(fp);
+ }
+ }
+
+ if (proc_fs_xfs->errcode == 0)
+ return 0;
+ return -1;
+}