Re: [PATCH v3] nilfs2: add a tracepoint for tracking stage transition of segment construction

2014-09-14 Thread Hitoshi Mitake
On Sun, Sep 14, 2014 at 1:09 PM, Ryusuke Konishi
konishi.ryus...@lab.ntt.co.jp wrote:
 On Sun, 14 Sep 2014 00:14:36 +0900, Mitake Hitoshi wrote:
 This patch adds a tracepoint for tracking stage transition of block
 collection in segment construction. With the tracepoint, we can
 analysis the behavior of segment construction in depth. It would be
 useful for bottleneck detection and debugging, etc.

 The tracepoint is created with the standard trace API of linux (like
 ext3, ext4, f2fs and btrfs). So we can analysis with existing tools
 easily. Of course, more detailed analysis will be possible if we can
 create nilfs specific analysis tools.

 Below is an example of event dump with Brendan Gregg's perf-tools
 (https://github.com/brendangregg/perf-tools). Time consumption between
 each stage can be obtained.

 $ sudo bin/tpoint nilfs2:nilfs2_collection_stage_transition
 Tracing nilfs2:nilfs2_collection_stage_transition. Ctrl-C to end.
 segctord-14875 [003] ...1 28311.067794: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_INIT
 segctord-14875 [003] ...1 28311.068139: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_GC
 segctord-14875 [003] ...1 28311.068139: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_FILE
 segctord-14875 [003] ...1 28311.068486: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_IFILE
 segctord-14875 [003] ...1 28311.068540: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_CPFILE
 segctord-14875 [003] ...1 28311.068561: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_SUFILE
 segctord-14875 [003] ...1 28311.068565: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_DAT
 segctord-14875 [003] ...1 28311.068573: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_SR
 segctord-14875 [003] ...1 28311.068574: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_DONE

 For capturing transition correctly, this patch adds wrappers for the
 member scnt of nilfs_cstage. With this change, every transition of the
 stage can produce trace event in a correct manner.

 Of course the tracepoint added by this patch is very limited, so we
 need to add more points for detailed analysis. This patch is something
 like demonstration. If this concept is acceptable for the nilfs
 community, I'd like to add more tracepoints and prepare analysis
 tools.

 Signed-off-by: Hitoshi Mitake mitake.hito...@lab.ntt.co.jp
 ---
  fs/nilfs2/segment.c   | 71 
 +++
  fs/nilfs2/segment.h   |  3 +-
  include/trace/events/nilfs2.h | 50 ++
  3 files changed, 103 insertions(+), 21 deletions(-)
  create mode 100644 include/trace/events/nilfs2.h

 v3: undo rename

 v2: correct the email address of author

 snip

 Looks good.  I pushed out this patch as tracepoints branch of
 nilfs2.git[1].

 If you hope it to be sent to upstream separately at this time, please
 let me know.  (In that case, the following description should be
 revised to be ready for mainline merge).

 Of course the tracepoint added by this patch is very limited, so we
 need to add more points for detailed analysis. This patch is something
 like demonstration. If this concept is acceptable for the nilfs
 community, I'd like to add more tracepoints and prepare analysis
 tools.

 Otherwise, I'll keep it in the tracepoints branch for now.

Thanks a lot for your review and pushing. The change for tracepoints
doesn't need to be sent to upstream immediately. I'll enhance the
feature for a while on the tracepoints branch.

Thanks,
Hitoshi


 [1] https://github.com/konis/nilfs2.git

 Thanks,
 Ryusuke Konishi

--
To unsubscribe from this list: send the line unsubscribe linux-nilfs in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3] nilfs2: add a tracepoint for tracking stage transition of segment construction

2014-09-13 Thread Hitoshi Mitake
This patch adds a tracepoint for tracking stage transition of block
collection in segment construction. With the tracepoint, we can
analysis the behavior of segment construction in depth. It would be
useful for bottleneck detection and debugging, etc.

The tracepoint is created with the standard trace API of linux (like
ext3, ext4, f2fs and btrfs). So we can analysis with existing tools
easily. Of course, more detailed analysis will be possible if we can
create nilfs specific analysis tools.

Below is an example of event dump with Brendan Gregg's perf-tools
(https://github.com/brendangregg/perf-tools). Time consumption between
each stage can be obtained.

$ sudo bin/tpoint nilfs2:nilfs2_collection_stage_transition
Tracing nilfs2:nilfs2_collection_stage_transition. Ctrl-C to end.
segctord-14875 [003] ...1 28311.067794: 
nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_INIT
segctord-14875 [003] ...1 28311.068139: 
nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_GC
segctord-14875 [003] ...1 28311.068139: 
nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_FILE
segctord-14875 [003] ...1 28311.068486: 
nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_IFILE
segctord-14875 [003] ...1 28311.068540: 
nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_CPFILE
segctord-14875 [003] ...1 28311.068561: 
nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_SUFILE
segctord-14875 [003] ...1 28311.068565: 
nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_DAT
segctord-14875 [003] ...1 28311.068573: 
nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_SR
segctord-14875 [003] ...1 28311.068574: 
nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_DONE

For capturing transition correctly, this patch adds wrappers for the
member scnt of nilfs_cstage. With this change, every transition of the
stage can produce trace event in a correct manner.

Of course the tracepoint added by this patch is very limited, so we
need to add more points for detailed analysis. This patch is something
like demonstration. If this concept is acceptable for the nilfs
community, I'd like to add more tracepoints and prepare analysis
tools.

Signed-off-by: Hitoshi Mitake mitake.hito...@lab.ntt.co.jp
---
 fs/nilfs2/segment.c   | 71 +++
 fs/nilfs2/segment.h   |  3 +-
 include/trace/events/nilfs2.h | 50 ++
 3 files changed, 103 insertions(+), 21 deletions(-)
 create mode 100644 include/trace/events/nilfs2.h

v3: undo rename

v2: correct the email address of author

diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c
index a1a1916..0fcf8e7 100644
--- a/fs/nilfs2/segment.c
+++ b/fs/nilfs2/segment.c
@@ -76,6 +76,36 @@ enum {
NILFS_ST_DONE,
 };
 
+#define CREATE_TRACE_POINTS
+#include trace/events/nilfs2.h
+
+/*
+ * nilfs_sc_cstage_inc(), nilfs_sc_cstage_set(), nilfs_sc_cstage_get() are
+ * wrapper functions of stage count (nilfs_sc_info-sc_stage.scnt). Users of
+ * the variable must use them because transition of stage count must involve
+ * trace events (trace_nilfs2_collection_stage_transition).
+ *
+ * nilfs_sc_cstage_get() isn't required for the above purpose because it 
doesn't
+ * produce tracepoint events. It is provided just for making the intention
+ * clear.
+ */
+static inline void nilfs_sc_cstage_inc(struct nilfs_sc_info *sci)
+{
+   sci-sc_stage.scnt++;
+   trace_nilfs2_collection_stage_transition(sci);
+}
+
+static inline void nilfs_sc_cstage_set(struct nilfs_sc_info *sci, int 
next_scnt)
+{
+   sci-sc_stage.scnt = next_scnt;
+   trace_nilfs2_collection_stage_transition(sci);
+}
+
+static inline int nilfs_sc_cstage_get(struct nilfs_sc_info *sci)
+{
+   return sci-sc_stage.scnt;
+}
+
 /* State flags of collection */
 #define NILFS_CF_NODE  0x0001  /* Collecting node blocks */
 #define NILFS_CF_IFILE_STARTED 0x0002  /* IFILE stage has started */
@@ -1055,7 +1085,7 @@ static int nilfs_segctor_collect_blocks(struct 
nilfs_sc_info *sci, int mode)
size_t ndone;
int err = 0;
 
-   switch (sci-sc_stage.scnt) {
+   switch (nilfs_sc_cstage_get(sci)) {
case NILFS_ST_INIT:
/* Pre-processes */
sci-sc_stage.flags = 0;
@@ -1064,7 +1094,7 @@ static int nilfs_segctor_collect_blocks(struct 
nilfs_sc_info *sci, int mode)
sci-sc_nblk_inc = 0;
sci-sc_curseg-sb_sum.flags = NILFS_SS_LOGBGN;
if (mode == SC_LSEG_DSYNC) {
-   sci-sc_stage.scnt = NILFS_ST_DSYNC;
+   nilfs_sc_cstage_set(sci, NILFS_ST_DSYNC);
goto dsync_mode;
}
}
@@ -1072,10 

Re: [PATCH v3] nilfs2: add a tracepoint for tracking stage transition of segment construction

2014-09-13 Thread Ryusuke Konishi
On Sun, 14 Sep 2014 00:14:36 +0900, Mitake Hitoshi wrote:
 This patch adds a tracepoint for tracking stage transition of block
 collection in segment construction. With the tracepoint, we can
 analysis the behavior of segment construction in depth. It would be
 useful for bottleneck detection and debugging, etc.
 
 The tracepoint is created with the standard trace API of linux (like
 ext3, ext4, f2fs and btrfs). So we can analysis with existing tools
 easily. Of course, more detailed analysis will be possible if we can
 create nilfs specific analysis tools.
 
 Below is an example of event dump with Brendan Gregg's perf-tools
 (https://github.com/brendangregg/perf-tools). Time consumption between
 each stage can be obtained.
 
 $ sudo bin/tpoint nilfs2:nilfs2_collection_stage_transition
 Tracing nilfs2:nilfs2_collection_stage_transition. Ctrl-C to end.
 segctord-14875 [003] ...1 28311.067794: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_INIT
 segctord-14875 [003] ...1 28311.068139: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_GC
 segctord-14875 [003] ...1 28311.068139: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_FILE
 segctord-14875 [003] ...1 28311.068486: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_IFILE
 segctord-14875 [003] ...1 28311.068540: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_CPFILE
 segctord-14875 [003] ...1 28311.068561: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_SUFILE
 segctord-14875 [003] ...1 28311.068565: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_DAT
 segctord-14875 [003] ...1 28311.068573: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_SR
 segctord-14875 [003] ...1 28311.068574: 
 nilfs2_collection_stage_transition: sci = 8800ce6de000, stage = ST_DONE
 
 For capturing transition correctly, this patch adds wrappers for the
 member scnt of nilfs_cstage. With this change, every transition of the
 stage can produce trace event in a correct manner.
 
 Of course the tracepoint added by this patch is very limited, so we
 need to add more points for detailed analysis. This patch is something
 like demonstration. If this concept is acceptable for the nilfs
 community, I'd like to add more tracepoints and prepare analysis
 tools.
 
 Signed-off-by: Hitoshi Mitake mitake.hito...@lab.ntt.co.jp
 ---
  fs/nilfs2/segment.c   | 71 
 +++
  fs/nilfs2/segment.h   |  3 +-
  include/trace/events/nilfs2.h | 50 ++
  3 files changed, 103 insertions(+), 21 deletions(-)
  create mode 100644 include/trace/events/nilfs2.h
 
 v3: undo rename
 
 v2: correct the email address of author
 
snip

Looks good.  I pushed out this patch as tracepoints branch of
nilfs2.git[1].

If you hope it to be sent to upstream separately at this time, please
let me know.  (In that case, the following description should be
revised to be ready for mainline merge).

 Of course the tracepoint added by this patch is very limited, so we
 need to add more points for detailed analysis. This patch is something
 like demonstration. If this concept is acceptable for the nilfs
 community, I'd like to add more tracepoints and prepare analysis
 tools.

Otherwise, I'll keep it in the tracepoints branch for now.

[1] https://github.com/konis/nilfs2.git

Thanks,
Ryusuke Konishi

--
To unsubscribe from this list: send the line unsubscribe linux-nilfs in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html