diff for duplicates of <20160114202408.GA20218@cmpxchg.org> diff --git a/a/1.txt b/N1/1.txt index 5224841..54ccb18 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -17,196 +17,3 @@ the file when adding new entries. It depends on whether people start relying on items staying at fixed offsets and what we tell them in response when that breaks. I hope that we can at least get the main memory consumers in before this is released, just in case. - -From 1be87db16a3895538ce65362b5234ef9c8af308d Mon Sep 17 00:00:00 2001 -From: Johannes Weiner <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org> -Date: Thu, 14 Jan 2016 10:40:24 -0500 -Subject: [PATCH] mm: memcontrol: basic memory statistics in cgroup2 memory - controller fix - -Fixlet addressing akpm's feedback: - -- Fix overflowing byte counters on 32-bit. Just like in the existing - interface files, bytes must be printed as u64 to work with highmem. - -- Add documentation in cgroup.txt that explains the memory.stat file - and its format. - -- Rethink item ordering to accomodate potential future additions. The - ordering now follows both 1) from big picture to detail and 2) from - stats that reflect on userspace behavior towards stats that reflect - on kernel heuristics. Both are gradients, and item-by-item ordering - will still require judgement calls (and some bike shed painting). - -Changelog addendum to the original patch: - -The output of this file looks as follows: - -$ cat memory.stat -anon 167936 -file 87302144 -file_mapped 0 -file_dirty 0 -file_writeback 0 -inactive_anon 0 -active_anon 155648 -inactive_file 87298048 -active_file 4096 -unevictable 0 -pgfault 636 -pgmajfault 0 - -The list consists of two sections: statistics reflecting the current -state of the memory management subsystem, and statistics reflecting -past events. The items themselves are sorted such that generic big -picture items come before specific details, and items related to -userspace activity come before items related to kernel heuristics. - -All memory counters are in bytes to eliminate all ambiguity with -variable page sizes. - -There will be more items and statistics added in the future, but this -is a good initial set to get a minimum of insight into how a cgroup is -using memory, and the items chosen for now are likely to remain valid -even with significant changes to the memory management implementation. - -Signed-off-by: Johannes Weiner <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org> ---- - Documentation/cgroup.txt | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ - mm/memcontrol.c | 45 +++++++++++++++++++++++--------------- - 2 files changed, 84 insertions(+), 17 deletions(-) - -diff --git a/Documentation/cgroup.txt b/Documentation/cgroup.txt -index f441564..65b3eac 100644 ---- a/Documentation/cgroup.txt -+++ b/Documentation/cgroup.txt -@@ -819,6 +819,62 @@ PAGE_SIZE multiple when read back. - the cgroup. This may not exactly match the number of - processes killed but should generally be close. - -+ memory.stat -+ -+ A read-only flat-keyed file which exists on non-root cgroups. -+ -+ This breaks down the cgroup's memory footprint into different -+ types of memory, type-specific details, and other information -+ on the state and past events of the memory management system. -+ -+ All memory amounts are in bytes. -+ -+ The entries are ordered to be human readable, and new entries -+ can show up in the middle. Don't rely on items remaining in a -+ fixed position; use the keys to look up specific values! -+ -+ anon -+ -+ Amount of memory used in anonymous mappings such as -+ brk(), sbrk(), and mmap(MAP_ANONYMOUS) -+ -+ file -+ -+ Amount of memory used to cache filesystem data, -+ including tmpfs and shared memory. -+ -+ file_mapped -+ -+ Amount of cached filesystem data mapped with mmap() -+ -+ file_dirty -+ -+ Amount of cached filesystem data that was modified but -+ not yet written back to disk -+ -+ file_writeback -+ -+ Amount of cached filesystem data that was modified and -+ is currently being written back to disk -+ -+ inactive_anon -+ active_anon -+ inactive_file -+ active_file -+ unevictable -+ -+ Amount of memory, swap-backed and filesystem-backed, -+ on the internal memory management lists used by the -+ page reclaim algorithm -+ -+ pgfault -+ -+ Total number of page faults incurred -+ -+ pgmajfault -+ -+ Number of major page faults incurred -+ - memory.swap.current - - A read-only single value file which exists on non-root -diff --git a/mm/memcontrol.c b/mm/memcontrol.c -index 8645852..cdb51a9 100644 ---- a/mm/memcontrol.c -+++ b/mm/memcontrol.c -@@ -5112,32 +5112,43 @@ static int memory_stat_show(struct seq_file *m, void *v) - struct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(m)); - int i; - -- /* Memory consumer totals */ -- -- seq_printf(m, "anon %lu\n", -- tree_stat(memcg, MEM_CGROUP_STAT_RSS) * PAGE_SIZE); -- seq_printf(m, "file %lu\n", -- tree_stat(memcg, MEM_CGROUP_STAT_CACHE) * PAGE_SIZE); -+ /* -+ * Provide statistics on the state of the memory subsystem as -+ * well as cumulative event counters that show past behavior. -+ * -+ * This list is ordered following a combination of these gradients: -+ * 1) generic big picture -> specifics and details -+ * 2) reflecting userspace activity -> reflecting kernel heuristics -+ * -+ * Current memory state: -+ */ - -- /* Per-consumer breakdowns */ -+ seq_printf(m, "anon %llu\n", -+ (u64)tree_stat(memcg, MEM_CGROUP_STAT_RSS) * PAGE_SIZE); -+ seq_printf(m, "file %llu\n", -+ (u64)tree_stat(memcg, MEM_CGROUP_STAT_CACHE) * PAGE_SIZE); -+ -+ seq_printf(m, "file_mapped %llu\n", -+ (u64)tree_stat(memcg, MEM_CGROUP_STAT_FILE_MAPPED) * -+ PAGE_SIZE); -+ seq_printf(m, "file_dirty %llu\n", -+ (u64)tree_stat(memcg, MEM_CGROUP_STAT_DIRTY) * -+ PAGE_SIZE); -+ seq_printf(m, "file_writeback %llu\n", -+ (u64)tree_stat(memcg, MEM_CGROUP_STAT_WRITEBACK) * -+ PAGE_SIZE); - - for (i = 0; i < NR_LRU_LISTS; i++) { - struct mem_cgroup *mi; - unsigned long val = 0; - - for_each_mem_cgroup_tree(mi, memcg) -- val += mem_cgroup_nr_lru_pages(mi, BIT(i)) * PAGE_SIZE; -- seq_printf(m, "%s %lu\n", mem_cgroup_lru_names[i], val); -+ val += mem_cgroup_nr_lru_pages(mi, BIT(i)); -+ seq_printf(m, "%s %llu\n", -+ mem_cgroup_lru_names[i], (u64)val * PAGE_SIZE); - } - -- seq_printf(m, "file_mapped %lu\n", -- tree_stat(memcg, MEM_CGROUP_STAT_FILE_MAPPED) * PAGE_SIZE); -- seq_printf(m, "file_dirty %lu\n", -- tree_stat(memcg, MEM_CGROUP_STAT_DIRTY) * PAGE_SIZE); -- seq_printf(m, "file_writeback %lu\n", -- tree_stat(memcg, MEM_CGROUP_STAT_WRITEBACK) * PAGE_SIZE); -- -- /* Memory management events */ -+ /* Accumulated memory events */ - - seq_printf(m, "pgfault %lu\n", - tree_events(memcg, MEM_CGROUP_EVENTS_PGFAULT)); --- -2.7.0 diff --git a/a/content_digest b/N1/content_digest index 9d16916..e0929f7 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -1,16 +1,15 @@ "ref\01452722469-24704-1-git-send-email-hannes@cmpxchg.org\0" "ref\020160113144916.03f03766e201b6b04a8a47cc@linux-foundation.org\0" - "ref\020160113144916.03f03766e201b6b04a8a47cc-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org\0" - "From\0Johannes Weiner <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org>\0" + "From\0Johannes Weiner <hannes@cmpxchg.org>\0" "Subject\0Re: [PATCH 0/2] mm: memcontrol: cgroup2 memory statistics\0" "Date\0Thu, 14 Jan 2016 15:24:08 -0500\0" - "To\0Andrew Morton <akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>\0" - "Cc\0Michal Hocko <mhocko-AlSwsSmVLrQ@public.gmane.org>" - Vladimir Davydov <vdavydov-5HdwGun5lf+gSpxsJD1C4w@public.gmane.org> - linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org - cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org - linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org - " kernel-team-b10kYP2dOMg@public.gmane.org\0" + "To\0Andrew Morton <akpm@linux-foundation.org>\0" + "Cc\0Michal Hocko <mhocko@suse.cz>" + Vladimir Davydov <vdavydov@virtuozzo.com> + linux-mm@kvack.org + cgroups@vger.kernel.org + linux-kernel@vger.kernel.org + " kernel-team@fb.com\0" "\00:1\0" "b\0" "On Wed, Jan 13, 2016 at 02:49:16PM -0800, Andrew Morton wrote:\n" @@ -31,199 +30,6 @@ "the file when adding new entries. It depends on whether people start\n" "relying on items staying at fixed offsets and what we tell them in\n" "response when that breaks. I hope that we can at least get the main\n" - "memory consumers in before this is released, just in case.\n" - "\n" - "From 1be87db16a3895538ce65362b5234ef9c8af308d Mon Sep 17 00:00:00 2001\n" - "From: Johannes Weiner <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org>\n" - "Date: Thu, 14 Jan 2016 10:40:24 -0500\n" - "Subject: [PATCH] mm: memcontrol: basic memory statistics in cgroup2 memory\n" - " controller fix\n" - "\n" - "Fixlet addressing akpm's feedback:\n" - "\n" - "- Fix overflowing byte counters on 32-bit. Just like in the existing\n" - " interface files, bytes must be printed as u64 to work with highmem.\n" - "\n" - "- Add documentation in cgroup.txt that explains the memory.stat file\n" - " and its format.\n" - "\n" - "- Rethink item ordering to accomodate potential future additions. The\n" - " ordering now follows both 1) from big picture to detail and 2) from\n" - " stats that reflect on userspace behavior towards stats that reflect\n" - " on kernel heuristics. Both are gradients, and item-by-item ordering\n" - " will still require judgement calls (and some bike shed painting).\n" - "\n" - "Changelog addendum to the original patch:\n" - "\n" - "The output of this file looks as follows:\n" - "\n" - "$ cat memory.stat\n" - "anon 167936\n" - "file 87302144\n" - "file_mapped 0\n" - "file_dirty 0\n" - "file_writeback 0\n" - "inactive_anon 0\n" - "active_anon 155648\n" - "inactive_file 87298048\n" - "active_file 4096\n" - "unevictable 0\n" - "pgfault 636\n" - "pgmajfault 0\n" - "\n" - "The list consists of two sections: statistics reflecting the current\n" - "state of the memory management subsystem, and statistics reflecting\n" - "past events. The items themselves are sorted such that generic big\n" - "picture items come before specific details, and items related to\n" - "userspace activity come before items related to kernel heuristics.\n" - "\n" - "All memory counters are in bytes to eliminate all ambiguity with\n" - "variable page sizes.\n" - "\n" - "There will be more items and statistics added in the future, but this\n" - "is a good initial set to get a minimum of insight into how a cgroup is\n" - "using memory, and the items chosen for now are likely to remain valid\n" - "even with significant changes to the memory management implementation.\n" - "\n" - "Signed-off-by: Johannes Weiner <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org>\n" - "---\n" - " Documentation/cgroup.txt | 56 ++++++++++++++++++++++++++++++++++++++++++++++++\n" - " mm/memcontrol.c | 45 +++++++++++++++++++++++---------------\n" - " 2 files changed, 84 insertions(+), 17 deletions(-)\n" - "\n" - "diff --git a/Documentation/cgroup.txt b/Documentation/cgroup.txt\n" - "index f441564..65b3eac 100644\n" - "--- a/Documentation/cgroup.txt\n" - "+++ b/Documentation/cgroup.txt\n" - "@@ -819,6 +819,62 @@ PAGE_SIZE multiple when read back.\n" - " \t\tthe cgroup. This may not exactly match the number of\n" - " \t\tprocesses killed but should generally be close.\n" - " \n" - "+ memory.stat\n" - "+\n" - "+\tA read-only flat-keyed file which exists on non-root cgroups.\n" - "+\n" - "+\tThis breaks down the cgroup's memory footprint into different\n" - "+\ttypes of memory, type-specific details, and other information\n" - "+\ton the state and past events of the memory management system.\n" - "+\n" - "+\tAll memory amounts are in bytes.\n" - "+\n" - "+\tThe entries are ordered to be human readable, and new entries\n" - "+\tcan show up in the middle. Don't rely on items remaining in a\n" - "+\tfixed position; use the keys to look up specific values!\n" - "+\n" - "+\t anon\n" - "+\n" - "+\t\tAmount of memory used in anonymous mappings such as\n" - "+\t\tbrk(), sbrk(), and mmap(MAP_ANONYMOUS)\n" - "+\n" - "+\t file\n" - "+\n" - "+\t\tAmount of memory used to cache filesystem data,\n" - "+\t\tincluding tmpfs and shared memory.\n" - "+\n" - "+\t file_mapped\n" - "+\n" - "+\t\tAmount of cached filesystem data mapped with mmap()\n" - "+\n" - "+\t file_dirty\n" - "+\n" - "+\t\tAmount of cached filesystem data that was modified but\n" - "+\t\tnot yet written back to disk\n" - "+\n" - "+\t file_writeback\n" - "+\n" - "+\t\tAmount of cached filesystem data that was modified and\n" - "+\t\tis currently being written back to disk\n" - "+\n" - "+\t inactive_anon\n" - "+\t active_anon\n" - "+\t inactive_file\n" - "+\t active_file\n" - "+\t unevictable\n" - "+\n" - "+\t\tAmount of memory, swap-backed and filesystem-backed,\n" - "+\t\ton the internal memory management lists used by the\n" - "+\t\tpage reclaim algorithm\n" - "+\n" - "+\t pgfault\n" - "+\n" - "+\t\tTotal number of page faults incurred\n" - "+\n" - "+\t pgmajfault\n" - "+\n" - "+\t\tNumber of major page faults incurred\n" - "+\n" - " memory.swap.current\n" - " \n" - " \tA read-only single value file which exists on non-root\n" - "diff --git a/mm/memcontrol.c b/mm/memcontrol.c\n" - "index 8645852..cdb51a9 100644\n" - "--- a/mm/memcontrol.c\n" - "+++ b/mm/memcontrol.c\n" - "@@ -5112,32 +5112,43 @@ static int memory_stat_show(struct seq_file *m, void *v)\n" - " \tstruct mem_cgroup *memcg = mem_cgroup_from_css(seq_css(m));\n" - " \tint i;\n" - " \n" - "-\t/* Memory consumer totals */\n" - "-\n" - "-\tseq_printf(m, \"anon %lu\\n\",\n" - "-\t\t tree_stat(memcg, MEM_CGROUP_STAT_RSS) * PAGE_SIZE);\n" - "-\tseq_printf(m, \"file %lu\\n\",\n" - "-\t\t tree_stat(memcg, MEM_CGROUP_STAT_CACHE) * PAGE_SIZE);\n" - "+\t/*\n" - "+\t * Provide statistics on the state of the memory subsystem as\n" - "+\t * well as cumulative event counters that show past behavior.\n" - "+\t *\n" - "+\t * This list is ordered following a combination of these gradients:\n" - "+\t * 1) generic big picture -> specifics and details\n" - "+\t * 2) reflecting userspace activity -> reflecting kernel heuristics\n" - "+\t *\n" - "+\t * Current memory state:\n" - "+\t */\n" - " \n" - "-\t/* Per-consumer breakdowns */\n" - "+\tseq_printf(m, \"anon %llu\\n\",\n" - "+\t\t (u64)tree_stat(memcg, MEM_CGROUP_STAT_RSS) * PAGE_SIZE);\n" - "+\tseq_printf(m, \"file %llu\\n\",\n" - "+\t\t (u64)tree_stat(memcg, MEM_CGROUP_STAT_CACHE) * PAGE_SIZE);\n" - "+\n" - "+\tseq_printf(m, \"file_mapped %llu\\n\",\n" - "+\t\t (u64)tree_stat(memcg, MEM_CGROUP_STAT_FILE_MAPPED) *\n" - "+\t\t PAGE_SIZE);\n" - "+\tseq_printf(m, \"file_dirty %llu\\n\",\n" - "+\t\t (u64)tree_stat(memcg, MEM_CGROUP_STAT_DIRTY) *\n" - "+\t\t PAGE_SIZE);\n" - "+\tseq_printf(m, \"file_writeback %llu\\n\",\n" - "+\t\t (u64)tree_stat(memcg, MEM_CGROUP_STAT_WRITEBACK) *\n" - "+\t\t PAGE_SIZE);\n" - " \n" - " \tfor (i = 0; i < NR_LRU_LISTS; i++) {\n" - " \t\tstruct mem_cgroup *mi;\n" - " \t\tunsigned long val = 0;\n" - " \n" - " \t\tfor_each_mem_cgroup_tree(mi, memcg)\n" - "-\t\t\tval += mem_cgroup_nr_lru_pages(mi, BIT(i)) * PAGE_SIZE;\n" - "-\t\tseq_printf(m, \"%s %lu\\n\", mem_cgroup_lru_names[i], val);\n" - "+\t\t\tval += mem_cgroup_nr_lru_pages(mi, BIT(i));\n" - "+\t\tseq_printf(m, \"%s %llu\\n\",\n" - "+\t\t\t mem_cgroup_lru_names[i], (u64)val * PAGE_SIZE);\n" - " \t}\n" - " \n" - "-\tseq_printf(m, \"file_mapped %lu\\n\",\n" - "-\t\t tree_stat(memcg, MEM_CGROUP_STAT_FILE_MAPPED) * PAGE_SIZE);\n" - "-\tseq_printf(m, \"file_dirty %lu\\n\",\n" - "-\t\t tree_stat(memcg, MEM_CGROUP_STAT_DIRTY) * PAGE_SIZE);\n" - "-\tseq_printf(m, \"file_writeback %lu\\n\",\n" - "-\t\t tree_stat(memcg, MEM_CGROUP_STAT_WRITEBACK) * PAGE_SIZE);\n" - "-\n" - "-\t/* Memory management events */\n" - "+\t/* Accumulated memory events */\n" - " \n" - " \tseq_printf(m, \"pgfault %lu\\n\",\n" - " \t\t tree_events(memcg, MEM_CGROUP_EVENTS_PGFAULT));\n" - "-- \n" - 2.7.0 + memory consumers in before this is released, just in case. -3f7f0e7e0e0b1dd7b1ebb5c60ebd2d6f1285f455ca580899cd92cdc20dd37aee +82a641ca1d8bd4d1610a29d8f9693bbf5ce055feb25ebdebd053fa66cbb434c4
diff --git a/a/1.txt b/N2/1.txt index 5224841..4a978ca 100644 --- a/a/1.txt +++ b/N2/1.txt @@ -18,8 +18,8 @@ relying on items staying at fixed offsets and what we tell them in response when that breaks. I hope that we can at least get the main memory consumers in before this is released, just in case. -From 1be87db16a3895538ce65362b5234ef9c8af308d Mon Sep 17 00:00:00 2001 -From: Johannes Weiner <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org> +>From 1be87db16a3895538ce65362b5234ef9c8af308d Mon Sep 17 00:00:00 2001 +From: Johannes Weiner <hannes@cmpxchg.org> Date: Thu, 14 Jan 2016 10:40:24 -0500 Subject: [PATCH] mm: memcontrol: basic memory statistics in cgroup2 memory controller fix @@ -70,7 +70,7 @@ is a good initial set to get a minimum of insight into how a cgroup is using memory, and the items chosen for now are likely to remain valid even with significant changes to the memory management implementation. -Signed-off-by: Johannes Weiner <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org> +Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> --- Documentation/cgroup.txt | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ mm/memcontrol.c | 45 +++++++++++++++++++++++--------------- diff --git a/a/content_digest b/N2/content_digest index 9d16916..43a32a5 100644 --- a/a/content_digest +++ b/N2/content_digest @@ -1,16 +1,15 @@ "ref\01452722469-24704-1-git-send-email-hannes@cmpxchg.org\0" "ref\020160113144916.03f03766e201b6b04a8a47cc@linux-foundation.org\0" - "ref\020160113144916.03f03766e201b6b04a8a47cc-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org\0" - "From\0Johannes Weiner <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org>\0" + "From\0Johannes Weiner <hannes@cmpxchg.org>\0" "Subject\0Re: [PATCH 0/2] mm: memcontrol: cgroup2 memory statistics\0" "Date\0Thu, 14 Jan 2016 15:24:08 -0500\0" - "To\0Andrew Morton <akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>\0" - "Cc\0Michal Hocko <mhocko-AlSwsSmVLrQ@public.gmane.org>" - Vladimir Davydov <vdavydov-5HdwGun5lf+gSpxsJD1C4w@public.gmane.org> - linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org - cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org - linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org - " kernel-team-b10kYP2dOMg@public.gmane.org\0" + "To\0Andrew Morton <akpm@linux-foundation.org>\0" + "Cc\0Michal Hocko <mhocko@suse.cz>" + Vladimir Davydov <vdavydov@virtuozzo.com> + linux-mm@kvack.org + cgroups@vger.kernel.org + linux-kernel@vger.kernel.org + " kernel-team@fb.com\0" "\00:1\0" "b\0" "On Wed, Jan 13, 2016 at 02:49:16PM -0800, Andrew Morton wrote:\n" @@ -33,8 +32,8 @@ "response when that breaks. I hope that we can at least get the main\n" "memory consumers in before this is released, just in case.\n" "\n" - "From 1be87db16a3895538ce65362b5234ef9c8af308d Mon Sep 17 00:00:00 2001\n" - "From: Johannes Weiner <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org>\n" + ">From 1be87db16a3895538ce65362b5234ef9c8af308d Mon Sep 17 00:00:00 2001\n" + "From: Johannes Weiner <hannes@cmpxchg.org>\n" "Date: Thu, 14 Jan 2016 10:40:24 -0500\n" "Subject: [PATCH] mm: memcontrol: basic memory statistics in cgroup2 memory\n" " controller fix\n" @@ -85,7 +84,7 @@ "using memory, and the items chosen for now are likely to remain valid\n" "even with significant changes to the memory management implementation.\n" "\n" - "Signed-off-by: Johannes Weiner <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org>\n" + "Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>\n" "---\n" " Documentation/cgroup.txt | 56 ++++++++++++++++++++++++++++++++++++++++++++++++\n" " mm/memcontrol.c | 45 +++++++++++++++++++++++---------------\n" @@ -226,4 +225,4 @@ "-- \n" 2.7.0 -3f7f0e7e0e0b1dd7b1ebb5c60ebd2d6f1285f455ca580899cd92cdc20dd37aee +568ffd42dfcbd9bd291c0b6087e39485cc807dddcec13fb8b126cc022cddb943
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.