From mboxrd@z Thu Jan 1 00:00:00 1970 From: a-tsuji@bk.jp.nec.com (Atsushi Tsuji) Date: Tue, 03 Feb 2009 15:08:32 +0900 Subject: [ltt-dev] [PATCH] Add tracepoints to track pagecache transition Message-ID: <4987DF60.9030504@bk.jp.nec.com> 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 --- 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); -------------- next part -------------- A non-text attachment was scrubbed... Name: pgcache.jpg Type: image/jpeg Size: 38334 bytes Desc: not available URL: