<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>eBPF &#8211; Noise</title>
	<atom:link href="https://noise.getoto.net/tag/ebpf/feed/" rel="self" type="application/rss+xml" />
	<link>https://noise.getoto.net</link>
	<description>The collective thoughts of the interwebz</description>
	<lastBuildDate>Tue, 21 Oct 2025 13:00:00 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>
	<item>
		<title>A deep dive into BPF LPM trie performance and optimization</title>
		<link>https://noise.getoto.net/2025/10/21/a-deep-dive-into-bpf-lpm-trie-performance-and-optimization/</link>
		
		<dc:creator><![CDATA[Matt Fleming]]></dc:creator>
		<pubDate>Tue, 21 Oct 2025 13:00:00 +0000</pubDate>
				<category><![CDATA[deep dive]]></category>
		<category><![CDATA[eBPF]]></category>
		<category><![CDATA[IPv4]]></category>
		<category><![CDATA[ipv6]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Performance]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=ede9ca85fa7a4162bc63b102f09eb928</guid>

					<description><![CDATA[This post explores the performance of BPF LPM tries, a critical data structure used for IP matching.]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>How Netflix Accurately Attributes eBPF Flow Logs</title>
		<link>https://noise.getoto.net/2025/04/08/how-netflix-accurately-attributes-ebpf-flow-logs/</link>
		
		<dc:creator><![CDATA[Netflix Technology Blog]]></dc:creator>
		<pubDate>Tue, 08 Apr 2025 17:50:58 +0000</pubDate>
				<category><![CDATA[Containers]]></category>
		<category><![CDATA[eBPF]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[networking]]></category>
		<category><![CDATA[observability]]></category>
		<guid isPermaLink="false">https://medium.com/p/afe6d644a3bc</guid>

					<description><![CDATA[By Cheng Xie, Bryan Shultz, and Christine XuIn a previous blog post, we described how Netflix uses eBPF to capture TCP flow logs at scale for enhanced network insights. In this post, we delve deeper into how Netflix solved a core problem: accurately at...]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Noisy Neighbor Detection with eBPF</title>
		<link>https://noise.getoto.net/2024/09/10/noisy-neighbor-detection-with-ebpf/</link>
		
		<dc:creator><![CDATA[Netflix Technology Blog]]></dc:creator>
		<pubDate>Tue, 10 Sep 2024 18:00:21 +0000</pubDate>
				<category><![CDATA[Containers]]></category>
		<category><![CDATA[eBPF]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[observability]]></category>
		<category><![CDATA[Performance]]></category>
		<guid isPermaLink="false">https://medium.com/p/64b1f4b3bbdd</guid>

					<description><![CDATA[<p><em>By </em><a href="https://www.linkedin.com/in/josefernandezmn/"><em>Jose Fernandez</em></a><em>, </em><a href="https://www.linkedin.com/in/sebastien-dabdoub-2a5a0958/"><em>Sebastien Dabdoub</em></a><em>, </em><a href="https://www.linkedin.com/in/jason-koch-5692172/"><em>Jason Koch</em></a><em>, </em><a href="https://www.linkedin.com/in/artemtkachuk/"><em>Artem Tkachuk</em></a></p><p>The Compute and Performance Engineering teams at Netflix regularly investigate performance issues in our multi-tenant environment. The first step is determining whether the problem originates from the application or the underlying infrastructure. One issue that often complicates this process is the "noisy neighbor" problem. On <a href="https://netflixtechblog.com/titus-the-netflix-container-management-platform-is-now-open-source-f868c9fb5436">Titus</a>, our multi-tenant compute platform, a "noisy neighbor" refers to a container or system service that heavily utilizes the server's resources, causing performance degradation in adjacent containers. We usually focus on CPU utilization because it is our workload's most frequent source of noisy neighbor issues.</p><p>Detecting the effects of noisy neighbors is complex. Traditional performance analysis tools such as<a href="https://www.brendangregg.com/perf.html"> perf</a> can introduce significant overhead, risking further performance degradation. Additionally, these tools are typically deployed after the fact, which is too late for effective investigation.<em> </em>Another challenge is that debugging noisy neighbor issues requires significant low-level expertise and specialized tooling<em>. </em>In this blog post, we'll reveal how we leveraged eBPF to achieve continuous, low-overhead instrumentation of the Linux scheduler, enabling effective self-serve monitoring of noisy neighbor issues. Learn how Linux kernel instrumentation can improve your infrastructure observability with deeper insights and enhanced monitoring.</p><h3>Continuous Instrumentation of the Linux Scheduler</h3><p>To ensure the reliability of our workloads that depend on low latency responses, we instrumented the <a href="https://en.wikipedia.org/wiki/Run_queue">run queue</a> latency for each container, which measures the time processes spend in the scheduling queue before being dispatched to the CPU. Extended waiting in this queue can be a telltale of performance issues, especially when containers are not utilizing their total CPU allocation. Continuous instrumentation is critical to catching such matters as they emerge, and eBPF, with its hooks into the Linux scheduler with minimal overhead, enabled us to monitor run queue latency efficiently.</p><p>To emit a run queue latency metric, we leveraged three eBPF hooks: <strong>sched_wakeup, sched_wakeup_new,</strong> and <strong>sched_switch</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6bapyclfXZPsUIaXFM-xaQ.png"></figure><p>The <strong>sched_wakeup </strong>and <strong>sched_wakeup_new</strong> hooks are invoked when a process changes state from 'sleeping' to 'runnable.' They let us identify when a process is ready to run and is waiting for CPU time. During this event, we generate a timestamp and store it in an eBPF hash map using the process ID as the key.</p><pre>struct {<br>    __uint(type, BPF_MAP_TYPE_HASH);<br>    __uint(max_entries, MAX_TASK_ENTRIES);<br>    __uint(key_size, sizeof(u32));<br>    __uint(value_size, sizeof(u64));<br>} runq_lat SEC(".maps");<br><br>SEC("tp_btf/sched_wakeup")<br>int tp_sched_wakeup(u64 *ctx)<br>{<br>    struct task_struct *task = (void *)ctx[0];<br>    u32 pid = task-&#62;pid;<br>    u64 ts = bpf_ktime_get_ns();<br><br>    bpf_map_update_elem(&#38;runq_lat, &#38;pid, &#38;ts, BPF_NOEXIST);<br>    return 0;<br>}</pre><p>Conversely, the <strong>sched_switch</strong> hook is triggered when the CPU switches between processes. This hook provides pointers to the process currently utilizing the CPU and the process about to take over. We use the upcoming task's process ID (PID) to fetch the timestamp from the eBPF map. This timestamp represents when the process entered the queue, which we had previously stored. We then calculate the run queue latency by simply subtracting the timestamps.</p><pre>SEC("tp_btf/sched_switch")<br>int tp_sched_switch(u64 *ctx)<br>{<br>    struct task_struct *prev = (struct task_struct *)ctx[1];<br>    struct task_struct *next = (struct task_struct *)ctx[2];<br>    u32 prev_pid = prev-&#62;pid;<br>    u32 next_pid = next-&#62;pid;<br> <br>    // fetch timestamp of when the next task was enqueued<br>    u64 *tsp = bpf_map_lookup_elem(&#38;runq_lat, &#38;next_pid);<br>    if (tsp == NULL) {<br>        return 0; // missed enqueue<br>    }<br><br>    // calculate runq latency before deleting the stored timestamp<br>    u64 now = bpf_ktime_get_ns();<br>    u64 runq_lat = now - *tsp;<br><br>    // delete pid from enqueued map<br>    bpf_map_delete_elem(&#38;runq_lat, &#38;next_pid);<br>    ....</pre><p>One of the advantages of eBPF is its ability to provide pointers to the actual kernel data structures representing processes or threads, also known as tasks in kernel terminology. This feature enables access to a wealth of information stored about a process. We required the process's cgroup ID to associate it with a container for our specific use case. However, the cgroup information in the struct is safeguarded by an<a href="https://elixir.bootlin.com/linux/v6.6.16/source/include/linux/sched.h#L1225"> RCU (Read Copy Update) lock</a>.</p><p>To safely access this RCU-protected information, we can leverage <a href="https://docs.kernel.org/bpf/kfuncs.html">kfuncs</a> in eBPF. kfuncs are kernel functions that can be called from eBPF programs. There are kfuncs available to lock and unlock RCU read-side critical sections. These functions ensure that our eBPF program remains safe and efficient while retrieving the cgroup ID from the task struct.</p><pre>void bpf_rcu_read_lock(void) __ksym;<br>void bpf_rcu_read_unlock(void) __ksym;<br><br>u64 get_task_cgroup_id(struct task_struct *task)<br>{<br>    struct css_set *cgroups;<br>    u64 cgroup_id;<br>    bpf_rcu_read_lock();<br>    cgroups = task-&#62;cgroups;<br>    cgroup_id = cgroups-&#62;dfl_cgrp-&#62;kn-&#62;id;<br>    bpf_rcu_read_unlock();<br>    return cgroup_id;<br>}</pre><p>Having the data ready, we must package it and send it to userspace. For this purpose, we chose the eBPF <a href="https://nakryiko.com/posts/bpf-ringbuf/">ring buffer</a>. It is efficient, high-performing, and user-friendly. It can handle variable-length data records and allows data reading without necessitating extra memory copying or syscalls. However, the sheer amount of data points was causing the userspace program to use too much CPU, so we implemented a rate limiter in eBPF to sample the data effectively.</p><pre>struct {<br>    __uint(type, BPF_MAP_TYPE_RINGBUF);<br>    __uint(max_entries, 256 * 1024);<br>} events SEC(".maps");<br><br>struct {<br>    __uint(type, BPF_MAP_TYPE_PERCPU_HASH);<br>    __uint(max_entries, MAX_TASK_ENTRIES);<br>    __uint(key_size, sizeof(u64));<br>    __uint(value_size, sizeof(u64));<br>} cgroup_id_to_last_event_ts SEC(".maps");<br><br>struct runq_event {<br>    u64 prev_cgroup_id;<br>    u64 cgroup_id;<br>    u64 runq_lat;<br>    u64 ts;<br>};<br><br>SEC("tp_btf/sched_switch")<br>int tp_sched_switch(u64 *ctx)<br>{<br>    // ....<br>    // The previous code<br>    // ....<br> <br>    u64 prev_cgroup_id = get_task_cgroup_id(prev);<br>    u64 cgroup_id = get_task_cgroup_id(next);<br> <br>    // per-cgroup-id-per-CPU rate-limiting <br>    // to balance observability with performance overhead<br>    u64 *last_ts = <br>        bpf_map_lookup_elem(&#38;cgroup_id_to_last_event_ts, &#38;cgroup_id);<br>    u64 last_ts_val = last_ts == NULL ? 0 : *last_ts;<br><br>    // check the rate limit for the cgroup_id in consideration<br>    // before doing more work<br>    if (now - last_ts_val &#60; RATE_LIMIT_NS) {<br>        // Rate limit exceeded, drop the event<br>        return 0;<br>    }<br><br>    struct runq_event *event;<br>    event = bpf_ringbuf_reserve(&#38;events, sizeof(*event), 0);<br>  <br>    if (event) {<br>        event-&#62;prev_cgroup_id = prev_cgroup_id;<br>        event-&#62;cgroup_id = cgroup_id;<br>        event-&#62;runq_lat = runq_lat;<br>        event-&#62;ts = now;<br>        bpf_ringbuf_submit(event, 0);<br>        // Update the last event timestamp for the current cgroup_id<br>        bpf_map_update_elem(&#38;cgroup_id_to_last_event_ts, &#38;cgroup_id,<br>            &#38;now, BPF_ANY);<br><br>    }<br><br>    return 0;<br>}</pre><p>Our userspace application, developed in Go, processes events from the ring buffer to emit metrics to our metrics backend, <a href="https://netflixtechblog.com/introducing-atlas-netflixs-primary-telemetry-platform-bd31f4d8ed9a">Atlas</a>. Each event includes a run queue latency sample with a cgroup ID, which we associate with running containers on the host. We categorize it as a system service if no such association is found. When a cgroup ID correlates with a container, we emit a percentile timer Atlas metric (runq.latency) for that container. We also increment a counter metric (sched.switch.out) to monitor preemptions occurring for the container's processes. Access to the prev_cgroup_id of the preempted process allows us to tag the metric with the cause of the preemption, whether it's due to a process within the same container (or cgroup), a process in another container, or a system service.</p><p>It's important to highlight that both the runq.latency metric and the sched.switch.out metrics are needed to determine if a container is affected by noisy neighbors, which is the goal we aim to achieve — relying solely on the runq.latency metric can lead to misconceptions. For example, if a container is at or over its cgroup CPU limit, the scheduler will throttle it, resulting in an apparent spike in run queue latency due to delays in the queue. If we were only to consider this metric, we might incorrectly attribute the performance degradation to noisy neighbors when it's actually because the container is hitting its CPU request limits. However, simultaneous spikes in both metrics, mainly when the cause is a different container or system process, clearly indicate a noisy neighbor issue.</p><h3>A Noisy Neighbor Story</h3><p>Below is the runq.latency metric for a server running a single container with ample CPU overhead. The 99th percentile averages 83.4µs (microseconds), serving as our baseline. Although there are some spikes reaching 400µs, the latency remains within acceptable parameters.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_DcYxRgeDwX5i07IrdTZyA.png"><figcaption>container1’s 99th percentile runq.latency averages 83µs (microseconds), with spikes up to 400µs, without adjacent containers. This serves as our baseline for a container not contending for CPU on a host.</figcaption></figure><p>At 10:35, launching container2, which fully utilized all CPUs on the host, caused a significant 131-millisecond spike (131,000 microseconds) in container1's P99 run queue latency. This spike would be noticeable in the userspace application if it were serving HTTP traffic. If userspace app owners reported an unexplained latency spike, we could quickly identify the noisy neighbor issue through run queue latency metrics.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DJrwEbrWPOxVMS0JP7uE9A.png"><figcaption>Launching container2 at 10:35, which maxes out all CPUs on the host, <strong>caused a 131-millisecond spike in container1’s P99 run queue latency</strong> due to increased preemptions by system processes. This indicates a noisy neighbor issue, where system services compete for CPU time with containers.</figcaption></figure><p>The sched.switch.out metric indicates that the spike was due to increased preemptions by system processes, highlighting a noisy neighbor issue where system services compete with containers for CPU time. Our metrics show that the noisy neighbors were actually system processes, likely triggered by container2 consuming all available CPU capacity.</p><h3>Optimizing eBPF Code</h3><p>We developed an open-source eBPF process monitor called <a href="https://netflixtechblog.com/announcing-bpftop-streamlining-ebpf-performance-optimization-6a727c1ae2e5">bpftop</a> to measure the overhead of eBPF code in this hot kernel path. Our estimates suggest that the instrumentation adds less than 600 nanoseconds to each sched_* hook. We conducted a performance analysis on a Java service running in a container, and the instrumentation did not introduce significant overhead. The performance variance with the run queue profiling code active versus inactive was not measurable in milliseconds.</p><p>During our research on how eBPF statistics are measured in the kernel, we identified an opportunity to improve its calculation. We submitted this <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ce09cbdd988887662546a1175bcfdfc6c8fdd150">patch</a>, which was included in the Linux kernel 6.10 release.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YD6hkXce9a70AgvSHstgWA.gif"></figure><p>Through trial and error and using bpftop, we identified several optimizations that helped maintain low overhead for this code:</p><ul><li>We found that BPF_MAP_TYPE_HASH was the most performant for storing enqueued timestamps. Using BPF_MAP_TYPE_TASK_STORAGE resulted in nearly a twofold performance decline. BPF_MAP_TYPE_PERCPU_HASH was slightly less performant than BPF_MAP_TYPE_HASH, which was unexpected and requires further investigation.</li><li>The BPF_CORE_READ helper adds 20–30 nanoseconds per invocation. In the case of raw tracepoints, specifically those that are "BTF-enabled" (tp_btf/*), it is safe and more efficient to access the task struct members directly. Andrii Nakryiko recommends this approach in this <a href="https://nakryiko.com/posts/bpf-core-reference-guide/#btf-enabled-bpf-program-types-with-direct-memory-reads">blog post</a>.</li><li>BPF_MAP_TYPE_LRU_HASH maps are 40–50 nanoseconds slower per operation than regular hash maps. Due to space concerns from PID churn, we initially used them for enqueued timestamps. We have since increased the map size, mitigating this risk.</li><li>The sched_switch, sched_wakeup, and sched_wakeup_new are all triggered for kernel tasks, which are identifiable by their PID of 0. We found monitoring these tasks unnecessary, so we implemented several early exit conditions and conditional logic to prevent executing costly operations, such as accessing BPF maps, when dealing with a kernel task. Notably, kernel tasks operate through the scheduler queue like any regular process.</li></ul><h3>Conclusion</h3><p>Our findings highlight the value of low-overhead continuous instrumentation of the Linux kernel with eBPF. We have integrated these metrics into customer dashboards, enabling actionable insights and guiding multitenancy performance discussions. We can also now use these metrics to refine CPU isolation strategies to minimize the impact of noisy neighbors. Additionally, thanks to these metrics, we've gained deeper insights into the Linux scheduler.</p><p>This project has also deepened our understanding of eBPF technology and underscored the importance of tools like bpftop for optimizing eBPF code. As eBPF adoption increases, we foresee more infrastructure observability and business logic shifting to it. One promising project in this space is <a href="https://github.com/sched-ext/scx">sched_ext</a>, potentially revolutionizing how scheduling decisions are made and tailored to specific workload needs.</p><img src="https://medium.com/_/stat?event=post.clientViewed&#38;referrerSource=full_rss&#38;postId=64b1f4b3bbdd" width="1" height="1" alt=""><hr><p><a href="https://netflixtechblog.com/noisy-neighbor-detection-with-ebpf-64b1f4b3bbdd">Noisy Neighbor Detection with eBPF</a> was originally published in <a href="https://netflixtechblog.com/">Netflix TechBlog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Announcing bpftop: Streamlining eBPF performance optimization</title>
		<link>https://noise.getoto.net/2024/02/26/announcing-bpftop-streamlining-ebpf-performance-optimization/</link>
		
		<dc:creator><![CDATA[Netflix Technology Blog]]></dc:creator>
		<pubDate>Mon, 26 Feb 2024 16:43:30 +0000</pubDate>
				<category><![CDATA[eBPF]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[observability]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Rust]]></category>
		<guid isPermaLink="false">https://medium.com/p/6a727c1ae2e5</guid>

					<description><![CDATA[By Jose FernandezToday, we are thrilled to announce the release of bpftop, a command-line tool designed to streamline the performance optimization and monitoring of eBPF applications. As Netflix increasingly adopts eBPF [1, 2], applying the same rigor ...]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>A July 4 technical reading list</title>
		<link>https://noise.getoto.net/2022/07/04/a-july-4-technical-reading-list/</link>
		
		<dc:creator><![CDATA[John Graham-Cumming]]></dc:creator>
		<pubDate>Mon, 04 Jul 2022 12:55:08 +0000</pubDate>
				<category><![CDATA[Cloudflare Radar]]></category>
		<category><![CDATA[eBPF]]></category>
		<category><![CDATA[Hertzbleed]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Reading List]]></category>
		<category><![CDATA[TCP]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=3ea16be84c4e69725b5758c87d789210</guid>

					<description><![CDATA[Here’s a short list of recent technical blog posts to give you something to read today]]></description>
		
		
		<enclosure url="http://blog.cloudflare.com/content/images/2022/06/image1-60.png" length="0" type="" />

			</item>
		<item>
		<title>Production ready eBPF, or how we fixed the BSD socket API</title>
		<link>https://noise.getoto.net/2022/02/17/production-ready-ebpf-or-how-we-fixed-the-bsd-socket-api/</link>
		
		<dc:creator><![CDATA[Lorenz Bauer]]></dc:creator>
		<pubDate>Thu, 17 Feb 2022 17:02:54 +0000</pubDate>
				<category><![CDATA[eBPF]]></category>
		<category><![CDATA[Go]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[sockets]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=2a48371ad0ba77f0295f608384a55d7a</guid>

					<description><![CDATA[We are open sourcing the production tooling we’ve built for the sk_lookup hook we contributed to the Linux kernel, called tubular]]></description>
		
		
		<enclosure url="http://blog.cloudflare.com/content/images/2022/02/tubular.png" length="0" type="" />

			</item>
		<item>
		<title>How We Used eBPF to Build Programmable Packet Filtering in Magic Firewall</title>
		<link>https://noise.getoto.net/2021/12/06/how-we-used-ebpf-to-build-programmable-packet-filtering-in-magic-firewall/</link>
		
		<dc:creator><![CDATA[Chris J Arges]]></dc:creator>
		<pubDate>Mon, 06 Dec 2021 13:59:53 +0000</pubDate>
				<category><![CDATA[CIO Week]]></category>
		<category><![CDATA[eBPF]]></category>
		<category><![CDATA[Magic Firewall]]></category>
		<category><![CDATA[Magic Transit]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[VoIP]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=47c5b057e45d351b103d851f89b8e514</guid>

					<description><![CDATA[By combining the power of eBPF and Nftables, Magic Firewall can mitigate sophisticated attacks on infrastructure by enforcing a positive security model.]]></description>
		
		
		<enclosure url="http://blog.cloudflare.com/content/images/2021/12/image3-7.png" length="0" type="" />

			</item>
		<item>
		<title>How Netflix uses eBPF flow logs at scale for network insight</title>
		<link>https://noise.getoto.net/2021/06/07/how-netflix-uses-ebpf-flow-logs-at-scale-for-network-insight/</link>
		
		<dc:creator><![CDATA[Netflix Technology Blog]]></dc:creator>
		<pubDate>Mon, 07 Jun 2021 19:12:44 +0000</pubDate>
				<category><![CDATA[Big Data]]></category>
		<category><![CDATA[cloud-networking]]></category>
		<category><![CDATA[Druid]]></category>
		<category><![CDATA[eBPF]]></category>
		<category><![CDATA[Network Analytics]]></category>
		<guid isPermaLink="false">https://medium.com/p/e3ea997dca96</guid>

					<description><![CDATA[By Alok Tiagi, Hariharan Ananthakrishnan, Ivan Porto Carrero and Keerti LakshminarayanNetflix has developed a network observability sidecar called Flow Exporter that uses eBPF tracepoints to capture TCP flows at near real time. At much less than 1% of ...]]></description>
		
		
		<enclosure url="" length="0" type="" />

			</item>
		<item>
		<title>Raking the floods: How to protect UDP services from DoS attacks with eBPF</title>
		<link>https://noise.getoto.net/2020/09/18/raking-the-floods-how-to-protect-udp-services-from-dos-attacks-with-ebpf/</link>
		
		<dc:creator><![CDATA[Jonas Otten]]></dc:creator>
		<pubDate>Fri, 18 Sep 2020 11:00:00 +0000</pubDate>
				<category><![CDATA[eBPF]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[udp]]></category>
		<guid isPermaLink="false">http://noise.getoto.net/?guid=0e462d28efee1c6b38ea3dd53307d005</guid>

					<description><![CDATA[SYN-cookies help mitigating SYN-floods for TCP, but how can we protect services from similar attacks that use UDP? We designed an algorithm and a library to fill this gap, and it&#8217;s open source!]]></description>
		
		
		<enclosure url="https://blog-cloudflare-com-assets.storage.googleapis.com/2020/09/raking-sandbox@2x.png" length="0" type="" />

			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/

Object Caching 34/208 objects using Memcached
Page Caching using Disk: Enhanced 
Lazy Loading (feed)
Database Caching using Memcached

Served from: noise.getoto.net @ 2025-12-10 08:55:22 by W3 Total Cache
-->