* add mlockall option to cyclictest, et al
@ 2008-05-09 18:55 Clark Williams
2008-05-09 21:04 ` Sven-Thorsten Dietrich
2008-05-10 19:21 ` Robert de Vries
0 siblings, 2 replies; 7+ messages in thread
From: Clark Williams @ 2008-05-09 18:55 UTC (permalink / raw)
To: Thomas Gleixner; +Cc: Arnaldo Carvalho de Melo, Luis Claudio Goncalves, RT
[-- Attachment #1: Type: text/plain, Size: 469 bytes --]
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Thomas,
Got a couple of requests for mlockall() in cyclictest, so I added an --mlockall
option to cyclictest, signaltest and pi_stress.
Patches attached.
Clark
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org
iEYEARECAAYFAkgknisACgkQqA4JVb61b9e+5wCgkfnFdvymSXLsxQ9AwhVU9te+
J9YAniZv12Xj1r6epjft/L/CLv3P1Yl4
=ismw
-----END PGP SIGNATURE-----
[-- Attachment #2: 0001-added-mlockall-option.patch --]
[-- Type: text/plain, Size: 7246 bytes --]
From c4a44c163df791ec3f42075e587685fa7e5b031d Mon Sep 17 00:00:00 2001
From: Clark Williams <williams@redhat.com>
Date: Fri, 9 May 2008 13:28:50 -0500
Subject: [PATCH] added mlockall option
Signed-off-by: Clark Williams <williams@redhat.com>
---
.gitignore | 4 ++++
src/cyclictest/cyclictest.c | 18 +++++++++++++++++-
src/pi_tests/pi_stress.c | 18 ++++++++++++++++++
src/signaltest/signaltest.c | 16 +++++++++++++++-
4 files changed, 54 insertions(+), 2 deletions(-)
diff --git a/.gitignore b/.gitignore
index fd84086..f09d8dc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,7 @@ releases
BUILD
RPMS
SRPMS
+classic_pi
+pi_stress
+cyclictest
+signaltest
diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c
index 9223549..cf9b7c6 100644
--- a/src/cyclictest/cyclictest.c
+++ b/src/cyclictest/cyclictest.c
@@ -30,6 +30,7 @@
#include <sys/types.h>
#include <sys/time.h>
#include <sys/utsname.h>
+#include <sys/mman.h>
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
@@ -119,6 +120,7 @@ static int ftrace = 0;
static int kernelversion;
static int verbose = 0;
static int oscope_reduction = 1;
+static int lockall = 0;
/* Backup of kernel variables that we modify */
static struct kvars {
@@ -478,6 +480,7 @@ static void display_help(void)
"-s --system use sys_nanosleep and sys_setitimer\n"
"-t --threads one thread per available processor\n"
"-t NUM --threads=NUM number of threads: without -t default=1\n"
+ "-m --mlockall lock current and future memory allocations\n"
"-v --verbose output values on stdout for statistics\n"
" format: n:c:v n=tasknum c=count v=value in us\n");
exit(0);
@@ -531,11 +534,12 @@ static void process_options (int argc, char *argv[])
{"relative", no_argument, NULL, 'r'},
{"system", no_argument, NULL, 's'},
{"threads", optional_argument, NULL, 't'},
+ {"mlockall", no_argument, NULL, 'm' },
{"verbose", no_argument, NULL, 'v'},
{"help", no_argument, NULL, '?'},
{NULL, 0, NULL, 0}
};
- int c = getopt_long (argc, argv, "a::b:c:d:fi:l:no:p:qrst::v",
+ int c = getopt_long (argc, argv, "a::b:c:d:fi:l:no:p:qrsmt::v",
long_options, &option_index);
if (c == -1)
break;
@@ -566,6 +570,7 @@ static void process_options (int argc, char *argv[])
num_threads = max_cpus;
break;
case 'v': verbose = 1; break;
+ case 'm': lockall = 1; break;
case '?': error = 1; break;
}
}
@@ -696,6 +701,13 @@ int main(int argc, char **argv)
process_options(argc, argv);
+ /* lock all memory (prevent paging) */
+ if (lockall)
+ if (mlockall(MCL_CURRENT|MCL_FUTURE) == -1) {
+ perror("mlockall");
+ goto out;
+ }
+
kernelversion = check_kernel();
if (kernelversion == KV_NOT_26)
@@ -809,6 +821,10 @@ int main(int argc, char **argv)
free(par);
out:
+ /* unlock everything */
+ if (lockall)
+ munlockall();
+
/* Be a nice program, cleanup */
if (kernelversion != KV_26_CURR)
restorekernvars();
diff --git a/src/pi_tests/pi_stress.c b/src/pi_tests/pi_stress.c
index a0599ad..052c476 100644
--- a/src/pi_tests/pi_stress.c
+++ b/src/pi_tests/pi_stress.c
@@ -51,6 +51,7 @@
#include <signal.h>
#include <getopt.h>
#include <sys/types.h>
+#include <sys/mman.h>
#include <sys/wait.h>
#include <termios.h>
@@ -128,6 +129,9 @@ int have_errors = 0;
// force running on one cpu
int uniprocessor = 0;
+// lock all memory
+int lockall = 0;
+
// command line options
struct option options [] = {
{ "duration", required_argument, NULL, 't' },
@@ -141,6 +145,7 @@ struct option options [] = {
{ "prompt", no_argument, NULL, 'p'},
{ "debug", no_argument, NULL, 'd'},
{ "version", no_argument, NULL, 'V'},
+ { "mlockall", no_argument, NULL, 'm'},
{ "help", no_argument, NULL, 'h'},
{ NULL, 0, NULL, 0},
};
@@ -234,6 +239,13 @@ main (int argc, char **argv)
/* process command line arguments */
process_command_line(argc, argv);
+ /* lock memory */
+ if (lockall)
+ if (mlockall(MCL_CURRENT|MCL_FUTURE) == -1) {
+ error("mlockall failed\n");
+ return FAILURE;
+ }
+
// boost main's priority (so we keep running) :)
prio_min = sched_get_priority_min(policy);
thread_param.sched_priority = MAIN_PRIO();
@@ -328,6 +340,8 @@ main (int argc, char **argv)
}
finish = time(NULL);
summary();
+ if (lockall)
+ munlockall();
exit(retval);
}
@@ -852,6 +866,7 @@ usage(void)
printf("\t--rr\t\t- use SCHED_RR for test threads [SCHED_FIFO]\n");
printf("\t--prompt\t- prompt before starting the test\n");
printf("\t--uniprocessor\t- force all threads to run on one processor\n");
+ printf("\t--mlockall\t- lock current and future memory\n");
printf("\t--debug\t\t- turn on debug prints\n");
printf("\t--version\t- print version number on output\n");
printf("\t--help\t\t- print this message\n");
@@ -1083,6 +1098,9 @@ process_command_line(int argc, char **argv)
case 'u':
uniprocessor = 1;
break;
+ case 'm':
+ lockall = 1;
+ break;
}
}
}
diff --git a/src/signaltest/signaltest.c b/src/signaltest/signaltest.c
index 963cc38..eef7d6e 100644
--- a/src/signaltest/signaltest.c
+++ b/src/signaltest/signaltest.c
@@ -25,6 +25,7 @@
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
+#include <sys/mman.h>
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
@@ -207,6 +208,7 @@ static void display_help(void)
"-p PRIO --prio=PRIO priority of highest prio thread\n"
"-q --quiet print only a summary on exit\n"
"-t NUM --threads=NUM number of threads: default=2\n"
+ "-m --mlockall lock current and future memory allocations\n"
"-v --verbose output values on stdout for statistics\n"
" format: n:c:v n=tasknum c=count v=value in us\n");
exit(0);
@@ -217,6 +219,7 @@ static int num_threads = 2;
static int max_cycles;
static int verbose;
static int quiet;
+static int lockall = 0;
/* Process commandline options */
static void process_options (int argc, char *argv[])
@@ -235,7 +238,7 @@ static void process_options (int argc, char *argv[])
{"help", no_argument, NULL, '?'},
{NULL, 0, NULL, 0}
};
- int c = getopt_long (argc, argv, "b:c:d:i:l:np:qrst:v",
+ int c = getopt_long (argc, argv, "b:c:d:i:l:np:qrsmt:v",
long_options, &option_index);
if (c == -1)
break;
@@ -245,6 +248,7 @@ static void process_options (int argc, char *argv[])
case 'p': priority = atoi(optarg); break;
case 'q': quiet = 1; break;
case 't': num_threads = atoi(optarg); break;
+ case 'm': lockall = 1; break;
case 'v': verbose = 1; break;
case '?': error = 1; break;
}
@@ -317,6 +321,13 @@ int main(int argc, char **argv)
process_options(argc, argv);
+ /* lock all memory (prevent paging) */
+ if (lockall)
+ if (mlockall(MCL_CURRENT|MCL_FUTURE) == -1) {
+ perror("mlockall");
+ goto out;
+ }
+
check_kernel();
sigemptyset(&sigset);
@@ -417,5 +428,8 @@ int main(int argc, char **argv)
outpar:
free(par);
out:
+ if (lockall)
+ munlockall();
+
exit(ret);
}
--
1.5.4.5
[-- Attachment #3: 0002-updated-man-pages-for-mlockall-option.patch --]
[-- Type: text/plain, Size: 2283 bytes --]
From f6db792ba42908b78f31d3a16cf5c170c29085b7 Mon Sep 17 00:00:00 2001
From: Clark Williams <williams@redhat.com>
Date: Fri, 9 May 2008 13:40:08 -0500
Subject: [PATCH] updated man pages for --mlockall option
Signed-off-by: Clark Williams <williams@redhat.com>
---
src/cyclictest/cyclictest.8 | 3 +++
src/pi_tests/pi_stress.8 | 6 +++++-
2 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/src/cyclictest/cyclictest.8 b/src/cyclictest/cyclictest.8
index 29a232f..71cca33 100644
--- a/src/cyclictest/cyclictest.8
+++ b/src/cyclictest/cyclictest.8
@@ -86,6 +86,9 @@ Use sys_nanosleep and sys_setitimer instead of posix timers. Note, that -s can o
Set the number of test threads (default is 1). Create NUM test threads. If NUM is not specifed, NUM is set to
the number of available CPUs. See -d, -i and -p for further information.
.TP
+.B \-m, \-\-mlockall
+Lock current an future memory allocations to prevent being paged out
+.TP
.B \-v, \-\-verbose
Output values on stdout for statistics. This option is used to gather statistical information about the latency distribution. The output is sent to stdout. The output format is:
diff --git a/src/pi_tests/pi_stress.8 b/src/pi_tests/pi_stress.8
index 059ee52..3723671 100644
--- a/src/pi_tests/pi_stress.8
+++ b/src/pi_tests/pi_stress.8
@@ -10,7 +10,7 @@
pi_stress \- a stress test for POSIX Priority Inheritance mutexes
.\"}}}
.\"{{{ Synopsis
-.\" Usage: pi_stress [-i n ] [-g n] [-v] [-d] [-s] [-r] [-p] [-u]
+.\" Usage: pi_stress [-i n ] [-g n] [-v] [-d] [-s] [-r] [-p] [-u] [-m]
.SH SYNOPSIS
.B pi_stress
.RB [ \-i|--inversions
@@ -24,6 +24,7 @@ pi_stress \- a stress test for POSIX Priority Inheritance mutexes
.RB [ \-s|--signal ]
.RB [ \-r|--rr ]
.RB [ \-p|--prompt ]
+.RB [ \-m|--mlockall ]
.RB [ \-u|--uniprocessor ]
.br
.\" help
@@ -70,6 +71,9 @@ Prompt before actually starting the stress test
Run all threads on one processor. The default is to run all inversion
group threads on one processor and the admin threads (reporting
thread, keyboard reader, etc.) on a different processor.
+.IP \m|--mlockall
+Call mlockall to lock currnet and future memory allocations and
+prevent being paged out
.IP -h|--help
Display a short help message and options.
.SH CAVEATS
--
1.5.4.5
[-- Attachment #4: 0003-fixed-formating-damage.patch --]
[-- Type: text/plain, Size: 1037 bytes --]
From 5587d442ee5eba79325e842f5ecc70ce6fe74817 Mon Sep 17 00:00:00 2001
From: Clark Williams <williams@redhat.com>
Date: Fri, 9 May 2008 13:43:55 -0500
Subject: [PATCH] fixed formating damage
Signed-off-by: Clark Williams <williams@redhat.com>
---
src/cyclictest/cyclictest.8 | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/cyclictest/cyclictest.8 b/src/cyclictest/cyclictest.8
index 71cca33..91bf2a8 100644
--- a/src/cyclictest/cyclictest.8
+++ b/src/cyclictest/cyclictest.8
@@ -16,7 +16,7 @@
cyclictest \- High resolution test program
.SH SYNOPSIS
.B cyclictest
-.RI "[ -hnqrsv ] [\-a " proc " ] [\-b " usec " ] [\-c " clock " ] [\-d " dist " ] [\-i " intv " ] [\-l " loop " ] [\-o " red " ] [\-p " prio " ] [\-t " num " ] "
+.RI "[ -hnqrsv ] [\-a " proc " ] [\-b " usec " ] [\-c " clock " ] [\-d " dist " ] [\-i " intv " ] [\-l " loop " ] [\-o " red " ] [\-p " prio " ] [\-t " num " ] [\-m]"
.\" .SH DESCRIPTION
.\" This manual page documents briefly the
.\" .B cyclictest commands.
--
1.5.4.5
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: add mlockall option to cyclictest, et al
2008-05-09 18:55 add mlockall option to cyclictest, et al Clark Williams
@ 2008-05-09 21:04 ` Sven-Thorsten Dietrich
2008-05-10 19:21 ` Robert de Vries
1 sibling, 0 replies; 7+ messages in thread
From: Sven-Thorsten Dietrich @ 2008-05-09 21:04 UTC (permalink / raw)
To: Clark Williams, linux-rt-users-owner, Thomas Gleixner
Cc: Arnaldo Carvalho de Melo, Luis Claudio Goncalves, RT
Ack.
I was just telling jcm yesterday (at the SF RT summit), that this needed to be done.
We have definite evidence of major page faults on cyclictest, and consequent spikes.
(its opaque for far, why a small, and high prio process should become swap fodder to begin with)
Sven
Sent via BlackBerry by AT&T
-----Original Message-----
From: Clark Williams <clark.williams@gmail.com>
Date: Fri, 09 May 2008 13:55:40
To:Thomas Gleixner <tglx@linutronix.de>
Cc:Arnaldo Carvalho de Melo <acme@ghostprotocols.net>,Luis Claudio Goncalves <lclaudio@uudg.org>,RT <linux-rt-users@vger.kernel.org>
Subject: add mlockall option to cyclictest, et al
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Thomas,
Got a couple of requests for mlockall() in cyclictest, so I added an --mlockall
option to cyclictest, signaltest and pi_stress.
Patches attached.
Clark
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org
iEYEARECAAYFAkgknisACgkQqA4JVb61b9e+5wCgkfnFdvymSXLsxQ9AwhVU9te+
J9YAniZv12Xj1r6epjft/L/CLv3P1Yl4
=ismw
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: add mlockall option to cyclictest, et al
2008-05-09 18:55 add mlockall option to cyclictest, et al Clark Williams
2008-05-09 21:04 ` Sven-Thorsten Dietrich
@ 2008-05-10 19:21 ` Robert de Vries
2008-05-10 19:30 ` Clark Williams
1 sibling, 1 reply; 7+ messages in thread
From: Robert de Vries @ 2008-05-10 19:21 UTC (permalink / raw)
To: Clark Williams
Cc: Thomas Gleixner, Arnaldo Carvalho de Melo, Luis Claudio Goncalves,
RT
Clark Williams wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Thomas,
>
> Got a couple of requests for mlockall() in cyclictest, so I added an --mlockall
> option to cyclictest, signaltest and pi_stress.
>
One small remark: it would be better to do the mlockall() by default. As
far as I know this should be done always for real-time applications.
I am actually surprised that it is not done already. It is also
mentioned in the Howto build an RT-application on the RT linux wiki.
Robert
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: add mlockall option to cyclictest, et al
2008-05-10 19:21 ` Robert de Vries
@ 2008-05-10 19:30 ` Clark Williams
2008-05-25 21:22 ` Thomas Gleixner
0 siblings, 1 reply; 7+ messages in thread
From: Clark Williams @ 2008-05-10 19:30 UTC (permalink / raw)
To: Robert de Vries
Cc: Thomas Gleixner, Arnaldo Carvalho de Melo, Luis Claudio Goncalves,
RT
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Robert de Vries wrote:
> Clark Williams wrote:
>> -----BEGIN PGP SIGNED MESSAGE-----
>> Hash: SHA1
>>
>> Thomas,
>>
>> Got a couple of requests for mlockall() in cyclictest, so I added an
>> --mlockall
>> option to cyclictest, signaltest and pi_stress.
>>
> One small remark: it would be better to do the mlockall() by default. As
> far as I know this should be done always for real-time applications.
> I am actually surprised that it is not done already. It is also
> mentioned in the Howto build an RT-application on the RT linux wiki.
>
> Robert
>
>
I thought about that, but figured it would be better just to have the option rather
than change long-standing behavior.
It's Thomas's call though :)
Clark
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org
iEYEARECAAYFAkgl99sACgkQqA4JVb61b9eV4gCgiIs5QHocKBRHyOsGlMw+F5BA
PuUAnRo5+9oeO5oMFjq55JUxaR7dBI2b
=pefi
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: add mlockall option to cyclictest, et al
2008-05-10 19:30 ` Clark Williams
@ 2008-05-25 21:22 ` Thomas Gleixner
2008-07-08 8:49 ` Daniel Gollub
0 siblings, 1 reply; 7+ messages in thread
From: Thomas Gleixner @ 2008-05-25 21:22 UTC (permalink / raw)
To: Clark Williams
Cc: Robert de Vries, Arnaldo Carvalho de Melo, Luis Claudio Goncalves,
RT
On Sat, 10 May 2008, Clark Williams wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Robert de Vries wrote:
> > Clark Williams wrote:
> >> -----BEGIN PGP SIGNED MESSAGE-----
> >> Hash: SHA1
> >>
> >> Thomas,
> >>
> >> Got a couple of requests for mlockall() in cyclictest, so I added an
> >> --mlockall
> >> option to cyclictest, signaltest and pi_stress.
> >>
> > One small remark: it would be better to do the mlockall() by default. As
> > far as I know this should be done always for real-time applications.
> > I am actually surprised that it is not done already. It is also
> > mentioned in the Howto build an RT-application on the RT linux wiki.
> >
> > Robert
> >
> >
>
> I thought about that, but figured it would be better just to have the option rather
> than change long-standing behavior.
>
> It's Thomas's call though :)
I prefer an option. That gives the mm folks less of an excuse why they
swap out hot memory :)
Thanks,
tglx
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: add mlockall option to cyclictest, et al
2008-05-25 21:22 ` Thomas Gleixner
@ 2008-07-08 8:49 ` Daniel Gollub
2008-07-09 13:10 ` Thomas Gleixner
0 siblings, 1 reply; 7+ messages in thread
From: Daniel Gollub @ 2008-07-08 8:49 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Clark Williams, Robert de Vries, Arnaldo Carvalho de Melo,
Luis Claudio Goncalves, RT
On Sunday 25 May 2008 23:22:22 Thomas Gleixner wrote:
> On Sat, 10 May 2008, Clark Williams wrote:
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA1
> >
> > Robert de Vries wrote:
> > > Clark Williams wrote:
> > >> -----BEGIN PGP SIGNED MESSAGE-----
> > >> Hash: SHA1
> > >>
> > >> Thomas,
> > >>
> > >> Got a couple of requests for mlockall() in cyclictest, so I added an
> > >> --mlockall
> > >> option to cyclictest, signaltest and pi_stress.
> > >
> > > One small remark: it would be better to do the mlockall() by default.
> > > As far as I know this should be done always for real-time applications.
> > > I am actually surprised that it is not done already. It is also
> > > mentioned in the Howto build an RT-application on the RT linux wiki.
> > >
> > > Robert
> >
> > I thought about that, but figured it would be better just to have the
> > option rather than change long-standing behavior.
> >
> > It's Thomas's call though :)
>
> I prefer an option. That gives the mm folks less of an excuse why they
> swap out hot memory :)
Hi Thomas,
unfortunately this nice feature didn't made it into rt-tests 0.23 release. Is
there any plan to include this for upcoming rt-tests releases?
best regards,
Daniel
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: add mlockall option to cyclictest, et al
2008-07-08 8:49 ` Daniel Gollub
@ 2008-07-09 13:10 ` Thomas Gleixner
0 siblings, 0 replies; 7+ messages in thread
From: Thomas Gleixner @ 2008-07-09 13:10 UTC (permalink / raw)
To: Daniel Gollub
Cc: Clark Williams, Robert de Vries, Arnaldo Carvalho de Melo,
Luis Claudio Goncalves, RT
On Tue, 8 Jul 2008, Daniel Gollub wrote:
> > > >> Got a couple of requests for mlockall() in cyclictest, so I added an
> > > >> --mlockall
> > > >> option to cyclictest, signaltest and pi_stress.
> > > >
> > > > One small remark: it would be better to do the mlockall() by default.
> > > > As far as I know this should be done always for real-time applications.
> > > > I am actually surprised that it is not done already. It is also
> > > > mentioned in the Howto build an RT-application on the RT linux wiki.
> > > >
> > > > Robert
> > >
> > > I thought about that, but figured it would be better just to have the
> > > option rather than change long-standing behavior.
Right.
Nope. We dont want to change the applications default behaviour.
Also mlockall is only relevant if your system supports swap.
> > >
> > > It's Thomas's call though :)
> >
> > I prefer an option. That gives the mm folks less of an excuse why they
> > swap out hot memory :)
Hehe
> Hi Thomas,
>
> unfortunately this nice feature didn't made it into rt-tests 0.23 release. Is
> there any plan to include this for upcoming rt-tests releases?
Yup. Thanks for the reminder. It just got lost in my ever growing
inbox :(
Thanks,
tglx
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2008-07-09 13:10 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-05-09 18:55 add mlockall option to cyclictest, et al Clark Williams
2008-05-09 21:04 ` Sven-Thorsten Dietrich
2008-05-10 19:21 ` Robert de Vries
2008-05-10 19:30 ` Clark Williams
2008-05-25 21:22 ` Thomas Gleixner
2008-07-08 8:49 ` Daniel Gollub
2008-07-09 13:10 ` Thomas Gleixner
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.