198 lines
6.6 KiB
Plaintext
198 lines
6.6 KiB
Plaintext
|
$Id: README,v 1.2 2001/08/10 19:23:11 vipin Exp $
|
||
|
|
||
|
This is the README file for the JitterTest (and friends)
|
||
|
program.
|
||
|
|
||
|
This program is used to measure what the jitter of a
|
||
|
real time task would be under "standard" Linux.
|
||
|
|
||
|
More particularly, what is the effect of running
|
||
|
a real time task under Linux with background
|
||
|
JFFS file system activity.
|
||
|
|
||
|
The jitter is measured in milli seconds (ms) from
|
||
|
the expected time of arrival of a signal from a
|
||
|
periodic timer (set by the task) to when the
|
||
|
task actually gets the signal.
|
||
|
|
||
|
This jitter is then stored in a file specified
|
||
|
(or the default output file "jitter.dat").
|
||
|
|
||
|
The data may also be sent out to the console by
|
||
|
writing to /dev/console (See help options. This is
|
||
|
highly desirable specially if you have redirected
|
||
|
your console to the serial port and are storing it
|
||
|
as a minicom log on another computer for later analysis
|
||
|
using some tools provided here).
|
||
|
|
||
|
This is particularly useful if you have a serial
|
||
|
console and are outputting "interesting" info
|
||
|
from inside some kernel task or driver.
|
||
|
(or something as simple as a "df" program running
|
||
|
periodically and redirecting o/p to the console).
|
||
|
|
||
|
One "interesting" thing that I have measured
|
||
|
is the effect of FLASH chip erases on the jitter
|
||
|
of a real time task.
|
||
|
|
||
|
One can do that by putting a printk at the
|
||
|
beginning of the flash erase routine in the MTD
|
||
|
flash chip driver.
|
||
|
|
||
|
Now you will get jitter data interspersed with
|
||
|
flash sector erase events. Other printk's can also
|
||
|
be placed at suspected jitter causing locations in
|
||
|
the system.
|
||
|
|
||
|
|
||
|
|
||
|
EXECUTING THE PROGRAM "JitterTest"
|
||
|
|
||
|
You may specify a file to be read by the
|
||
|
program every time it wakes up (every cycle).
|
||
|
This file is created and filled with some junk
|
||
|
data. The purpose of this is to test the jitter
|
||
|
of the program if it were reading from- say
|
||
|
a JFFS (Journaling Flash File System) file system.
|
||
|
|
||
|
By specifying the complete paths of the read and write
|
||
|
(o/p) files you can test the jitter a POSIX type
|
||
|
real time task will experience under Linux, under
|
||
|
various conditions.
|
||
|
|
||
|
These can be as follows:
|
||
|
|
||
|
1. O/P file on ram file system, no i/p file.
|
||
|
|
||
|
In this case you would presumably generate other
|
||
|
"typical" background activity for your system and
|
||
|
examine the worst case jitter experienced by
|
||
|
a task that is neither reading nor writing to
|
||
|
a file system.
|
||
|
|
||
|
Other cases could be:
|
||
|
|
||
|
2. O/P to ram fs, I/P from JFFS (type) fs:
|
||
|
|
||
|
This is specially useful to test the proper
|
||
|
operation of erase suspend type of operation
|
||
|
in JFFS file systems (with an MTD layer that
|
||
|
supports it).
|
||
|
|
||
|
In this test you would generate some background
|
||
|
write/erase type activity that would generate
|
||
|
chip erases. Since this program is reading from
|
||
|
the same file system, you contrast the latencies
|
||
|
with those obtained with writes going to the same
|
||
|
fs.
|
||
|
|
||
|
3. Both read and writes to (or just write to) JFFS
|
||
|
file system:
|
||
|
|
||
|
Here you would test for latencies experienced by
|
||
|
a program if it were writing (and optionally also
|
||
|
reading) from a JFFS fs.
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
Grabing a kernel profile:
|
||
|
|
||
|
This program can also conditionally grab a kernel profile.
|
||
|
Specify --grab_kprofile on the cmd line as well as
|
||
|
a "threshold" parameter (see help options by -?).
|
||
|
|
||
|
Any jitter greater than this "threshold" will cause the
|
||
|
program to read the /proc/profile file and dump it in
|
||
|
a local file with increasing file numbers. It will also
|
||
|
output the filename at that time to the console file specified.
|
||
|
This will allow you to corelate later in time the various profiles
|
||
|
with data in your console file and what was going on at that time.
|
||
|
|
||
|
These profile files may then be later examined by running them through
|
||
|
ksymoops.
|
||
|
|
||
|
Make sure you specify "profile=2" on the kernel command line
|
||
|
when you boot the kernel if you want to use this functionality.
|
||
|
|
||
|
|
||
|
|
||
|
Signalling the JFFS[2] GC task:
|
||
|
|
||
|
You can also force this program to send a SIGSTOP/SIGCONT to the
|
||
|
JFFS (or JFFS2) gc task by specifing --siggc <pid> on the cmd line.
|
||
|
|
||
|
This will let you investigate the effect of forcing the gc task to
|
||
|
wake up and do its thing when you are not writing to the fs and to
|
||
|
force it to sleep when you want to write to the fs.
|
||
|
|
||
|
These are just various tools to investigate the possibility of
|
||
|
achieving minimal read/write latency when using JFFS[2].
|
||
|
|
||
|
You need to manually do a "ps aux" and look up the PID of the gc
|
||
|
thread and provide it to the program.
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
EXECUTING THE PROGRAM "plotJittervsFill"
|
||
|
|
||
|
This program is a post processing tool that will extract the jitter
|
||
|
times as printed by the JitterTest program in its console log file
|
||
|
as well as the data printed by the "df" command.
|
||
|
|
||
|
This "df" data happens to be in the console log because you will
|
||
|
run the shell file fillJffs2.sh on a console when you are doing
|
||
|
your jitter test.
|
||
|
|
||
|
This shell script copies a specified file to another specified file
|
||
|
every programmable seconds. It also does a "df" and redirects output
|
||
|
to /dev/console where it is mixed with the output from JitterTest.
|
||
|
|
||
|
All this console data is stored on another computer, as all this data
|
||
|
is being outputted to the serial port as you have redirected the console
|
||
|
to the serial port (that is the only guaranteed way to not loose any
|
||
|
console log or printk data).
|
||
|
|
||
|
You can then run this saved console log through this program and it
|
||
|
will output a very nice text file with the %fill in one col and
|
||
|
corrosponding jitter values in the second. gnuplot then does a
|
||
|
beautifull plot of this resulting file showing you graphically the
|
||
|
jitters encountered at different fill % of your JFFS[2] fs.
|
||
|
|
||
|
|
||
|
|
||
|
OTHER COMMENTS:
|
||
|
|
||
|
Use the "-w BYTES" cmd line parameter to simulate your test case.
|
||
|
Not everyone has the same requirements. Someone may want to measure
|
||
|
the jitter of JFFS2 with 500 bytes being written every 500ms. Others
|
||
|
may want to measure the system performance writing 2048 bytes every
|
||
|
5 seconds.
|
||
|
|
||
|
RUNNING MULTIPLE INSTANCES:
|
||
|
|
||
|
Things get real interesting when you run multiple instances of this
|
||
|
program *at the same time*.
|
||
|
|
||
|
You could have one version running as a real time task (by specifing
|
||
|
the priority with the -p cmd line parameter), not interacting with
|
||
|
any fs or at the very least not reading and writing to JFFS[2].
|
||
|
|
||
|
At the same time you could have another version running as a regular
|
||
|
task (by not specifing any priority) but reading and writing to JFFS[2].
|
||
|
|
||
|
This way you can easily measure the blocking performance of the real time
|
||
|
task while another non-real time task interacts with JFFS[2] in the back ground.
|
||
|
|
||
|
You get the idea.
|
||
|
|
||
|
|
||
|
WATCH OUT!
|
||
|
|
||
|
Be particularly careful of running this program as a real time task AND
|
||
|
writing to JFFS[2]. Any blocks will cause your whole system to block till
|
||
|
any garbage collect initiated by writes by this task complete. I have measured
|
||
|
these blocks to be of the order of 40-50 seconds on a reasonably powerful
|
||
|
32 bit embedded system.
|