diff for duplicates of <20140210082931.GA25323@linux.vnet.ibm.com> diff --git a/a/1.txt b/N1/1.txt index 87b5ee9..624e5b5 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -11,4 +11,101 @@ Sorry took some time to get and measure benefit on the memoryless system. Resending patch with changelog and comment changes based on your and David's suggestion. -----8<--- +----8<--- +>From fc8186b5c33a34810a34f5aadd50082463117636 Mon Sep 17 00:00:00 2001 +From: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com> +Date: Mon, 25 Nov 2013 14:29:03 +0530 +Subject: [RFC PATCH V5 RESEND] mm readahead: Fix readahead fail for no local + memory and limit readahead pages + +Currently max_sane_readahead() returns zero on the cpu having no local memory node +which leads to readahead failure. Fix the readahead failure by returning +minimum of (requested pages, 4k). Users running application a on memory less cpu +which needs readahead such as streaming application see considerable boost in the +performance. + +Result: +fadvise experiment with FADV_WILLNEED on a PPC machine having memoryless CPU +with 1GB testfile ( 12 iterations) yielded 46.66% improvement + +kernel Avg Stddev +base_ppc 11.946833 1.34% +patched_ppc 6.3720833 1.80% + +Below result proves that there is no impact on the normal NUMA cases w/ patch. + +fadvise experiment with FADV_WILLNEED on a x240 machine with 1GB testfile +32GB* 4G RAM numa machine ( 12 iterations) yielded + +Kernel Avg Stddev +base 7.2963 1.10 % +patched 7.2972 1.18 % + +Reviewed-by: Jan Kara <jack@suse.cz> +Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com> +--- + + Changes in V5: + - Updated the changelog with benefit seen (Andrew) + - Discard remote memroy term in comment since memoryless CPU + will have affinity to numa_mem_id() (David) + - Drop the 4k limit for normal readahead. (Jan Kara) + + Changes in V4: + - Check for total node memory to decide whether we don't + have local memory (jan Kara) + - Add 4k page limit on readahead for normal and remote readahead (Linus) + (Linus suggestion was 16MB limit). + + Changes in V3: + - Drop iterating over numa nodes that calculates total free pages (Linus) + + Agree that we do not have control on allocation for readahead on a + particular numa node and hence for remote readahead we can not further + sanitize based on potential free pages of that node. and also we do + not want to itererate through all nodes to find total free pages. + + Suggestions and comments welcome + mm/readahead.c | 21 +++++++++++++++++++-- + 1 file changed, 19 insertions(+), 2 deletions(-) + +diff --git a/mm/readahead.c b/mm/readahead.c +index 0de2360..4c7343b 100644 +--- a/mm/readahead.c ++++ b/mm/readahead.c +@@ -233,14 +233,31 @@ int force_page_cache_readahead(struct address_space *mapping, struct file *filp, + return 0; + } + ++#define MAX_REMOTE_READAHEAD 4096UL + /* + * Given a desired number of PAGE_CACHE_SIZE readahead pages, return a + * sensible upper limit. + */ + unsigned long max_sane_readahead(unsigned long nr) + { +- return min(nr, (node_page_state(numa_node_id(), NR_INACTIVE_FILE) +- + node_page_state(numa_node_id(), NR_FREE_PAGES)) / 2); ++ unsigned long local_free_page; ++ int nid; ++ ++ nid = numa_node_id(); ++ if (node_present_pages(nid)) { ++ /* ++ * We sanitize readahead size depending on free memory in ++ * the local node. ++ */ ++ local_free_page = node_page_state(nid, NR_INACTIVE_FILE) ++ + node_page_state(nid, NR_FREE_PAGES); ++ return min(nr, local_free_page / 2); ++ } ++ /* ++ * Ensure readahead success on a memoryless node cpu. But we limit ++ * the readahead to 4k pages to avoid trashing page cache. ++ */ ++ return min(nr, MAX_REMOTE_READAHEAD); + } + + /* +-- +1.7.11.7 diff --git a/a/content_digest b/N1/content_digest index f7c6d74..88e2147 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -30,6 +30,103 @@ "Resending patch with changelog and comment changes based on your and\n" "David's suggestion.\n" "\n" - ----8<--- + "----8<--- \n" + ">From fc8186b5c33a34810a34f5aadd50082463117636 Mon Sep 17 00:00:00 2001\n" + "From: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>\n" + "Date: Mon, 25 Nov 2013 14:29:03 +0530\n" + "Subject: [RFC PATCH V5 RESEND] mm readahead: Fix readahead fail for no local\n" + " memory and limit readahead pages\n" + "\n" + "Currently max_sane_readahead() returns zero on the cpu having no local memory node\n" + "which leads to readahead failure. Fix the readahead failure by returning\n" + "minimum of (requested pages, 4k). Users running application a on memory less cpu\n" + "which needs readahead such as streaming application see considerable boost in the\n" + "performance.\n" + "\n" + "Result:\n" + "fadvise experiment with FADV_WILLNEED on a PPC machine having memoryless CPU\n" + "with 1GB testfile ( 12 iterations) yielded 46.66% improvement\n" + "\n" + "kernel Avg Stddev\n" + "base_ppc 11.946833 1.34%\n" + "patched_ppc 6.3720833 1.80%\n" + "\n" + "Below result proves that there is no impact on the normal NUMA cases w/ patch.\n" + "\n" + "fadvise experiment with FADV_WILLNEED on a x240 machine with 1GB testfile\n" + "32GB* 4G RAM numa machine ( 12 iterations) yielded\n" + "\n" + "Kernel Avg Stddev\n" + "base 7.2963 1.10 %\n" + "patched 7.2972 1.18 %\n" + "\n" + "Reviewed-by: Jan Kara <jack@suse.cz>\n" + "Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>\n" + "---\n" + " \n" + " Changes in V5:\n" + " - Updated the changelog with benefit seen (Andrew)\n" + " - Discard remote memroy term in comment since memoryless CPU\n" + " will have affinity to numa_mem_id() (David)\n" + " - Drop the 4k limit for normal readahead. (Jan Kara)\n" + "\n" + " Changes in V4:\n" + " - Check for total node memory to decide whether we don't\n" + " have local memory (jan Kara)\n" + " - Add 4k page limit on readahead for normal and remote readahead (Linus)\n" + " (Linus suggestion was 16MB limit).\n" + "\n" + " Changes in V3:\n" + " - Drop iterating over numa nodes that calculates total free pages (Linus)\n" + "\n" + " Agree that we do not have control on allocation for readahead on a\n" + " particular numa node and hence for remote readahead we can not further\n" + " sanitize based on potential free pages of that node. and also we do\n" + " not want to itererate through all nodes to find total free pages.\n" + "\n" + " Suggestions and comments welcome\n" + " mm/readahead.c | 21 +++++++++++++++++++--\n" + " 1 file changed, 19 insertions(+), 2 deletions(-)\n" + "\n" + "diff --git a/mm/readahead.c b/mm/readahead.c\n" + "index 0de2360..4c7343b 100644\n" + "--- a/mm/readahead.c\n" + "+++ b/mm/readahead.c\n" + "@@ -233,14 +233,31 @@ int force_page_cache_readahead(struct address_space *mapping, struct file *filp,\n" + " \treturn 0;\n" + " }\n" + " \n" + "+#define MAX_REMOTE_READAHEAD 4096UL\n" + " /*\n" + " * Given a desired number of PAGE_CACHE_SIZE readahead pages, return a\n" + " * sensible upper limit.\n" + " */\n" + " unsigned long max_sane_readahead(unsigned long nr)\n" + " {\n" + "-\treturn min(nr, (node_page_state(numa_node_id(), NR_INACTIVE_FILE)\n" + "-\t\t+ node_page_state(numa_node_id(), NR_FREE_PAGES)) / 2);\n" + "+\tunsigned long local_free_page;\n" + "+\tint nid;\n" + "+\n" + "+\tnid = numa_node_id();\n" + "+\tif (node_present_pages(nid)) {\n" + "+\t\t/*\n" + "+\t\t * We sanitize readahead size depending on free memory in\n" + "+\t\t * the local node.\n" + "+\t\t */\n" + "+\t\tlocal_free_page = node_page_state(nid, NR_INACTIVE_FILE)\n" + "+\t\t\t\t + node_page_state(nid, NR_FREE_PAGES);\n" + "+\t\treturn min(nr, local_free_page / 2);\n" + "+\t}\n" + "+\t/*\n" + "+\t * Ensure readahead success on a memoryless node cpu. But we limit\n" + "+\t * the readahead to 4k pages to avoid trashing page cache.\n" + "+\t */\n" + "+\treturn min(nr, MAX_REMOTE_READAHEAD);\n" + " }\n" + " \n" + " /*\n" + "-- \n" + 1.7.11.7 -d6effb489e3fc8224de0c1afc58f77185546e77f956f176bf3b39eaead1d2186 +631e133909afd01259967ecf97140266006189571f4d1573333f9a89e32027da
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.