On Wed, Jan 25, 2006 at 03:04:55AM +1100, Brendan Gregg wrote:
| 
| The way a freshly written file (as opposed to a freshly mounted file)
| changed the number of faults really threw me. Still haven't put my finger
| on why, but I suspect it's a cache placement policy (maybe MPSS - I need

This is probably free-behind kicking in in UFS, which by putting the pages
at the head of the cachelists is causing them to be reused before they can
be reactivated. I'm not a UFS expert (thank goodness?) but there is a way to
turn off UFS' freebehind code to see if it is your culprit.

(As an aside, the resulting behavior isn't UFS' fault but the VM's. It
takes the "free" hint a little TOO seriously and essentially discards the
pages, instead of allowing them to age. It's on the list of things to fix
in the new VM system.)

| to go test this on SPARC where I have trapstat. :)

The only MPSS support for files is for text and data segments.

- Eric

| #!/usr/sbin/dtrace -s
| /* todo: hat_memload_array */
| 
| #pragma D option quiet
| #pragma D option defaultargs
| 
| inline int SCREEN = 21;
| 
| dtrace:::BEGIN
| {
|         lines = SCREEN + 1;
|         secs = $1 ? $1 : 1;
|         counts = $2 ? $2 : -1;
|         first = 1;
|       @hits = sum(0);
|       @miss = sum(0);
| }
| 
| profile:::tick-1sec
| {
|         secs--;
| }
| 
| profile:::tick-1sec
| /first || (secs == 0 && lines > SCREEN)/
| {
|       printf("%10s %10s\n", "HITS", "MISSES");
|       first = 0;
|       lines = 0;
| }
| 
| fbt::segvn_fault:entry,
| fbt::segvn_faulta:entry
| {
|       self->segvn = 1;
| }
| 
| fbt::hat_memload:entry
| /self->segvn && args[2]->p_vnode->v_path != NULL/
| {
|       /*
|        * hat_memload is interesting (thanks Eric L.) as we use it
|        * to track the total number of page creates in segvn, so 
|        * long as our context is segvn_fault. This value minus io
|        * events is used as the hit rate.
|        */
|       @path[execname, stringof(args[2]->p_vnode->v_path)] = count();
|       @hits = sum(1);
| }
| 
| io:::start
| /self->segvn/
| {
|       /* a segvn miss is an io event within a segvn_fault context */
|         @iobytes[execname, args[2]->fi_pathname,
|             args[0]->b_flags & B_READ ? "R" : "W"] = sum(args[0]->b_bcount);
|       @miss = sum(args[0]->b_bcount / `_pagesize);
|       @hits = sum(- (args[0]->b_bcount / `_pagesize));
| }
| 
| fbt::segvn_fault:return,
| fbt::segvn_faulta:return
| /self->segvn/
| {
|       self->segvn = 0;
| }
| 
| profile:::tick-1sec
| /secs == 0/
| {
|       printa("[EMAIL PROTECTED] ", @hits);
|       printa("[EMAIL PROTECTED]", @miss);
|       trunc(@hits);
|       trunc(@miss);
|       @hits = sum(0);
|       @miss = sum(0);
|         secs = $1 ? $1 : 1;
|         lines++;
|         counts--;
| }
| 
| dtrace:::END
| {
|       printf("hat_memload\n-----------\n");
|       printf("%-16s %-50s %8s\n", "CMD", "PATH", "COUNT");
|       printa("%-16s %-50s [EMAIL PROTECTED]", @path);
| 
|         printf("\nio:::start\n----------\n");
|         printf("%-16s %32s %3s %10s\n", "CMD", "FILE", "DIR", "BYTES");
|         printa("%-16s %32s %3s [EMAIL PROTECTED]", @iobytes);
| }


-- 
Eric Lowe       Solaris Kernel Development              Austin, Texas
Sun Microsystems.  We make the net work.                x64155/+1(512)401-1155
_______________________________________________
perf-discuss mailing list
perf-discuss@opensolaris.org

Reply via email to