#!/usr/sbin/dtrace -ZCs #pragma D option quiet /* This file is part of demos for "Latch, Mutex and beyond" blog http://AndreyNikolaev.wordpress.com Copyright: (c) Andrey S. Nikolaev (Andrey.Nikolaev@rdtex.ru) Trace operating system calls inside the mutex wait. 24.08.2011 */ #include <sys/sem.h> #include <sys/time.h> pid$target::kgxSharedExamine:entry { printf("%s(0x%X,mutex=0x%X,aol=0x%X)\n",probefunc,arg0,arg1,arg2); in_mutex=1; prev_syscall=" "; cntr=0; flag=0; prev_timeout=(long) 0; } pid$target::kgxSharedExamine:return { in_mutex=0; } syscall:::entry /(pid == $target) &&in_mutex/ { cntr++; probefunc==prev_syscall?1:(flag=1); } syscall::pollsys:entry /(pid == $target) &&in_mutex/ { this->timespec=(timestruc_t *)copyin((uintptr_t) arg2 ,sizeof(timestruc_t)); timeout=(long) this->timespec->tv_sec*100+ (long) this->timespec->tv_nsec/1000000; timeout==prev_timeout?1:(flag=1); } syscall::semsys:entry /(pid == $target) &&in_mutex&& ((int)arg0 == 2)/ /* semop syscall - wait until posted */ { timeout=(long)(-1); timeout==prev_timeout?1:(flag=1); } syscall::semsys:entry /(pid == $target) &&in_mutex&& ((int)arg0 == 4)/ /* semtimedop syscall - timed wait */ { this->timespec=(timestruc_t *)copyin((uintptr_t) arg4 ,sizeof(timestruc_t)); timeout=(long) this->timespec->tv_sec*100+ (long) this->timespec->tv_nsec/1000000; timeout==prev_timeout?1:(flag=1); } syscall:::entry /(pid == $target) &&in_mutex&&flag&&(cntr>1)/ { printf(" %s()",prev_syscall); } syscall:::entry /(pid == $target) &&in_mutex&&flag&&(cntr>1)&&((prev_syscall=="pollsys")||(prev_syscall=="semsys"))/ { printf(" timeout=%d ms ",prev_timeout); } syscall:::entry /(pid == $target) &&in_mutex&&flag&&(cntr>2)/ { printf(" call repeated %d times",cntr-1); } syscall:::entry /(pid == $target) &&in_mutex&&flag/ { printf("\n"); flag=0; cntr=1; prev_syscall=probefunc; prev_timeout=timeout; }
syscalls_in_mutex_wait.d
2 Comments »
RSS feed for comments on this post. TrackBack URI
[…] script syscalls_in_mutex_wait.d traces system calls made by Oracle process inside the mutex wait. The script reveals interesting […]
Pingback by Mutex waits. Part II. “Cursor: Pin S” in Oracle 11.2 _mutex_wait_scheme=0. Steps out of shadow. « Latch, mutex and beyond — October 25, 2011 @ 4:23 pm |
[…] in MOS documents. It results in very small CPU consumption during wait. Surprisingly, DTrace shows that there is no exponential behavior with default parameter values. Session repeatedly […]
Pingback by Mutex waits. Part III. Contemporary Oracle wait schemes diversity. « Latch, mutex and beyond — July 30, 2012 @ 12:22 pm |