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 🙂 .
Like this:
Like Loading...
Related
I’ve tried DTrace on Oracle Linux myself (https://mjsoracleblog.wordpress.com/2015/06/08/tracing-oracle-background-processes-with-dtrace-for-linux/). It all looked so promising until you realized that there isn’t an oracle provider for DTrace like on Solaris. I haven’t tried it on Solaris myself but you’ll get 10,000s of functions instead of 670 on OL.
Yes, it’s mentioned in the doc (https://docs.oracle.com/cd/E37670_01/E37355/html/section_mcn_sp4_2n.html) : Other providers, such as the pid provider, the Function Boundary Tracing (fbt) provider, and the providers for the network protocols (ip, iscsi, nfsv3, nfsv4, srp, tcp, and udp), have not yet been implemented.
You don’t have to install the dtrace package by hand: just running dtrace -l should automatically install the modules for you, and load the dtrace.ko core. As of 0.6.0 you don’t need to modprobe anything by hand at all: you can just name modules in /etc/dtrace-modules and have them autoloaded at the same time as DTrace yum installs and loads dtrace.ko itself. In 0.6.1 the modules we consider stable will be named there already.
A side note: I’m afraid DTrace cannot be expected to work perfectly from a non-root user at present, not without extra care: it uses more root-only facilities than just opening the dtrace device, including widespread ptrace()ing, opening of /proc/$pid/map_files, and so forth. Still, it will probably work to some degree, particularly if you eschew dtrace -p or ustack()/usym()/etc on processes you do not own.
Hi Nick,
Thanks for your comments 😉
In my OEL6 box, I had to install the dtrace-utils package because it contains the dtrace binary, but I agree concerning dtrace-modules package which was already installed 😉
About the dtrace version, my OEL6/UEK4.1.12 kernel uses dtrace 0.5.3. I should update my kernel and dtrace package to see if dtrace is upgraded to 0.6.
(Also… if you encounter problems with use this way, please report them! Just because it’s not officially supported doesn’t mean we don’t want it to work. 🙂 )