Goodbye World
Mar 9, 2025
We are digging into a superpower inside your Linux Kernel. How eBPF works, and how anyone can take advantage of it.
Sponsored By:
- Tailscale: Tailscale is a programmable networking software that is private and secure by default - get it free on up to 100 devices!
- 1Password Extended Access Management: 1Password Extended Access Management is a device trust solution for companies with Okta, and they ensure that if a device isn't trusted and secure, it can't log into your cloud apps.
- River: River is the most trusted place in the U.S. for individuals and businesses to buy, sell, send, and receive Bitcoin.
Links:
- 💥 Gets Sats Quick and Easy with Strike
- 📻 LINUX Unplugged on Fountain.FM
- eBPF Perf Tools 2019 | SCaLE 17x
- SCALE2019_eBPF_Perf_Tools.pdf
- Oracle Releases DTrace 2.0.0-1.14 For Linux Systems
- Gentoo Linux Touts DTrace 2.0 Support
- bpftrace (DTrace 2.0) for Linux 2018
- Full-system dynamic tracing on Linux using eBPF and bpftrace
- A thorough introduction to eBPF
- BCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more — The BPF Compiler Collection: BCC or BPF Compiler Collection is a set of tools leveraging eBPF for kernel tracing, Linux IO analysis, networking, monitoring, and more.
- BCC Tutorial
- xdp-tools: Utilities and example programs for use with XDP
- ply: a dynamic tracer for Linux
- Liam's Multi-Monitor Setup
- Pick: netop — Network Top -- Help you monitor network traffic with bpf
- Pick: bpftune — bpftune aims to provide lightweight, always-on auto-tuning of system behaviour.
Transcript
WEBVTT
00:00:00.005 --> 00:00:04.085
Enhanced BPF is another hotness of Linux for the last couple of years.
00:00:04.945 --> 00:00:09.105
And when the patches were first added to Linux, the lead developer,
00:00:09.205 --> 00:00:13.265
Alexei Storitov, said this allows you to do crazy things.
00:00:13.765 --> 00:00:17.485
This is normally the words you don't tell Linus when you want him to accept
00:00:17.485 --> 00:00:20.905
patches into the kernel, but fortunately the patches were accepted.
00:00:21.585 --> 00:00:25.645
Enhanced BPF puts a virtual machine in the kernel that we can program from user space.
00:00:36.845 --> 00:00:41.605
Hello, friends, and welcome back to your weekly Linux talk show. My name is Chris.
00:00:41.745 --> 00:00:42.565
My name is Wes.
00:00:42.745 --> 00:00:43.465
And my name is Brent.
00:00:44.125 --> 00:00:48.425
Well, hello, gentlemen. Today, we're digging into a superpower that is inside
00:00:48.425 --> 00:00:50.085
all of our Linux kernels.
00:00:50.305 --> 00:00:54.945
We're going to talk about how eBPF works and how anyone can take advantage of it.
00:00:55.065 --> 00:00:57.365
Then we're going to round out the show with some great feedback,
00:00:57.365 --> 00:01:02.145
some picks, and a lot more. It is a special out-of-time episode.
00:01:02.145 --> 00:01:06.525
As you listen to this right now, we are at Planet Nix and Scale.
00:01:06.765 --> 00:01:08.505
So this is an episode in between.
00:01:08.965 --> 00:01:12.245
You're going to get all our Planet Nix and Scale coverage coming soon,
00:01:12.245 --> 00:01:17.105
but we wanted to take a moment in between episodes and do something kind of
00:01:17.105 --> 00:01:19.265
fun and really dig in and get technical.
00:01:20.085 --> 00:01:23.305
But first, I want to say a big good morning to our friends at TailScale.
00:01:23.945 --> 00:01:28.505
TailScale.com slash unplugged. They are the easiest way to connect your devices
00:01:28.505 --> 00:01:31.325
and services to each other wherever they are.
00:01:31.525 --> 00:01:35.705
It is modern networking. It's a flat mesh network that is protected by...
00:01:35.705 --> 00:01:36.565
Waggaard.
00:01:36.765 --> 00:01:42.725
That's right. And it is so fast, so quick to get going, and it gives you superpowers.
00:01:43.025 --> 00:01:46.145
Not only do you get a flat mesh network across complex networks,
00:01:46.245 --> 00:01:49.465
so maybe you have multiple data centers or VPSs, or you've got mobile devices,
00:01:49.525 --> 00:01:53.745
or you've got double carrier grade NAT, it'll smooth all of that out.
00:01:54.025 --> 00:01:57.945
That's fantastic. But then there's also a whole suite of tools that make it
00:01:57.945 --> 00:01:58.965
really convenient to use.
00:01:59.105 --> 00:02:02.505
Sort of like AirDrop for your entire Tailnet, including like your Android device
00:02:02.505 --> 00:02:04.265
and your Linux device, so you can send files around.
00:02:04.465 --> 00:02:07.485
They will manage your SSH keys through your Tailnet for you,
00:02:07.485 --> 00:02:10.285
so you can just log into all your individual devices. You don't have to manually
00:02:10.285 --> 00:02:11.925
copy keys around like an animal.
00:02:12.405 --> 00:02:16.585
And they also offer more advanced features, so you can set up ACLs and really
00:02:16.585 --> 00:02:19.525
manage the system and lock down only certain things to certain people.
00:02:19.765 --> 00:02:23.265
And when you try it now, when you go to tailscale.com slash unplugged,
00:02:23.365 --> 00:02:26.125
you get it for free up to 100 devices and three users.
00:02:26.765 --> 00:02:30.405
No credit card required. I mean, you can really cook with 100 devices,
00:02:30.405 --> 00:02:33.545
and then maybe you'll discover it's great to bring to work too.
00:02:33.665 --> 00:02:36.185
Thousands of companies like Instacart, Hugging Face, Duolingo,
00:02:36.325 --> 00:02:40.385
Jupyter Broadcasting, and many others use Tailscale, and we love it.
00:02:40.565 --> 00:02:43.545
Try one for yourself. Go get yourself a little Tailscale right now.
00:02:43.725 --> 00:02:45.985
You're going to love the way it tastes, and you're going to love how easy it
00:02:45.985 --> 00:02:49.545
is to get going. If you've got five minutes, you'll probably get it running on three devices.
00:02:49.785 --> 00:02:55.465
I have no inbound ports on any of my firewalls. Talescale.com slash unplugged.
00:02:58.187 --> 00:03:02.207
Well, like I mentioned, we are at Planet Nix and Scale right now.
00:03:02.907 --> 00:03:09.627
But we did think it was sort of a perfect out-of-time episode because we really
00:03:09.627 --> 00:03:15.147
first got excited about eBPF at Scale back in 2019?
00:03:15.707 --> 00:03:17.207
Yeah, a million years ago.
00:03:17.627 --> 00:03:25.327
And it was a great presentation that really just brought home to us how powerful this was going to be.
00:03:25.587 --> 00:03:28.947
Yeah, you heard from the man himself, Brendan Gregg. observability,
00:03:29.187 --> 00:03:33.367
performance, tracing, guru, eBPF was still kind of new then.
00:03:33.607 --> 00:03:38.087
He's kind of well-known. You've maybe seen his famous video online using D-Trace
00:03:38.087 --> 00:03:40.667
to show how hard drives don't like it when you yell at them.
00:03:41.567 --> 00:03:46.207
So, you know, has deep insight into this area and was, even in 2019 and earlier,
00:03:46.447 --> 00:03:48.947
was already getting excited about eBPF.
00:03:49.067 --> 00:03:55.407
So it's kind of neat to look back now as like a whole giant marketplace of eBPF-based,
00:03:56.147 --> 00:03:57.387
observability tools now exist.
00:03:57.387 --> 00:04:01.367
And the name is sort of a misnomer, right? Because it sounds like a packet filter.
00:04:01.927 --> 00:04:04.927
And so you think, well, how? Okay, what is this a firewall, guys?
00:04:05.167 --> 00:04:08.527
No, no, no. That's why we wanted to play that intro clip. It is so much more.
00:04:08.967 --> 00:04:13.887
It is really a VM inside the kernel that can run simple code that you can create
00:04:13.887 --> 00:04:15.047
and craft that is protected.
00:04:15.867 --> 00:04:18.747
And so since this is a prerecord, we're not going to have your boost this week,
00:04:18.807 --> 00:04:21.947
but we do want to know if you like this type of deep dive into this particular topic.
00:04:22.207 --> 00:04:24.607
So boost those in and we'll bank them for when we come back.
00:04:25.127 --> 00:04:28.067
But let's talk about the extended Berkeley packet filter.
00:04:28.427 --> 00:04:32.207
Yeah. So it does do some networking stuff still to this day.
00:04:32.527 --> 00:04:39.167
But it did, as you say, start out as a packet filter introduced in 1992 to efficiently
00:04:39.167 --> 00:04:42.927
filter network packets in BSD operating systems. and.
00:04:42.927 --> 00:04:46.387
Pf sense and other firewall products like open sense of you know they've been
00:04:46.387 --> 00:04:51.367
using bpf as part of their core product i that's one of the reasons i was an early pf sense user.
00:04:51.367 --> 00:04:54.927
And you know before too long within the same decade it made its way over to
00:04:54.927 --> 00:04:58.407
linux in the form of tcp dump and already you're seeing this thing right where
00:04:58.407 --> 00:05:03.307
you can kind of use user space to help better observe what's going on on your system,
00:05:04.185 --> 00:05:07.545
And so if you've ever written sort of an expression to filter things or look
00:05:07.545 --> 00:05:11.205
at packets using TCP dump, well, you're using a language that then gets compiled
00:05:11.205 --> 00:05:14.205
down to BPF bytecode and executed.
00:05:14.565 --> 00:05:17.645
That bytecode right there is kind of the magic, right? Because it turns out
00:05:17.645 --> 00:05:21.025
that this thing is essentially capable of running this bytecode.
00:05:21.085 --> 00:05:22.105
So it's not just a packet filter.
00:05:22.565 --> 00:05:25.645
Yeah, and that's like how the implementation works. As it started out,
00:05:25.745 --> 00:05:27.265
it was a very simple virtual machine.
00:05:27.445 --> 00:05:32.045
And don't think virtual machine like QEMU necessarily are like simulating a full computer.
00:05:32.045 --> 00:05:35.665
the point is it's like a very limited restricted bytecode
00:05:35.665 --> 00:05:39.245
that can only do certain things relevant to at first filtering packets
00:05:39.245 --> 00:05:42.245
and that lets you make sure that like it's not going to do anything crazy it
00:05:42.245 --> 00:05:45.165
can't go into infinite loops all kinds of other nice things and optimize
00:05:45.165 --> 00:05:47.965
it and then be able to load it
00:05:47.965 --> 00:05:50.885
in and have you know you run the program it supplies
00:05:50.885 --> 00:05:53.785
the packet and anything else that you need is input to it
00:05:53.785 --> 00:05:56.645
and then the machine executes and ultimately that's how you tell like
00:05:56.645 --> 00:06:00.145
do i accept the packet or do i drop the packet uh but
00:06:00.145 --> 00:06:03.665
at first it was a you know a very limited
00:06:03.665 --> 00:06:06.845
i think i had like a two two registers to use super limited thing
00:06:06.845 --> 00:06:14.685
but ebpf extended bpf was introduced in linux 318 this was like 2014 so bpf
00:06:14.685 --> 00:06:18.905
had been around for a while there'd been various developments but ebpf really
00:06:18.905 --> 00:06:23.265
kicked things off in the linux side of things bpf hadn't you know caught up
00:06:23.265 --> 00:06:26.625
with the times in some ways it was still 32 bit it had some of those register limitations.
00:06:27.185 --> 00:06:30.145
So they upgraded to 64 bit registers added more
00:06:30.145 --> 00:06:33.165
instructions they added the verifier to
00:06:33.165 --> 00:06:36.285
the kernel which is a big part of it that lets you analyze bpf programs
00:06:36.285 --> 00:06:40.145
to make sure they're safe no infinite loops they don't do invalid memory access
00:06:40.145 --> 00:06:43.785
there's a checker process right because it's like you're loading something from
00:06:43.785 --> 00:06:48.085
user space into the kernel that's a big security concern so you you want to
00:06:48.085 --> 00:06:51.505
make sure that you have and just be on security operationally too right you
00:06:51.505 --> 00:06:53.225
don't want it to be able to crash the kernel so.
00:06:53.225 --> 00:06:57.285
We actually started to see this stuff land you know progressively in linux 3
00:06:57.285 --> 00:07:02.525
18 and beyond so this is actually like you said 2014 that's a this has been landing for a while.
00:07:02.525 --> 00:07:07.405
Yeah definitely and then so that was kind of like the raw stuff and then 2018
00:07:07.405 --> 00:07:12.605
and beyond people started adding more tools like the bcc but the bpf compiler
00:07:12.605 --> 00:07:18.225
collection bpf trace which we'll talk about too uh the company psyllium and
00:07:18.225 --> 00:07:20.845
their their products have a bunch of like ebpf stuff for,
00:07:22.105 --> 00:07:26.405
Kubernetes offerings plus we got better like compiler support there's something
00:07:26.405 --> 00:07:31.265
called Kori or compile once run everywhere so like compilers have better support
00:07:31.265 --> 00:07:34.645
to be able to make you know you can compile your BPF program and not have to
00:07:34.645 --> 00:07:37.585
worry about as much necessarily depending on what you're doing with it about
00:07:37.585 --> 00:07:41.765
how compatible it'll be with the kernel where you compiled it versus where you're running it so.
00:07:41.765 --> 00:07:46.365
The idea being like it should be compatible across multiple versions of Linux
00:07:46.365 --> 00:07:48.585
as long as they have this correct implementation.
00:07:48.585 --> 00:07:56.305
Right okay This has been so successful that newer versions of Dtrace on Linux,
00:07:58.081 --> 00:08:02.061
They're basically just some extra user space stuff that uses eBPF and other
00:08:02.061 --> 00:08:03.321
kernel primitives under the hood.
00:08:03.501 --> 00:08:04.841
Really? Yeah. Huh.
00:08:05.081 --> 00:08:07.481
And eBPF was also ported to Windows.
00:08:07.821 --> 00:08:11.501
Yeah, I heard about this. They're getting a lot of good stuff over there.
00:08:11.681 --> 00:08:16.401
One important thing with the extended part is they were also able to make the
00:08:16.401 --> 00:08:21.081
instruction set be more sympathetic to modern hardware, and they implemented
00:08:21.081 --> 00:08:22.681
just-in-time compilation as well.
00:08:22.721 --> 00:08:25.901
So that meant eBPF can be really fast.
00:08:26.461 --> 00:08:29.281
They've also made it so that there's relatively stable APIs we've kind of been
00:08:29.281 --> 00:08:33.921
talking about, so that as kernels change that, you can use eBPF to hook into internals.
00:08:34.361 --> 00:08:37.501
If you do that, there's no guarantees, right? But that's kind of on the tin.
00:08:37.841 --> 00:08:41.461
But there is some stable interfaces that you can use, which is nice.
00:08:42.901 --> 00:08:46.641
So the other important point to know is there's kind of various things it can do.
00:08:47.461 --> 00:08:52.221
There's XDP, which is Express Data Path, which intercepts packets basically
00:08:52.221 --> 00:08:54.781
at like the earliest point that you can.
00:08:54.781 --> 00:08:59.761
you have limitations on what you can do but it can be super low level and performant
00:08:59.761 --> 00:09:03.041
and so you can see this sometimes maybe unlike responding to ddos attacks where
00:09:03.041 --> 00:09:06.801
you're getting flooded with traffic that you have you know maybe you can identify
00:09:06.801 --> 00:09:10.461
various ways that you can program in here so you could essentially.
00:09:10.461 --> 00:09:14.401
Ideally catch it before it begins to overwhelm the system because you're catching
00:09:14.401 --> 00:09:16.281
it much further in like the driver stack.
00:09:16.281 --> 00:09:19.881
Yeah that's the idea and it doesn't do as much as like the very general and
00:09:19.881 --> 00:09:23.901
powerful but you know full-featured linux kernel networking stack you can kind
00:09:23.901 --> 00:09:26.381
of just be like, well, no, if it looks like this at all, just cut it off immediately.
00:09:26.561 --> 00:09:29.581
Yeah, if I'm getting DDoSed, I don't want the network stack trying to figure
00:09:29.581 --> 00:09:31.861
out what to do with all this traffic because that's what's going to take me down.
00:09:31.981 --> 00:09:34.701
Yeah, one way to say it is limited context but maximum performance.
00:09:35.641 --> 00:09:36.421
I like that.
00:09:37.081 --> 00:09:39.981
Okay, so then you can also do various types of K-probes.
00:09:40.221 --> 00:09:40.601
I'm sorry?
00:09:40.961 --> 00:09:46.281
Yeah, K-probes. And this is dynamic instrumentation. That's why it sounds quite probing.
00:09:46.601 --> 00:09:49.041
You can hook almost any kernel function.
00:09:50.861 --> 00:09:54.421
but you don't there's no like clear definition of what you're going to get you
00:09:54.421 --> 00:09:57.081
have to go look at the function you're hooking into it's all going to be dependent
00:09:57.081 --> 00:10:01.381
on that but no kernel internals any kernel function almost i'm sure there are
00:10:01.381 --> 00:10:03.561
some limitations that's pretty a lot of them yeah i.
00:10:03.561 --> 00:10:08.501
Mean that could be like from you know keyboard input to network traffic to disk
00:10:08.501 --> 00:10:10.381
io i mean that's there's all kinds of things.
00:10:10.381 --> 00:10:13.721
There so that's where a lot of some of the power comes from yeah but that may
00:10:13.721 --> 00:10:16.381
or may not be stable there's no guarantee about it being stable across kernel
00:10:16.381 --> 00:10:18.761
versions, can change at any time. People can update the signatures.
00:10:19.241 --> 00:10:22.541
That's one of the things that's been happening in the Rust discussion is the
00:10:22.541 --> 00:10:26.361
kernel, many developers expect to be able to make a change like that and because
00:10:26.361 --> 00:10:29.761
they have one big code base, they can update it everywhere and be able to do
00:10:29.761 --> 00:10:32.721
a refactoring like that. And, but the other one,
00:10:33.548 --> 00:10:39.408
Trace points. This is an important one. Trace points. Predefined stable instrumentation.
00:10:39.688 --> 00:10:39.868
Ah.
00:10:40.048 --> 00:10:44.968
Low overhead, but only available where explicitly added by kernel developers.
00:10:45.248 --> 00:10:49.968
So, okay. So a trace point would be like a spot you hook in and start getting
00:10:49.968 --> 00:10:51.588
metrics or information out of.
00:10:51.888 --> 00:10:56.108
But the developer of the subsystem has to implicitly support that. Yeah.
00:10:56.168 --> 00:10:58.748
You have to add that in versus totally dynamic with a K-probe.
00:10:58.848 --> 00:10:58.988
Okay.
00:10:59.288 --> 00:11:02.988
But the upside is you get a structured data specific to each trace point,
00:11:03.048 --> 00:11:05.008
right? So the trace point tells you what it is.
00:11:05.168 --> 00:11:05.968
Yeah, yeah, okay.
00:11:06.128 --> 00:11:10.368
And they're maintained across kernel versions, so you can kind of rely on them for more long-term use.
00:11:10.748 --> 00:11:13.708
I have a feeling this might be relevant later. Okay, good to know.
00:11:14.128 --> 00:11:18.488
Yeah, I think that's probably like the quick, high-level version of what eBPF
00:11:18.488 --> 00:11:19.808
is and kind of what it can do.
00:11:19.948 --> 00:11:26.488
And it is so, so, so simple, but yet so powerful is what I love about it.
00:11:26.568 --> 00:11:31.588
And we have a couple of examples in the show, and I think some hands-on stuff
00:11:31.588 --> 00:11:32.508
that people could take away.
00:11:33.128 --> 00:11:35.948
And maybe we should start with BCC tools themselves.
00:11:36.388 --> 00:11:39.188
Yeah, because we've both had a chance to play with those.
00:11:39.328 --> 00:11:42.648
Yeah, I was, you know, I was joking around with Wes and be like,
00:11:42.708 --> 00:11:48.168
it'd be kind of great to know where in the system when I open up this directory
00:11:48.168 --> 00:11:49.468
that's a fuse mounted directory,
00:11:49.688 --> 00:11:54.568
like where is the actual delay happening and what part of the system is sitting around waiting.
00:11:54.568 --> 00:11:59.108
And through this process of trying to get to that, I came across tools that
00:11:59.108 --> 00:12:03.508
let me look at my disk IO analysis or let me look at the network traffic and
00:12:03.508 --> 00:12:06.688
really kind of using these different tools, putting them together.
00:12:06.688 --> 00:12:11.728
You can actually start to get a really good picture of where the delay was happening in the system.
00:12:12.523 --> 00:12:15.623
And, you know, for me, it was like, this is going to be amazing.
00:12:16.043 --> 00:12:21.603
I had discovered by running it on my desktop, just as when I was experimenting
00:12:21.603 --> 00:12:25.263
with this stuff, that, oh, yeah, I've still got this errands app that we talked
00:12:25.263 --> 00:12:27.243
about on the show that I'm not currently using like today.
00:12:27.283 --> 00:12:31.123
But I guess when I close it, it doesn't actually close. It doesn't leave an icon.
00:12:31.303 --> 00:12:36.863
I had no idea it was running. But using these tools, I started seeing this application
00:12:36.863 --> 00:12:40.483
that was hitting my disk every so often. And I'm like, I don't recognize this.
00:12:40.483 --> 00:12:42.963
and I discovered I actually had that running the entire time.
00:12:43.103 --> 00:12:44.063
And it was kind of useful.
00:12:44.303 --> 00:12:48.983
Yeah, it kind of skips through a lot of the boundaries and other limitations
00:12:48.983 --> 00:12:51.723
that can sometimes pop up when you're trying to look at your system.
00:12:51.983 --> 00:12:53.743
So it can be surprisingly insightful.
00:12:54.403 --> 00:12:57.843
They do have a nice tutorial, which we'll link. They also, I like that they
00:12:57.843 --> 00:12:59.303
have a set of things to run first.
00:12:59.443 --> 00:13:02.883
Like before you go to these tools, make sure you check all like the regular
00:13:02.883 --> 00:13:06.403
system monitoring tools first because we'll see as a theme, like,
00:13:06.903 --> 00:13:09.823
you know, your H-tops and B-tops and all kinds of things.
00:13:10.483 --> 00:13:14.483
kind of get a broad look and you could see some specifics whereas you could
00:13:14.483 --> 00:13:18.683
you can make broad eppf programs but by default they're going to be a lot more
00:13:18.683 --> 00:13:21.043
specific when you're looking at like one thing.
00:13:21.043 --> 00:13:21.743
Like disk.
00:13:21.743 --> 00:13:23.743
Latency or something specific to the file system.
00:13:23.743 --> 00:13:29.003
Or networking yeah yeah that's a good point um all right so we could talk about
00:13:29.003 --> 00:13:33.663
some of the commands we tried i know that uh file top and tcp top we played
00:13:33.663 --> 00:13:39.363
around with um i did not get a chance to play around with ext4 slower and XFS
00:13:39.363 --> 00:13:41.643
slower, but this is an interesting way you can use it too.
00:13:41.883 --> 00:13:45.223
Uh-huh, yeah. It'll tell you when, you know, there's things happening in your
00:13:45.223 --> 00:13:49.143
file system that are causing latency more than, like, a programmable amount
00:13:49.143 --> 00:13:50.603
you can pass on the command line.
00:13:51.363 --> 00:13:56.503
Or they've got ZFS dist, which traces ZFS reads, writes, opens,
00:13:56.683 --> 00:14:00.383
fsyncs, and then summarizes the latency of all that in a histogram for you.
00:14:00.503 --> 00:14:01.363
That's really cool.
00:14:01.823 --> 00:14:07.943
Yeah, right? And then two really useful basic ones are exec snoop and open snoop.
00:14:08.799 --> 00:14:14.099
Yeah, OpenSnoop, isn't that kind of like, oh, there's like a Mac app that monitors
00:14:14.099 --> 00:14:16.679
traffic? Is that what it was? OpenSnoop something else?
00:14:16.859 --> 00:14:19.319
Yeah, no. So OpenSnoop, you're thinking of, there's a Linux one,
00:14:19.399 --> 00:14:21.459
I think, right? OpenSnitch? Yeah, just one thing.
00:14:22.039 --> 00:14:23.379
Snitch. Snitch. That's, yes.
00:14:24.759 --> 00:14:26.479
OpenSnoop tracks file opens.
00:14:26.679 --> 00:14:26.879
Okay.
00:14:27.059 --> 00:14:32.079
So you can run this and it hooks into the kernel via BPF. And then anything
00:14:32.079 --> 00:14:35.259
that's running on your system that opens files, it'll just print out in your
00:14:35.259 --> 00:14:36.499
console right in front of you.
00:14:36.519 --> 00:14:38.199
I did play with this one. I did play with this OpenSnoop one.
00:14:38.279 --> 00:14:41.359
You're right. Yeah, that's really cool because I remember I launched,
00:14:41.479 --> 00:14:44.659
you could launch particular things and then just watch all the crap that happens on your system.
00:14:44.759 --> 00:14:47.719
Right. And especially, you know, you can filter it, you can have it look at
00:14:47.719 --> 00:14:50.419
specific processes or you could, you know, grab output or whatever.
00:14:50.859 --> 00:14:54.499
So you can filter on a busy system, but I think it's especially useful on a
00:14:54.499 --> 00:14:58.139
system you think should be, you know, relatively quiet and just as a way to
00:14:58.139 --> 00:15:00.659