* [Ocfs2-devel] [PATCH 1/2] ocfs2: Add OCFS2_FS_STATS config option
@ 2008-05-08 17:57 Sunil Mushran
2008-05-08 17:57 ` [Ocfs2-devel] [PATCH 2/2] ocfs2: Add cluster lock stats at the fs level Sunil Mushran
2008-05-13 0:42 ` [Ocfs2-devel] [PATCH 1/2] ocfs2: Add OCFS2_FS_STATS config option Mark Fasheh
0 siblings, 2 replies; 5+ messages in thread
From: Sunil Mushran @ 2008-05-08 17:57 UTC (permalink / raw)
To: ocfs2-devel
This patch adds the OCFS2_FS_STATS config option which will be
used to demarcate the statistics capturing code.
Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com>
---
fs/Kconfig | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/fs/Kconfig b/fs/Kconfig
index cf12c40..c264610 100644
--- a/fs/Kconfig
+++ b/fs/Kconfig
@@ -470,6 +470,14 @@ config OCFS2_FS_USERSPACE_CLUSTER
It is safe to say Y, as the clustering method is run-time
selectable.
+config OCFS2_FS_STATS
+ bool "OCFS2 statistics"
+ depends on OCFS2_FS
+ default y
+ help
+ This option allows some fs statistics to be captured. Enabling
+ this option may increase the memory consumption.
+
config OCFS2_DEBUG_MASKLOG
bool "OCFS2 logging support"
depends on OCFS2_FS
--
1.5.3.6
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Ocfs2-devel] [PATCH 2/2] ocfs2: Add cluster lock stats at the fs level
2008-05-08 17:57 [Ocfs2-devel] [PATCH 1/2] ocfs2: Add OCFS2_FS_STATS config option Sunil Mushran
@ 2008-05-08 17:57 ` Sunil Mushran
2008-05-13 0:42 ` Mark Fasheh
2008-05-13 0:42 ` [Ocfs2-devel] [PATCH 1/2] ocfs2: Add OCFS2_FS_STATS config option Mark Fasheh
1 sibling, 1 reply; 5+ messages in thread
From: Sunil Mushran @ 2008-05-08 17:57 UTC (permalink / raw)
To: ocfs2-devel
This patch adds code to track the number of times the fs takes
various cluster locks as well as the times associated with it.
Authored-by: Jan Kara <jack@suse.cz>
Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com>
---
fs/ocfs2/dlmglue.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++
fs/ocfs2/ocfs2.h | 12 ++++++
2 files changed, 108 insertions(+), 0 deletions(-)
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c
index 394d25a..9175c89 100644
--- a/fs/ocfs2/dlmglue.c
+++ b/fs/ocfs2/dlmglue.c
@@ -31,6 +31,7 @@
#include <linux/pagemap.h>
#include <linux/debugfs.h>
#include <linux/seq_file.h>
+#include <linux/time.h>
#define MLOG_MASK_PREFIX ML_DLM_GLUE
#include <cluster/masklog.h>
@@ -59,6 +60,9 @@ struct ocfs2_mask_waiter {
struct completion mw_complete;
unsigned long mw_mask;
unsigned long mw_goal;
+#ifdef CONFIG_OCFS2_FS_STATS
+ unsigned long long mw_lock_start;
+#endif
};
static struct ocfs2_super *ocfs2_get_dentry_osb(struct ocfs2_lock_res *lockres);
@@ -366,6 +370,66 @@ static void ocfs2_remove_lockres_tracking(struct ocfs2_lock_res *res)
spin_unlock(&ocfs2_dlm_tracking_lock);
}
+#ifdef CONFIG_OCFS2_FS_STATS
+static void ocfs2_init_lock_stats(struct ocfs2_lock_res *res)
+{
+ res->l_lock_num_prmode = 0;
+ res->l_lock_num_prmode_failed = 0;
+ res->l_lock_total_prmode = 0;
+ res->l_lock_max_prmode = 0;
+ res->l_lock_num_exmode = 0;
+ res->l_lock_num_exmode_failed = 0;
+ res->l_lock_total_exmode = 0;
+ res->l_lock_max_exmode = 0;
+ res->l_lock_refresh = 0;
+}
+
+static void ocfs2_update_lock_stats(struct ocfs2_lock_res *res, int level,
+ struct ocfs2_mask_waiter *mw, int ret)
+{
+ unsigned long long *num, *sum;
+ unsigned int *max, *failed;
+ struct timespec ts = current_kernel_time();
+ unsigned long long time = timespec_to_ns(&ts) - mw->mw_lock_start;
+
+ if (level == LKM_PRMODE) {
+ num = &res->l_lock_num_prmode;
+ sum = &res->l_lock_total_prmode;
+ max = &res->l_lock_max_prmode;
+ failed = &res->l_lock_num_prmode_failed;
+ } else if (level == LKM_EXMODE) {
+ num = &res->l_lock_num_exmode;
+ sum = &res->l_lock_total_exmode;
+ max = &res->l_lock_max_exmode;
+ failed = &res->l_lock_num_exmode_failed;
+ } else
+ return;
+
+ (*num)++;
+ (*sum) += time;
+ if (time > *max)
+ *max = time;
+ if (ret)
+ (*failed)++;
+}
+
+static inline void ocfs2_track_lock_refresh(struct ocfs2_lock_res *lockres)
+{
+ lockres->l_lock_refresh++;
+}
+
+static inline void ocfs2_init_start_time(struct ocfs2_mask_waiter *mw)
+{
+ struct timespec ts = current_kernel_time();
+ mw->mw_lock_start = timespec_to_ns(&ts);
+}
+#else
+# define ocfs2_init_lock_stats(a)
+# define ocfs2_update_lock_stats(a,b,c,d)
+# define ocfs2_track_lock_refresh(a)
+# define ocfs2_init_start_time(a)
+#endif
+
static void ocfs2_lock_res_init_common(struct ocfs2_super *osb,
struct ocfs2_lock_res *res,
enum ocfs2_lock_type type,
@@ -385,6 +449,8 @@ static void ocfs2_lock_res_init_common(struct ocfs2_super *osb,
res->l_flags = OCFS2_LOCK_INITIALIZED;
ocfs2_add_lockres_tracking(res, osb->osb_dlm_debug);
+
+ ocfs2_init_lock_stats(res);
}
void ocfs2_lock_res_init_once(struct ocfs2_lock_res *res)
@@ -1048,6 +1114,7 @@ static void ocfs2_init_mask_waiter(struct ocfs2_mask_waiter *mw)
{
INIT_LIST_HEAD(&mw->mw_item);
init_completion(&mw->mw_complete);
+ ocfs2_init_start_time(mw);
}
static int ocfs2_wait_for_mask(struct ocfs2_mask_waiter *mw)
@@ -1254,6 +1321,7 @@ out:
goto again;
mlog_errno(ret);
}
+ ocfs2_update_lock_stats(lockres, level, &mw, ret);
mlog_exit(ret);
return ret;
@@ -1983,6 +2051,7 @@ static int ocfs2_inode_lock_update(struct inode *inode,
le32_to_cpu(fe->i_flags));
ocfs2_refresh_inode(inode, fe);
+ ocfs2_track_lock_refresh(lockres);
}
status = 0;
@@ -2267,6 +2336,7 @@ int ocfs2_super_lock(struct ocfs2_super *osb,
if (status < 0)
mlog_errno(status);
+ ocfs2_track_lock_refresh(lockres);
}
bail:
mlog_exit(status);
@@ -2461,7 +2531,11 @@ static void *ocfs2_dlm_seq_next(struct seq_file *m, void *v, loff_t *pos)
}
/* So that debugfs.ocfs2 can determine which format is being used */
+#ifdef CONFIG_OCFS2_FS_STATS
+#define OCFS2_DLM_DEBUG_STR_VERSION 2
+#else
#define OCFS2_DLM_DEBUG_STR_VERSION 1
+#endif
static int ocfs2_dlm_seq_show(struct seq_file *m, void *v)
{
int i;
@@ -2502,6 +2576,28 @@ static int ocfs2_dlm_seq_show(struct seq_file *m, void *v)
for(i = 0; i < DLM_LVB_LEN; i++)
seq_printf(m, "0x%x\t", lvb[i]);
+#ifdef CONFIG_OCFS2_FS_STATS
+ /* The following seq_print was added in version 2 of this output */
+ seq_printf(m, "%llu\t"
+ "%llu\t"
+ "%u\t"
+ "%u\t"
+ "%llu\t"
+ "%llu\t"
+ "%u\t"
+ "%u\t"
+ "%u\t",
+ lockres->l_lock_num_prmode,
+ lockres->l_lock_num_exmode,
+ lockres->l_lock_num_prmode_failed,
+ lockres->l_lock_num_exmode_failed,
+ lockres->l_lock_total_prmode,
+ lockres->l_lock_total_exmode,
+ lockres->l_lock_max_prmode,
+ lockres->l_lock_max_exmode,
+ lockres->l_lock_refresh);
+#endif
+
/* End the line */
seq_printf(m, "\n");
return 0;
diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h
index 3169237..1cb814b 100644
--- a/fs/ocfs2/ocfs2.h
+++ b/fs/ocfs2/ocfs2.h
@@ -132,6 +132,18 @@ struct ocfs2_lock_res {
wait_queue_head_t l_event;
struct list_head l_debug_list;
+
+#ifdef CONFIG_OCFS2_FS_STATS
+ unsigned long long l_lock_num_prmode; /* PR acquires */
+ unsigned long long l_lock_num_exmode; /* EX acquires */
+ unsigned int l_lock_num_prmode_failed; /* Failed PR gets */
+ unsigned int l_lock_num_exmode_failed; /* Failed EX gets */
+ unsigned long long l_lock_total_prmode; /* Tot wait for PR */
+ unsigned long long l_lock_total_exmode; /* Tot wait for EX */
+ unsigned int l_lock_max_prmode; /* Max wait for PR */
+ unsigned int l_lock_max_exmode; /* Max wait for EX */
+ unsigned int l_lock_refresh; /* Disk refreshes */
+#endif
};
struct ocfs2_dlm_debug {
--
1.5.3.6
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Ocfs2-devel] [PATCH 1/2] ocfs2: Add OCFS2_FS_STATS config option
2008-05-08 17:57 [Ocfs2-devel] [PATCH 1/2] ocfs2: Add OCFS2_FS_STATS config option Sunil Mushran
2008-05-08 17:57 ` [Ocfs2-devel] [PATCH 2/2] ocfs2: Add cluster lock stats at the fs level Sunil Mushran
@ 2008-05-13 0:42 ` Mark Fasheh
1 sibling, 0 replies; 5+ messages in thread
From: Mark Fasheh @ 2008-05-13 0:42 UTC (permalink / raw)
To: ocfs2-devel
On Thu, May 08, 2008 at 10:57:00AM -0700, Sunil Mushran wrote:
> This patch adds the OCFS2_FS_STATS config option which will be
> used to demarcate the statistics capturing code.
>
> Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com>
> ---
> fs/Kconfig | 8 ++++++++
> 1 files changed, 8 insertions(+), 0 deletions(-)
>
> diff --git a/fs/Kconfig b/fs/Kconfig
> index cf12c40..c264610 100644
> --- a/fs/Kconfig
> +++ b/fs/Kconfig
> @@ -470,6 +470,14 @@ config OCFS2_FS_USERSPACE_CLUSTER
> It is safe to say Y, as the clustering method is run-time
> selectable.
>
> +config OCFS2_FS_STATS
> + bool "OCFS2 statistics"
> + depends on OCFS2_FS
> + default y
> + help
> + This option allows some fs statistics to be captured. Enabling
> + this option may increase the memory consumption.
Hmm, can we get a slightly more descriptive text? Maybe an example of what
kinds of stats are exported, and expected usage - "statistics will be exported
via debugfs", etc.
--Mark
--
Mark Fasheh
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Ocfs2-devel] [PATCH 2/2] ocfs2: Add cluster lock stats at the fs level
2008-05-08 17:57 ` [Ocfs2-devel] [PATCH 2/2] ocfs2: Add cluster lock stats at the fs level Sunil Mushran
@ 2008-05-13 0:42 ` Mark Fasheh
2008-05-13 1:06 ` Joel Becker
0 siblings, 1 reply; 5+ messages in thread
From: Mark Fasheh @ 2008-05-13 0:42 UTC (permalink / raw)
To: ocfs2-devel
On Thu, May 08, 2008 at 10:57:01AM -0700, Sunil Mushran wrote:
> @@ -2461,7 +2531,11 @@ static void *ocfs2_dlm_seq_next(struct seq_file *m, void *v, loff_t *pos)
> }
>
> /* So that debugfs.ocfs2 can determine which format is being used */
> +#ifdef CONFIG_OCFS2_FS_STATS
> +#define OCFS2_DLM_DEBUG_STR_VERSION 2
> +#else
> #define OCFS2_DLM_DEBUG_STR_VERSION 1
> +#endif
Why not just bump this and print zero's if CONFIG_OCFS2_FS_STATS isn't
enabled?
Rest of the patch seems fine to me.
--Mark
--
Mark Fasheh
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Ocfs2-devel] [PATCH 2/2] ocfs2: Add cluster lock stats at the fs level
2008-05-13 0:42 ` Mark Fasheh
@ 2008-05-13 1:06 ` Joel Becker
0 siblings, 0 replies; 5+ messages in thread
From: Joel Becker @ 2008-05-13 1:06 UTC (permalink / raw)
To: ocfs2-devel
On Mon, May 12, 2008 at 05:42:55PM -0700, Mark Fasheh wrote:
> On Thu, May 08, 2008 at 10:57:01AM -0700, Sunil Mushran wrote:
>
> > @@ -2461,7 +2531,11 @@ static void *ocfs2_dlm_seq_next(struct seq_file *m, void *v, loff_t *pos)
> > }
> >
> > /* So that debugfs.ocfs2 can determine which format is being used */
> > +#ifdef CONFIG_OCFS2_FS_STATS
> > +#define OCFS2_DLM_DEBUG_STR_VERSION 2
> > +#else
> > #define OCFS2_DLM_DEBUG_STR_VERSION 1
> > +#endif
>
> Why not just bump this and print zero's if CONFIG_OCFS2_FS_STATS isn't
> enabled?
I second this.
Joel
--
"In a crisis, don't hide behind anything or anybody. They're going
to find you anyway."
- Paul "Bear" Bryant
Joel Becker
Principal Software Developer
Oracle
E-mail: joel.becker at oracle.com
Phone: (650) 506-8127
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2008-05-13 1:06 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-05-08 17:57 [Ocfs2-devel] [PATCH 1/2] ocfs2: Add OCFS2_FS_STATS config option Sunil Mushran
2008-05-08 17:57 ` [Ocfs2-devel] [PATCH 2/2] ocfs2: Add cluster lock stats at the fs level Sunil Mushran
2008-05-13 0:42 ` Mark Fasheh
2008-05-13 1:06 ` Joel Becker
2008-05-13 0:42 ` [Ocfs2-devel] [PATCH 1/2] ocfs2: Add OCFS2_FS_STATS config option Mark Fasheh
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.