dtrace

尽管诸如strace(1)和`truss(1)之类的调试实用程序可以跟踪进程产生的系统调用,但是它们可能很慢,因此不适合解决繁忙的 UNIX 系统上的性能问题。另一个名为DTrace的工具可让你在系统范围内查看幕后发生的情况,而无需修改或重新编译任何内容。它还使你可以在生产环境上工作,并动态监视正在运行的程序或服务器进程,同时又不会造成很大的开销。

Tip: 尽管有dtrace(1)有 Linux 版本,但dtrace(1)工具在 macOS 和其他 FreeBSD 变体上效果最佳。

本小节将使用 macOS 自带的dtruss(1)命令行实用程序,它只是一个dtrace(1)脚本,该脚本显示了进程的系统调用,使我们不必编写dtrace(1)代码。请注意,dtrace(1)和dtruss(1)`都需要 root 权限才能运行。

$ sudo dtruss godoc
ioctl(0x3, 0x80086804, 0x7FFEEFBFEC20)         = 0 0
close(0x3)         = 0 0
access("/AppleInternal/XBS/.isChrooted\0", 0x0, 0x0) = -1 Err#2
thread_selfid(0x0, 0x0, 0x0) = 1895378 0
geteuid(0x0, 0x0, 0x0) = 0 0
getegid(0x0, 0x0, 0x0) = 0 0

dtruss(1)的工作方式与strace(1)实用程序相同。与strace(1)类似,当与-c参数一起使用时,dtruss(1)将打印系统调用计数:

$ sudo dtruss -c go run unsafe.go 2>&1
CALL                                        COUNT
access                                          1
bsdthread_register                              1
getuid                                          1
ioctl                                           1
issetugid                                       1
kqueue                                          1
write                                           1
mkdir                                           2
read                                          244
kevent                                        474
fcntl                                         479
lstat64                                       553
psynch_cvsignal                               649
psynch_cvwait                                 654

上面的输出将迅速告知你 Go 代码中的潜在瓶颈,甚至可以帮你比较两个不同的命令行程序的性能。

Tip: 诸如strace(1),dtrace(1)和 dtruss(1)`之类的实用工具需要一段时间适应熟悉,但是这样的工具可以使我们的生活变得更加轻松和舒适,我强烈建议你立即开始学习至少一个这样的工具。

你可以阅读 Brendan Gregg 和 Jim Mauro 写的DTrace: Dynamic Tracing in Oracle Solaris, Mac OS XFreeBSD ,或访问http://dtrace.org/,以了解有关`dtrace(1)`实用程序的更多信息。

虽然,dtrace(1)strace(1)功能强大得多,因为它具有自己的编程语言。但是,当你要做的只是监视可执行文件的系统调用时,strace(1)的用途更加广泛。

Last updated