This is the mail archive of the systemtap@sourceware.org mailing list for the systemtap project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Add tracepoints to track pagecache transition


Hi,

I thought it would be useful to trace pagecache behavior for problem
analysis (performance bottlenecks, behavior differences between stable
time and trouble time).

By using those tracepoints, we can describe and visualize pagecache
transition (file-by-file basis) in kernel and  pagecache
consumes most of the memory in running system and pagecache hit rate
and writeback behavior will influence system load and performance.

I attached an example which is visualization of pagecache status using
SystemTap. That graph describes pagecache transition of File A and File B
on a file-by-file basis with the situation where regular I/O to File A
is delayed because of other I/O to File B. We visually understand
pagecache for File A is narrowed down due to I/O pressure from File B.

The below patch is for lttng tree to add those new tracepoints.

Signed-off-by: Atsushi Tsuji <a-tsuji@bk.jp.nec.com>
---
diff --git a/include/trace/filemap.h b/include/trace/filemap.h
index 0d881a1..454d908 100644
--- a/include/trace/filemap.h
+++ b/include/trace/filemap.h
@@ -9,5 +9,11 @@ DECLARE_TRACE(wait_on_page_start,
 DECLARE_TRACE(wait_on_page_end,
 	TPPROTO(struct page *page, int bit_nr),
 	TPARGS(page, bit_nr));
+DECLARE_TRACE(add_to_page_cache,
+	TPPROTO(struct address_space *mapping, pgoff_t offset),
+	TPARGS(mapping, offset));
+DECLARE_TRACE(remove_from_page_cache,
+	TPPROTO(struct address_space *mapping),
+	TPARGS(mapping));

 #endif
diff --git a/ltt/probes/mm-trace.c b/ltt/probes/mm-trace.c
index 2b60d89..b3122c9 100644
--- a/ltt/probes/mm-trace.c
+++ b/ltt/probes/mm-trace.c
@@ -164,6 +164,22 @@ void probe_swap_file_open(struct file *file, char *filename)
 }
 #endif

+void probe_add_to_page_cache(struct address_space *mapping, pgoff_t offset)
+{
+	trace_mark_tp(mm, add_to_page_cache, add_to_page_cache,
+		probe_add_to_page_cache,
+		"inode %lu sdev %u",
+		mapping->host->i_ino, mapping->host->i_sb->s_dev);
+}
+
+void probe_remove_from_page_cache(struct address_space *mapping)
+{
+	trace_mark_tp(mm, remove_from_page_cache, remove_from_page_cache,
+		probe_remove_from_page_cache,
+		"inode %lu sdev %u",
+		mapping->host->i_ino, mapping->host->i_sb->s_dev);
+}
+
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Mathieu Desnoyers");
 MODULE_DESCRIPTION("MM Tracepoint Probes");
diff --git a/mm/filemap.c b/mm/filemap.c
index cca96ed..7f3fbcf 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -45,6 +45,8 @@

 DEFINE_TRACE(wait_on_page_start);
 DEFINE_TRACE(wait_on_page_end);
+DEFINE_TRACE(add_to_page_cache);
+DEFINE_TRACE(remove_from_page_cache);

 /*
  * Shared mappings implemented 30.11.1994. It's not fully working yet,
@@ -123,6 +125,7 @@ void __remove_from_page_cache(struct page *page)
 	page->mapping = NULL;
 	mapping->nrpages--;
 	__dec_zone_page_state(page, NR_FILE_PAGES);
+	trace_remove_from_page_cache(mapping);
 	BUG_ON(page_mapped(page));

 	/*
@@ -477,6 +480,7 @@ int add_to_page_cache_locked(struct page *page, struct
address_space *mapping,
 		if (likely(!error)) {
 			mapping->nrpages++;
 			__inc_zone_page_state(page, NR_FILE_PAGES);
+			trace_add_to_page_cache(mapping, offset);
 		} else {
 			page->mapping = NULL;
 			mem_cgroup_uncharge_cache_page(page);


JPEG image


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]