ììí DTrace ììì ëì íëìì ìì ëìëì
íì ìììí (3ì ìì)
- ëì: DTraceë ììí ìëê ìíëìììì "ìí ì" ëë eventëíì "ìíëí ìì"ëìë ììê ìë ëìêDebuggingìêëíê íë ìë ììì ëì íëìì íëììíìë.
- êì: DTraceë "ììíì, ììì,reattach ìì" ìí ìì ììíìì ìíëìêì íëëë ìê ëìíë ììí ì ìì, íëëì íêìì ìêììë ëíëëì ëêë ìë ììì íìíë ëì ëêìë.
- ìí: DTraceë ìë ììì ììí ìëëì ëìì ëìíë D ììë ììíì, êëìê ìë êìì ëëì ìì ìêíìí ì ììë, ëíìí íëíì ìë, íì ììí operation, íëìì OSì êì eventêì ììí ì ìë ëêìë.
1. êì ë íìì
êë ë ìì
DTraceë2004ë Sun Microsystemsìì Solaris 10ì ìí êëí ëì íëìì íëììíìë. "Dynamic Tracing"ìëë ìëì ììíë, DTraceë ìí ìì ìëìë ìíëìììì"dynamically""íëë"ë ìê, ê íëëê ëëë ëëë ììëììì ìííë ëêìë.
DTraceì íì êì ììë ëìê êë:
- íëë: ìë ëë ìíëììì ëì"êì "ë, ìëì
provider:module:function:nameíììë ííëë. - íëëëìì: ê ìíì eventë ìêíë ìë ëëìë.
- D ìì: DTraceëììíëí ìíëí ììë, Cìììí ëëì êìê ìë.
- ìì: íëëê ëëë ë ìíëë ëììë, ëìí ìì, êë, ìí ëê ëì
ì DTraceê ììíê
êì ëêëì íêë ëííë. straceë ììí ìë ììíêëëê, gdbë íëììëíì íë, perfë ìì ììë ììíë ììíë. DTraceë ìëí íêëìëíì"ììíìíì ìê", "ìíëììì", "ìíë ëìíë" ììí ì ìê íë.
[êì ëê: ëì ìì êíì íì]
strace: ëë ììí ììtekstë ìë -> ëëê, ëì ëìí
gdb: íëìì ìì í ëì -> ìí ìì ììíì ëì
perf: ëë ììë íëìì ììíë ìì ->ììì ëì
ëì: "êìê 5ëì í ëì ìëì ëëìë ëì"ë ìê ìëë?
-> strace: ëë ëì ëìí + ìë
-> gdb: ììí ììë ëìë ëë ììì ìí
-> perf: ìì ìììëcover
[DTrace: ìí ì ìììì ëì]
# ììí ì ìë ìêì 5msë ìêí êìë êë
syscall:::entry { self->t = timestamp; }
syscall:::return /self->t && timestamp - self->t > 5000000/ {
printf("Slow syscall: %s took %d ms", probefunc,
(timestamp - self->t) / 1000000);
}
-> 5ms ìì êë ììí ìë ìì!
-> ììí ëìì ìì!
-> ìì ìë ìì ê ìíìì ì ëì!
íì êì: "êì íìê ëì ììíì ìíì ëìì ìëë"
[ëììêë íì] DTraceì íì êìë"ììíë" ëìì ìë. straceë ëë ììí ììtekstë ìëíì ìëë ëëê ëëìë, DTraceë"5ms ìì êë êìë ìë"ìëë filterë ììíì ìëíëëííë. ëí gdbì ëë DTraceë ììíì ëìì ìëë.
- ìì ëì: DTraceë "êìì ëììì êìì"ì êë. ììëì ìì ìì"ìê ìí ëìë íê ìë ìê!" íê ëìë, ììëì ìì ë ìêììíìíê ìí ìììíì ìëë. êëëì ìíëê,ëìíëìììì<delete_file>ììì êì ìíëë.
2. ìííì ë íì ìë
DTrace ìííì: ìë-ììì êê êì
DTraceì ìííìë íê"ìë ìì"ê"ììì ìì"ìë ëëë, ìììììíêëììëëìíë.
| êì ìì | ìì | ìí |
|---|---|---|
| íëë íìë | ìë | ìë ë ëë êì êë ìì |
| íëëëìì | ìë | ê event ìíì ììíë ìë ëë |
| DTrace êì ëì | ìë | D ìíëíë ììíê ìííë ìëëì |
| ìì | ìë | íëë ëë ì ìíëë êìì ëì |
| ìëì ëë | ììì êê | ìëìì ìëëëí |
| D ìì ìíìë | ììì êê | D ìíëíë ìë VMì bytecodeë ìíì |
DTrace ëì íë: ìíëíìì ìë ìíêì
[1ëê: D ìíëí ìì ë ìíì]
$ dtrace -n 'syscall::open:entry {
printf("Opening: %s", copyinstr(arg0));
}'
|
| D ìíëíë DTrace ìíìëê íì
|
v
[2ëê: íëë ëì ë íìí]
DTrace VM: "syscall::open:entry íëëë ìì!"
|
v
ìë íëë íìëìì íë íëëë íìí
-> íë íëëì "ìì íì íìí" ëë
[3ëê: ëíì ìí]
íëììê open() ììí ì íì
|
v
ìë: syscall::open:entry íëë ëë!
|
v
ëëë ìì ìí: printf("Opening: %s", ...)
|
v
ëìíê ëíë ììë íí ììì êêìë ìë
[4ëê: êê ìë]
stdoutì "Opening: /etc/passwd" ë ìë
[ëììêë íì] DTraceì íì ììììë ëë"ìë VM"ì ìë. D ìíëíë ìíìí bytecodeë ìì ìëìì ìíëì ìê, DTrace VMìëë ìëëì ììì ìíëë. ì VMì"ëëì ìíì ìíëì ìì" ëí ëí,ëëëëë ìê, ìë íë ëì ìííììì ìì ìëíë.
D ìíëíì êë êì
dtrace -n '
syscall::open:entry <- íëë ìì
/arg0 > 1000/ <- ìê (Predicates)
{ <- ìì ìì
printf("fd=%d", arg0); <- ìíí ìë
}
'
[4êì íì ìì]
Provider: eventì ìì (syscall, fbt, pid ë)
Probe: ììë ììíë êì ì (openì entry/return)
Predicate: profbeê ëëíê ìí ììíì í ìê
Action: probe ëë ì ìíí ëì
[ëììêë íì] D ìíëíì êìëprovider:module:function:name íìì ëëë. predicate(ìê)ì ìëìë êìì íííë, ì ìêì ìì êììë ììììíëë. ìëí ìêë ííëì DTraceìíììì íììë, ììë ëëíì í êìê ììëìë ìëíëê ììëê ëëìë.
- ìì ëì: DTraceì ìë VMì "ììë ëììì ììë"ê êë. ììëëììììë ëìëíìëïììì ííììíê êìíê ììí ì ìë.
3. ìí ëê ë ëêë ëì
DTrace vs SystemTap vs eBPF: ëì íëìì ëê ëê
| ëê íë | DTrace | SystemTap | eBPF |
|---|---|---|---|
| íì | Solaris (2004) | Linux (2005) | Linux (2014) |
| ì íëí | Solaris, macOS, FreeBSD | Linux | Linux |
| ìì | D ìì | Groovy êë ìíëí ìì | C + llvm |
| ìììì | ìë VM (ìëëì) | ìì (ëëê ìë ìì) | verifier (ìë ë) |
| ìëíë | ëì ëì | ìê | êì ëì |
[DTrace (2004ë): ëì íëìììêë]
ìì: Solarisì ìëì ìì ìê,vmìë ììì íë
íê: Linuxìëëì ìì
[SystemTap (2005ë): Linuxë ìí DTraceììí]
ìì: Linuxìì DTrace similarêë ìê
íê: ìë ëëê ìëì ììíì,ìë ëìëë
[eBPF (2014ë~): ììë ëì íëììì íì]
ìì:
- ìë verifierêbytecodeëìì
- llvm êë C êë íê
- ìë êê ëìììììí
- íë ëëìì
[ëììêë íì] DTraceì eBPFì êêë"ìêììêë"ê"íë ììì ìí"ì êêë. DTraceê2004ëì"Dynamic Tracing"ìëë êëìíê ììíê êëííìë, Linuxìë êì ííëì ììë. 2014ë eBPFë DTraceì êëì"íëì êí"ìëêíìë verifierëíí ììììíëìë, llvm êëCìì íêêíì íì Linux íêììì ìììì íìì ëìë.
- ìì ëì: DTraceì eBPFì êêë "ëì ìë"ì êë. 2004ë DTraceë"ëë ëëììì!"ëë íìì ëìì íìë, ìëë(ìë)ì êë ëëì ììë. eBPFë ê ìêì"íëì êëí êêí"ë ëí"ë ììíê ë"ë íìíí êìë.
4. ìë ìì ë êììì íë
ìë ìëëì: êììëì I/O latency spikes ìì ìì
ìí:ë ëìíëìì ìëìì 2ìêì êìê I/O latencyê 100msë ëêë íìì ëëëê ììë. ìì Monitoringììë"latency spikeê ìë"ë êë ì ì ììê, ì ëëë.
DTrace ëì:
// 1ëê: ëë íìììí event ìì
dtrace -n 'vfs:::entry /timestamp - last_io > 10000000/ {
printf("Slow I/O: %s took %d ms", probefunc,
(timestamp - last_io) / 1000000);
last_io = timestamp;
}'
êê: ëë 2ì ìêì flush ìë threadê ìíëëì ëêë fsyncê ëìíê ììë.
êì: backupì ëë ìêëë ìë + ëìíëììì I/O ìììì êì
ëì ìíëìí
- DTrace ìì êëí íê íì: Solaris, macOS, FreeBSDììë êë ëì. Linuxììë SystemTap ëë eBPF íì.
- ììíì ìëíëë ëì: Pertamaëí"ëë event"íë ëì ìëíëê ëìíë. ëëì predicateë íìíì"ëê ìíë event"ë ììíëë íë.
- ëììì ëëíë ìí: ììíì ëìêë ìëì í ìíì ëìë ëìì ííê,Production íêììë ììíê ë ì ìë ëì ëìê durationì ììíë.
ìííí
-
ëë event ìì: ëë syscallì ììíë ììíì êì ëì ìëë ëëìë. ëëì ííë ììíì íìí eventë ììíì íë.
-
DTrace ìíëíë Production ìì êë: ìëíëê ëëëë, ëë ìê êëíë ëì Resource ìëê ëìëë.
-
ìì ëì: DTrace ììì "ëíêì êìì êìê"ì êë. ëíêê íëì ëê ìë ìì êìì ììëììíì ìììíì ìêë êëêë íìí ëìíë ììíë êìë.
5. êëíê ë êë
ìë/ìì êëíê
| êë | ìì ëëíëë | DTrace êë ìì ëì |
|---|---|---|
| ìì íìë | 30~40% | 80~90% |
| íê ìì íì ìê | ìì~ì ì | ì ìê~ì ì |
| ììì ëì êëì | ë |
ìê íì
-
Solaris DTrace Documentation: https://docs.oracle.com/cd/E19253-01/
-
eBPF Documentation (bpftrace): https://bpftrace.org/
-
ìì ëì: DTraceë "ìëì ëìê"ê êë. ëë íìì ìë íìë"ìíë êë ì ìì"ëê íë ììì ëë ì êíë êììë. êëë ëìêì ììíë ìêìëë ìíì ê ìíìì ëë íìíê"ìêì íê êì ìêë"ëììì íìíìë ììí ì ìë.
êë êë ë
| êë ëì | êê ë ìëì ìë |
|---|---|
| eBPF | DTraceì êëìíëììëí ëêë, ìë verifierì llvm êëC êë íêìíí ììíêëìì ìë ëì íëììì êëíê íë. |
| SystemTap | Linuxë ìí DTraceì ìë, ìë ëëê ìëì ììíì,DTraceëë ìì ë ììì ëìíë. |
| perf | ëëì ëì ìë ëêë, íëìì PMCë ìì ììì,DTraceëë ëì ìëíëëìëëìì êëíë. |
| ìë VM | DTraceì ììììë, D ìíëíë ìëëìíë êì ëììì ìííì, ìë ììì ìíì ëìì ìëë íëìììììë. |
ìëìë ìí 3ì ëì ìë
- DTraceë "ëìì DVR"ê êìì.ê ìíëë ëëìììëëìì ìê êì ëëíëíëìë,"ììì 5ë ìì ìëì ììëë%"ë DVRì êëíì ëìì ìëìììê êì íêìììëì ëìí ì ììì.
- êëë DVRì ëë ëì êìíë íëiskê ëê,ììì ìëë ëëìëë, ê"5ë ìì ìë ìì"ìëëë ììë ëëíë êìë, filteringì íììë. 3.ìììëìììëë êì ìííê, DVRì DVRëë ììí íìí êë êëíë êì ëë DTraceì"ëì ëëíë"ì íììë!