Dtrace is one of the best tool to perform dynamic tracing of program execution.
Dtrace has been initially released on Solaris and now it’s ported on Linux.
In this post, I will describe very shortly how to install and configure Dtrace port on an Oracle Linux 6 box with UEK4 Kernel.
First, download dtrace-util and dtrace-util-devel packages. These packages are available at this URL : http://www.oracle.com/technetwork/server-storage/linux/downloads/linux-dtrace-2800968.html. You just have to download the correct releases depending on your UEK kernel version, and your Oracle Linux Distribution.
In my case, I chose “DTrace utilities, Oracle Linux 6 (x86_64)” for UEK4 kernel.
[root@oel6 dtrace]# ls
dtrace-utils-0.5.1-3.el6.x86_64.rpm dtrace-utils-devel-0.5.1-3.el6.x86_64.rpm
Then, I used yum to install both packages, but before you have to configure (if not already done) your yum repo for UEK4 :
[public_ol6_UEKR4]
name=Latest Unbreakable Enterprise Kernel Release 4 for Oracle Linux $releasever ($basearch)
baseurl=http://yum.oracle.com/repo/OracleLinux/OL6/UEKR4/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=$uekr4
Now, install the packages:
[root@oel6 dtrace]# yum localinstall dtrace-utils-*
Loaded plugins: auto-update-debuginfo, refresh-packagekit, security, ulninfo
Setting up Local Package Process
Examining dtrace-utils-0.5.1-3.el6.x86_64.rpm: dtrace-utils-0.5.1-3.el6.x86_64
Marking dtrace-utils-0.5.1-3.el6.x86_64.rpm to be installed
Examining dtrace-utils-devel-0.5.1-3.el6.x86_64.rpm: dtrace-utils-devel-0.5.1-3.el6.x86_64
Marking dtrace-utils-devel-0.5.1-3.el6.x86_64.rpm to be installed
Resolving Dependencies
--> Running transaction check
---> Package dtrace-utils.x86_64 0:0.5.1-3.el6 will be installed
--> Processing Dependency: dtrace-modules-shared-headers for package: dtrace-utils-0.5.1-3.el6.x86_64
--> Processing Dependency: libdtrace-ctf for package: dtrace-utils-0.5.1-3.el6.x86_64
--> Processing Dependency: libdtrace-ctf.so.1(LIBDTRACE_CTF_1.0)(64bit) for package: dtrace-utils-0.5.1-3.el6.x86_64
--> Processing Dependency: libdtrace-ctf.so.1()(64bit) for package: dtrace-utils-0.5.1-3.el6.x86_64
---> Package dtrace-utils-devel.x86_64 0:0.5.1-3.el6 will be installed
--> Processing Dependency: libdtrace-ctf-devel > 0.4.0 for package: dtrace-utils-devel-0.5.1-3.el6.x86_64
--> Running transaction check
---> Package dtrace-modules-shared-headers.x86_64 0:0.5.3-2.el6 will be installed
---> Package libdtrace-ctf.x86_64 0:0.5.0-3.el6 will be installed
---> Package libdtrace-ctf-devel.x86_64 0:0.5.0-3.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==================================================================================================================================================================================================================================================
Package Arch Version Repository Size
==================================================================================================================================================================================================================================================
Installing:
dtrace-utils x86_64 0.5.1-3.el6 /dtrace-utils-0.5.1-3.el6.x86_64 786 k
dtrace-utils-devel x86_64 0.5.1-3.el6 /dtrace-utils-devel-0.5.1-3.el6.x86_64 76 k
Installing for dependencies:
dtrace-modules-shared-headers x86_64 0.5.3-2.el6 public_ol6_UEKR4 30 k
libdtrace-ctf x86_64 0.5.0-3.el6 public_ol6_UEKR4 28 k
libdtrace-ctf-devel x86_64 0.5.0-3.el6 public_ol6_UEKR4 15 k
Transaction Summary
==================================================================================================================================================================================================================================================
Install 5 Package(s)
Total size: 935 k
Total download size: 73 k
Installed size: 1.0 M
Is this ok [y/N]: y
Downloading Packages:
(1/3): dtrace-modules-shared-headers-0.5.3-2.el6.x86_64.rpm | 30 kB 00:00
(2/3): libdtrace-ctf-0.5.0-3.el6.x86_64.rpm | 28 kB 00:00
(3/3): libdtrace-ctf-devel-0.5.0-3.el6.x86_64.rpm
.../...
Installing those packages is not sufficient, you have to install a package containing the kernel modules for dtrace, and as the version of this package depends on your kernel, you have to run the yum command below:
[root@oel6 dtrace]# yum install dtrace-modules-`uname -r`
Loaded plugins: auto-update-debuginfo, refresh-packagekit, security, ulninfo
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package dtrace-modules-4.1.12-37.5.1.el6uek.x86_64 0:0.5.2-1.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==================================================================================================================================================================================================================================================
Package Arch Version Repository Size
==================================================================================================================================================================================================================================================
Installing:
dtrace-modules-4.1.12-37.5.1.el6uek x86_64 0.5.2-1.el6 public_ol6_UEKR4 1.2 M
Transaction Summary
==================================================================================================================================================================================================================================================
Install 1 Package(s)
Total download size: 1.2 M
Installed size: 6.1 M
Is this ok [y/N]: y
Once the packages are installed, you have to load a bunch of modules into the kernel.
You can do that manually by running the command below:
[root@oel6 dtrace]# modprobe -a dtrace profile systrace sdt dt_test
Or, you can configure your Linux box to load those module during startup. In my case, as I run that in a OL6 box, I configured a file in /etc/sysconfig/modules/dtrace.modules and change its permissions.
[root@oel6 dtrace]# cat > /etc/sysconfig/modules/dtrace.modules
#!/bin/sh
if [ ! -c /dev/dtrace/dtrace ] ; then
exec /sbin/modprobe -a dtrace profile systrace sdt dt_test >/dev/null 2>&1
fi
[root@oel6 dtrace]# chmod 755 /etc/sysconfig/modules/dtrace.modules
After a reboot, dtrace runs fine with the root user:
[root@oel6 dtrace]# dtrace -l | wc -l
670
But not with the oracle user:
[oracle@oel6 ~]$ dtrace -l
dtrace: failed to initialize dtrace: DTrace requires additional privileges
To fix that, we have to set two small tricks:
1) Create a dtrace unix group and assign this group to the oracle user (or any user you want to grant dtrace utilization)
[root@oel6 ~]# id -a oracle
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),48(apache),54322(dba)
[root@oel6 ~]# groupadd dtrace
[root@oel6 ~]# usermod -a -G dtrace oracle
[root@oel6 ~]# id -a oracle
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),48(apache),54322(dba),54325(dtrace)
2) Configure the /dev/dtrace/dtrace Unix device to have the correct group ownership:
[root@oel6 ~]# cat /etc/udev/rules.d/10-dtrace.rules
kernel=="dtrace/dtrace", GROUP="dtrace" MODE="0660"
After a last reboot, that works fine even for my oracle user, and I can trace pmon and every process of my Oracle instances:
[oracle@oel6 ~]$ dtrace -l | wc -l
670
[oracle@oel6 ~]$ ps -ef | grep pmon
oracle 3436 1 0 18:16 ? 00:00:00 ora_pmon_orcl11
oracle 3519 3381 0 18:16 pts/0 00:00:00 grep pmon
[oracle@oel6 ~]$ cat test.d
#!/usr/sbin/dtrace -qs
syscall:::entry
/pid == $1/
{
@num[probefunc] = count();
}
[oracle@oel6 ~]$ ./test.d 3436
mmap 1
munmap 1
newfstat 1
getrusage 4
poll 4
times 6
close 19
open 19
read 19
That’s all for today 🙂 .