🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 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 权限才能运行。 ```shell $ 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)`将打印系统调用计数: ```shell $ 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 X*和*FreeBSD* ,或访问http://dtrace.org/,以了解有关`dtrace(1)`实用程序的更多信息。 虽然,`dtrace(1)`比`strace(1)`功能强大得多,因为它具有自己的编程语言。但是,当你要做的只是监视可执行文件的系统调用时,`strace(1)`的用途更加广泛。