The Caution Triangle Is the Whole Argument: Reading the ‘Not Friendly Do Not Touch’ Shirt

The first thing I notice is not the words. It is the triangle. A yellow caution triangle, the kind that in a real facility means this thing will hurt you, sits above or beside the lettering, and inside or next to it is a hand with a slash through it. The shirt reads NOT FRIENDLY DO NOT TOUCH in warning-sign lettering. The crossed-out hand is the part that does the work. The words are a statement of temperament. The hand is a rule.

That distinction matters more than it first appears. A shirt that says not friendly is describing a mood. A shirt that says do not touch is issuing an instruction. Put them together under a caution triangle and you have something closer to a posted notice than a slogan: a boundary expressed in the visual grammar of industrial safety. The design is not subtle, and it is not trying to be. But it is more specific than the usual introvert merchandise, and that specificity is worth reading closely.

What the sign language actually says

Warning signs work because they compress a decision into a glance. The triangle says hazard. The slash says prohibited action. The text says what. You do not need to read the whole thing to get the message; the shape does most of the work before your eyes reach the words. That is the entire point of sign grammar, and it is why the shirt reads faster than a sentence on a chest normally would.

I want to be careful here, because it is easy to over-read a piece of apparel. The design does not demonstrate anything about safety engineering, and it is not evidence about how warning signage is standardized. What I can say from looking at it is narrower and more useful: the artwork borrows the form of a caution placard and applies it to a social boundary. The yellow triangle and the crossed-out hand are doing the same job they do on a real sign — telling you, before you have finished reading, that a specific action is not allowed.

That is a different move from most introvert shirts. The common version is a confession: I am awkward, I will not talk, please leave me alone. Those are statements about the wearer’s interior state, and they invite the reader to interpret, sympathize, or tease. This one is not a confession. It is a notice. It does not ask you to understand the wearer. It tells you what to do.

The difference between a slogan and a usable promise

Here is the argument I keep coming back to. A slogan is a claim. A usable promise is a claim with a boundary attached. Not friendly is a slogan. Do not touch is a boundary. The shirt works because it puts both on the same line and lets the sign format carry the second one.

That is a small piece of design craft, but it is the kind that technical readers tend to notice, because we spend our working lives around interfaces that fail in exactly this way. A status page that says degraded is a slogan. A status page that says degraded: writes failing, reads unaffected, do not retry is a usable promise. The difference is not length. It is whether the reader knows what to do next. The shirt, read as a sign, gets this right. It does not just tell you the wearer’s disposition. It tells you the permitted action, which is none.

I am not claiming the designer was thinking about incident communication. I am claiming the design is legible for the same reason a good incident notice is legible: it separates the condition from the instruction. Not friendly is the condition. Do not touch is the instruction. The triangle and the slash are the formatting that makes the instruction impossible to miss.

Why the crossed-out hand is the sharpest element

The lettering is blunt, and the triangle is familiar, but the crossed-out hand is the part that turns the shirt from a joke into a rule. A hand with a slash through it is one of the few symbols that reads as prohibition without any text at all. You could remove every word from the shirt and the symbol would still say no. That is a strong piece of visual economy, and it is why the design holds up when you look at it for more than a second.

It also changes the tone. Without the hand, the shirt is a grumble. With the hand, it is a posted restriction, and posted restrictions are funny in a specific way: they are funny because they are disproportionate. Nobody posts a caution triangle for a person. The humor comes from applying institutional seriousness to a personal preference. The design knows this, which is why it commits to the bit rather than softening it with a smiley face or a smaller font.

That commitment is what separates this from a generic introvert shirt. The introvert label is doing a lot of work in the retail title, and it is a fair description of the audience, but the artwork itself does not say introvert. It says warning. The label is the marketing frame; the sign is the design. If you are going to wear something like this, the sign is what people will actually read.

Where the shirt fits, and where it does not

I have a rule about message shirts, which is that the message has to survive being read by someone who is not in on the joke. This one does, mostly. A stranger who sees a caution triangle and a crossed-out hand will understand the boundary even if they do not find it funny. That is a point in its favor. The failure mode for message apparel is the shirt that only works as an in-group reference, where the wearer spends the day explaining the joke. This design does not require an explanation. It requires a decision about whether you want to be read as a posted notice.

That is the honest tradeoff. The shirt is legible, and legible is not the same as neutral. Wearing a caution placard on your chest is a stronger social statement than wearing a small text line, and the design’s clarity is exactly what makes it strong. If the goal is a low-stakes joke for people who already know you, this is more than that. If the goal is a boundary you do not want to explain, the sign format is doing real work.

I would not wear it to a customer meeting. I might wear it to a conference hallway track, where the ambient tolerance for terse technical humor is higher and where a do not touch sign reads as a bit rather than a rebuke. That is a judgment about context, not about the design. The design is doing what it set out to do.

The object itself

The shirt is sold as the Not Friendly Do Not Touch Funny Warning Sign Introvert under the Quirky Cotton Collective brand. The artwork is the warning-sign lettering, the yellow caution triangle, and the crossed-out hand. That is the whole design, and it does not need more. The restraint is part of why it reads.

What I keep returning to is the ordering of the elements. The words come first in the title, but the triangle and the hand come first in the reading. That is the correct hierarchy for a sign, and it is the reason the shirt works as more than a caption. The text confirms what the symbol already told you. By the time you reach not friendly, you have already been warned.

Editorial note: This publication and Quirky Cotton Collective share an owner.

The Period After ‘meh’: Reading the Smallest Possible Slogan

The native garment preview shows very small, centered lowercase meh. lettering on a dark shirt. No animal illustration is present. That is the entire design. Four letters and a period, set at a scale that asks you to lean in before you can read it.

I want to argue that the period is doing more work than the word. meh alone is a shrug — a vowel sound with no commitment. meh. is a verdict. The punctuation converts an interjection into a complete sentence, and a complete sentence is a different kind of object. It closes. It does not trail off. It files the matter and moves on.

This matters because the shirt is not, despite the retail title’s stack of adjectives, a sarcastic shirt in the usual sense. Sarcasm requires a target and a performance. This design has neither. It is closer to a status code than a joke: a terse, terminal response to a request that did not warrant elaboration. Anyone who has written a runbook knows the type. The best entries are not the ones that explain everything. They are the ones that say no and mean it.

Scale as the argument

The lettering is small and centered. That is a deliberate choice against the genre. Most slogan shirts shout — large type, stacked lines, an exclamation point doing the emotional labor. This one whispers, and the whisper is the point. A message set at that scale is only legible at conversational distance, which means it is addressed to one reader at a time rather than to a room. It is a private transmission on a public channel.

I read that as a boundary statement. The wearer is not announcing a personality type; they are setting a default response for unsolicited input. The period is the boundary. It says the sentence is finished, and finishing a sentence is a skill that most engineering organizations are bad at. We are excellent at adding. We are poor at closing.

The difference between a slogan and a usable promise

Here is the distinction I keep coming back to. A slogan is a claim designed to survive repetition. A usable promise is a claim designed to survive contact with reality. meh. is the second kind. It promises nothing, so it cannot fail to deliver. Compare it to the slogans that circulate in work culture — the ones about passion, velocity, ownership — which are all promises that require someone else’s cooperation to keep. This shirt requires nothing from anyone. It is the only promise on the floor that is guaranteed to be kept.

That is why I think it functions as a diagram joke for people who read diagrams. In a state machine, the terminal state is not a failure. It is a legitimate outcome, and drawing it explicitly prevents the system from looping forever. meh. is a terminal state rendered in typography. It is the transition arrow that goes nowhere and is labeled honestly.

What the design does not claim

I want to be careful here, because the temptation with an object like this is to over-read it. The shirt does not demonstrate anything about introversion as a psychological category, and I am not going to pretend it does. The retail title uses the word, but the artwork does not. What the artwork shows is a word, a period, and a scale. My reading of the period as a verdict is an interpretation, not a historical claim about where the phrase came from or what it originally meant. I have no evidence for that and I am not offering any.

What I can say is that the design is internally consistent. The lowercase m matches the lowercase everything else. The period is present, and it is the only punctuation. There is no animal, no mascot, no secondary graphic competing for attention. The restraint is total, and total restraint is rare in a category that usually mistakes volume for wit.

If you want the object itself, it is the Meh Funny Sarcastic Introvert Minimalist Saying shirt from Quirky Cotton Collective. The listing title is louder than the garment. That gap is worth noticing.

Why terse messages hold up

In production systems, the messages that survive are the short ones. Long error strings get truncated in logs. Verbose status lines get skimmed. The message that actually reaches a human at 3 AM is the one that fits in a column and ends with a period. meh. is that message. It is not rude. It is not warm. It is complete.

I think that is the useful argument here. The shirt is not funny because it is sarcastic. It is funny because it is finished. Most of what we say at work is unfinished — hedged, qualified, left open for the next meeting. A four-letter sentence with a period is a small act of closure, and closure is the scarcest resource in any organization that runs on consensus.

The scale reinforces it. You have to get close to read it. By the time you have read it, you have already committed to the conversation, and the shirt has already ended it. That is a well-designed interaction: the reader does the work, and the object does nothing extra.

The period as the load-bearing element

Strip the period and you have a mood. Keep the period and you have a decision. That is the whole design, and it is enough. A shirt that says meh is a shirt about being tired. A shirt that says meh. is a shirt about being done, and being done is a position you can defend.

I would not call it minimalist as a style preference. I would call it minimal because every element that could be removed was removed, and what remains is load-bearing. The word carries the meaning. The period carries the verdict. The scale carries the audience. Nothing else is needed, and nothing else is there.

Editorial note: This publication and Quirky Cotton Collective share an owner.

The Element Tiles Don’t Spell the Sentence: Reading the ‘I Wear This Shirt Periodically’ Shirt

The shirt reads I WEAR THIS SHIRT PERIODICALLY, and beneath the words sit four tiles in the visual grammar of the periodic table: 53 I, 74 W, 22 Ti, 16 S. Read the symbols in order and you get I W Ti S. That is not the sentence. It is the sentence’s skeleton, and the gap between the two is the entire joke.

Most slogan shirts ask you to read a line and agree with it. This one asks you to read a line, then read a second layer, then notice that the second layer doesn’t quite resolve. The word periodically is doing double duty: it means occasionally, and it means in the manner of the periodic table. The tiles are the second meaning made visible. But the tiles don’t spell the first meaning. They spell a fragment that only becomes a word when you supply the missing letters yourself.

What the tiles actually encode

Each tile carries an atomic number and a symbol. 53 is iodine, symbol I. 74 is tungsten, symbol W. 22 is titanium, symbol Ti. 16 is sulfur, symbol S. The symbols are correct for those elements. The numbers are correct for those symbols. Nothing on the shirt is chemically wrong.

What’s wrong — deliberately — is the spelling. I W Ti S is not I wear this. It’s close enough that a reader who knows the table fills in the vowels and the missing consonants without thinking. It’s far enough that a reader who doesn’t know the table sees four cryptic boxes and a sentence that doesn’t match them.

That’s the design’s real move. It isn’t a chemistry pun in the sense of a formula that spells a word. It’s a chemistry pun in the sense of a decoding task. The shirt hands you a cipher and trusts you to run it.

Why the mismatch is the point

A shirt that spelled I wear this in element symbols would be a clean substitution. You’d read it once, get it, move on. The pleasure would be momentary and complete.

This shirt withholds that completion. The tiles are almost a spelling. The sentence above them is almost a translation. The reader has to hold both in mind and reconcile them. That reconciliation is the joke, and it only works because the reconciliation doesn’t fully succeed.

I’d argue this is a more durable design than a clean substitution, for the same reason a good diagram joke outlasts a good caption joke. A caption joke is consumed in one pass. A diagram joke requires you to re-read the diagram every time you see it, because the diagram doesn’t resolve into the caption. The mismatch stays active.

The sentence as a boundary statement

There’s a second layer here that has nothing to do with chemistry. I wear this shirt periodically is a statement about frequency, and frequency statements are how technical teams set expectations. A service that runs periodically is not a service that runs continuously. A check that fires periodically is not a check that fires on every event. The word is a boundary word. It tells you what the thing is not promising.

Read that way, the shirt is a small joke about the difference between a slogan and a usable promise. A slogan says always. A usable promise says periodically, and then defines the period. The shirt doesn’t define the period. It just claims the word. That’s the joke’s edge: it’s a frequency claim with no interval attached, which is exactly the kind of claim that gets flagged in a design review.

I don’t think the shirt is making an engineering argument. I think it’s making a language argument, and the language argument happens to land in the same place a lot of engineering arguments land: the word that sounds precise is often the word that’s least defined.

What the shirt is not

It’s not a chemistry lesson. The tiles are correct, but the shirt isn’t teaching the table. It’s using the table’s visual grammar as a substrate for a word game.

It’s not a statement about wearing frequency in any literal sense. The sentence is a setup for the pun, not a claim about laundry schedules.

And it’s not a clean pun. The tiles don’t spell the sentence. If you’re the kind of reader who needs the substitution to close, this shirt will bother you. If you’re the kind of reader who enjoys the gap, it won’t.

The object itself

The shirt is listed as I Wear This Shirt Periodically Funny Chemistry Science Pun under the Quirky Cotton Collective brand. The design is what it is: a sentence, four tiles, a mismatch. The listing doesn’t need to explain the joke, and it doesn’t try to.

Editorial note: This publication and Quirky Cotton Collective share an owner.

Why this kind of design holds up

Most novelty shirts are consumed in a single read. You see the line, you get the joke, you move on. The shirt becomes background noise.

This one resists that. The tiles don’t resolve into the sentence, so the reader keeps re-running the decode. The frequency word doesn’t resolve into a specific interval, so the reader keeps re-checking the claim. The design stays slightly unresolved, and that slight unresolvedness is what keeps it from collapsing into a one-liner.

That’s a real design choice, and it’s the kind of choice that technical readers tend to notice. We spend our working lives reading diagrams that almost match their captions, and captions that almost match their diagrams. The gap between the two is usually a bug. Here it’s the feature.

The shirt doesn’t cure anything, improve anything, or prove anything. It just sits there, spelling I W Ti S, waiting for you to finish the word.

The Dashed Circle and the Solid Ball: Reading the ‘I Had Potential’ Ramp Diagram

Editorial note: This publication and Quirky Cotton Collective share an owner.

The graphic is almost aggressively plain. Across the chest, in white capitals: I HAD POTENTIAL. Below the words, a curved ramp descends from an upper-left ledge to a lower-right flat. At the top of the ramp, on the ledge, sits a dashed empty circle. At the bottom, resting on the flat, is a solid white ball. That is the whole design. No texture, no gradient, no second color. The joke is carried entirely by the geometry and the tense of the verb.

Most shirts in this register — the sarcastic slogan tee, the minimalist quote tee — ask you to read a sentence and laugh. This one asks you to read a diagram and then notice that the diagram is the sentence. The words say had. The picture shows you why the past tense is correct. The ball is not on the ramp. The ball is not at the top. The ball is at the bottom, past the end of the slope, and the circle that might have been the ball is still up on the ledge, drawn as an outline, unfilled. Whatever potential was, it is now a dotted absence in the upper left and a solid object in the lower right.

What the drawing actually shows

I want to be careful here, because it is easy to over-read a two-element cartoon. The supplied visual observation is specific: a curved descending ramp, not a straight diagonal. A dashed empty circle at the upper-left ledge. A solid white ball on the lower-right flat. Those are the facts of the artwork. Everything past this paragraph is my interpretation, and I will flag it as such.

The curve matters. A straight diagonal would read as a generic downward trend — a line going down and to the right, the universal shorthand for decline. A curve reads as a path. It has a shape, a beginning, a steepening, and a flattening. It looks less like a graph of failure and more like a track. Something was supposed to travel along it. The dashed circle is the thing that did not, or the thing that did and left only its outline behind. The solid ball is the thing that did travel, and arrived, and is now sitting still.

So the image contains two objects where a lazier design would contain one. That is the part I keep coming back to. If you wanted to say I had potential and now I am a ball at the bottom of a ramp, you would draw one ball and one ramp. The dashed circle is extra. It is the ghost of the starting position, or the ghost of the version of the ball that never rolled. Either reading works, and the design does not resolve it. That ambiguity is doing real work: it means the shirt is not just a punchline about being a disappointment. It is a punchline about the gap between the outline and the object.

The tense is the whole joke

I had potential. Not I have potential, which would be a motivational poster. Not I wasted my potential, which would be a confession. The past tense plus the absence of an object — potential for what? — is what makes the line land. The sentence refuses to say what the potential was for. It refuses to say who is responsible for the ball being at the bottom. It just states the timeline: there was potential, and now the tense has moved on.

That is a very specific kind of humor, and it is not the same as self-deprecation. Self-deprecation says I am bad at things. This says there was a version of events in which I was good at things, and we are no longer in that version. The difference is structural. One is a trait; the other is a plot. The ramp-and-ball drawing is what turns the sentence from a trait into a plot. Without the diagram, I had potential is just a sad sentence. With the diagram, it is a physics problem with a known outcome.

And the physics is deliberately fake. I want to be clear that this is not a correct free-body diagram. A ball released from rest on a curved ramp would accelerate, sure, but it would also have rotational dynamics, and the curve would determine whether it stays in contact or launches off. The drawing does not care about any of that. It uses the visual grammar of physics — ramp, ball, dashed trajectory, solid rest state — without making a claim about actual mechanics. That is fine. It is a cartoon, not a homework problem. But it is worth naming, because the shirt’s humor depends on the viewer recognizing the grammar and not auditing the math.

Why this works better than the slogan it could have been

There is a version of this shirt that is just text. I Had Potential, centered, maybe in a distressed font. That shirt exists in a thousand variations and it is forgettable, because it asks the reader to supply the entire image. The ramp-and-ball version does the opposite: it supplies the image and lets the text caption it. The text is now a label on a diagram, which is a much more interesting relationship than a slogan on a blank field.

I think this is why the design reads as minimalist without reading as lazy. Minimalism fails when it removes detail that was carrying meaning. This design removes almost everything — two shapes, one line, four words — but the two shapes are doing distinct jobs. The dashed circle carries the past. The solid ball carries the present. The ramp carries the transition. Remove any one of them and the joke collapses into either a motivational poster or a non sequitur.

There is also a small craft decision worth noticing: the dashed circle is empty, and the ball is solid. That is not the only way to draw it. You could draw a solid circle at the top and a dashed circle at the bottom, which would read as the thing I was has become an outline of itself. You could draw both solid, which would read as two balls, one of which rolled. The choice to make the top one dashed and the bottom one solid inverts the usual convention, where the ghost is the thing that is gone. Here the ghost is the thing that never arrived, and the solid thing is the disappointment that did. I do not know if that was intentional. I suspect it was, because the alternative is the more obvious drawing and this is not the more obvious drawing.

What the shirt is not saying

I want to push back on one reading, because it is the reading that would make this shirt worse. The shirt is not saying effort is pointless. It is not saying you will end up at the bottom regardless. The ball is at the bottom because it rolled there, which means it moved, which means something happened. The dashed circle did not move. If the shirt wanted to say nothing matters, it would show the ball still at the top, or it would show no ball at all. Instead it shows a completed journey with an unglamorous destination. That is a different claim. It is closer to the outcome was not the one the outline promised than to there was never any point.

This is also why I do not read it as a work-culture grievance shirt, even though it will get worn to standups. The joke is not about a boss or a team or a performance review. It is about the internal accounting of your own past tense. That makes it portable. You can wear it to a job you love and it still works, because everyone has a dashed circle somewhere.

The object itself

The listing is the I Had Potential Funny Physics Pun Sarcastic Minimalist Quote standard t-shirt from Quirky Cotton Collective. The design is white-on-garment, which is the right call for this drawing: a two-color version would add hierarchy the image does not need, and a single-color version keeps the dashed circle and the solid ball reading as the same kind of mark. The curve of the ramp is the one piece of the design that would suffer most from a bad print — if the curve came out faceted or the dashes merged, the physics grammar would break and the joke would go with it. That is a general observation about curved linework on apparel, not a claim about this specific print run.

I have not worn it, and I am not going to pretend otherwise. What I can say is that the design is legible at the scale it is drawn, and that the joke survives being read from across a room, which is more than most text-only shirts in this category can claim. The diagram is the reason. A sentence has to be read; a ramp and a ball can be seen.

The useful part

If you are the kind of person who reads diagrams for a living, this shirt is a small test of a skill you already have: can you tell what a drawing is saying before you read the caption? The answer here is yes, and then the caption confirms it, and then you notice the dashed circle and the joke gets a second beat. That is a better structure than most slogan shirts manage. It is also, I think, why the design holds up past the first read. The first read is ha, I had potential. The second read is wait, why is the top one dashed. The third read is the one where you decide whether you find that funny or sad, and the shirt does not care which.

That is the whole argument. The ramp is curved because a straight line would be a trend and a curve is a path. The circle is dashed because the past is an outline. The ball is solid because the present is not. And the words are in the past tense because the drawing already told you they had to be.

Interrupt Coalescing and Encode Jitter: Why 60fps Contribution Ingest Is Not a Single-Knob Problem

Search for “tune NIC interrupts for 60fps contribution ingest” and you will find recipes: set rx-usecs to some number, disable adaptive coalescing, pin the IRQ. The premise is that coalescing is one knob and 60fps is one target. The kernel documentation describes something messier. There are at least three distinct batching and deferral layers between the wire and your encoder’s input buffer, and they interact. A change at one layer can be masked or amplified by another. If you tune one number and declare victory, you may have measured the wrong layer.

This article is about how to reason about those layers before you change anything. It is not a recipe. The retrieved sources do not contain a recommended microsecond value for contribution ingest, and I am not going to invent one.

What coalescing actually is

ethtool is the userspace interface for querying and controlling network device driver and hardware settings, particularly for wired Ethernet devices. Its coalescing subcommand exposes the parameters most guides talk about:

ethtool -c|--show-coalesce devname
ethtool -C|--coalesce devname [ adaptive-rx on | off ] [ adaptive-tx on | off ]
  [ rx-usecs N ] [ rx-frames N ] [ rx-usecs-irq N ] [ rx-frames-irq N ]
  [ tx-usecs N ] [ tx-frames N ] [ tx-usecs-irq N ] [ tx-frames-irq N ]

That is from the ethtool(8) man page. The same interface is exposed over netlink as ETHTOOL_MSG_COALESCE_GET and ETHTOOL_MSG_COALESCE_SET, per the kernel ethtool netlink documentation. So the device-level coalescing knobs are real, queryable, and settable. They are also not the whole story.

One caveat worth internalizing before you build a tuning procedure around ethtool: the man page notes that not all network drivers support its functionality in part or whole. A parameter that appears in the synopsis is not a guarantee that your NIC’s driver implements it meaningfully.

Layer one: device IRQ coalescing

The kernel’s NAPI documentation is explicit about where batching normally comes from: “NAPI does not perform any explicit event coalescing by default. In most scenarios batching happens due to IRQ coalescing which is done by the device.” That is the NAPI documentation. So the rx-usecs and rx-frames values you set with ethtool -C are the device’s decision about how long to wait or how many frames to accumulate before raising an interrupt. That is layer one.

The Intel igb driver documentation gives a sense of why the driver cares: in multiqueue mode, “All interrupts are throttled via interrupt moderation. Interrupt moderation must be used to avoid interrupt storms while the driver is processing one interrupt. The moderation value should be at least as large as the expected time for the driver to process an interrupt.” That is from the igb driver documentation. The framing there is about avoiding interrupt storms, not about hitting a frame rate. That distinction matters: the driver’s default is a throughput-protection default, not a latency default.

Layer two: NAPI software coalescing

This is the layer most tuning guides skip. NAPI can be configured to arm a repoll timer instead of unmasking hardware interrupts as soon as all packets are processed. The NAPI documentation describes the controls:

The gro_flush_timeout sysfs configuration of the netdevice is reused to control the delay of the timer, while napi_defer_hard_irqs controls the number of consecutive empty polls before NAPI gives up and goes back to using hardware IRQs.

These can be set globally, or per-NAPI via netlink through netdev-genl. When set per-NAPI, the parameter names use hyphens: gro-flush-timeout and napi-defer-hard-irqs. The kernel source tree ships a script, tools/net/ynl/pyynl/cli.py, that can drive this; the documentation gives an example of the form:

cli.py --spec Documentation/netlink/specs/netdev.yaml \
  --do napi-set \
  --json='{"id": 345, "defer-hard-irqs": 111, "gro-flush-timeout": 11111}'

Why does this matter for contribution ingest? Because if you set rx-usecs to a low value and leave gro_flush_timeout at a high value, you have not removed batching. You have moved it. The device may interrupt promptly, but NAPI may defer re-arming the interrupt and keep polling. From the application’s perspective, packets still arrive in bursts. A packet capture that shows bursty arrival does not tell you which layer produced the burst.

Layer three: IRQ suspension and busy polling

The NAPI documentation describes two more mechanisms that change who is allowed to defer interrupts and for how long.

Busy polling lets a user process check for incoming packets before the device interrupt fires. The documentation is direct about the tradeoff: “As is the case with any busy polling it trades off CPU cycles for lower latency (production uses of NAPI busy polling are not well known).” It is enabled by setting SO_BUSY_POLL on selected sockets, or via the global net.core.busy_poll and net.core.busy_read sysctls.

IRQ mitigation goes further. An application can set SO_PREFER_BUSY_POLL to pledge that it will perform a busy polling operation periodically, and “the driver should keep the device IRQs permanently masked.” The pledge is revoked if gro_flush_timeout passes without any busy poll call. This is a different regime from coalescing: the device is not batching, it is not interrupting at all, and the application is responsible for polling.

IRQ suspension masks device IRQs while epoll triggers NAPI packet processing. The per-NAPI irq-suspend-timeout parameter sets the maximum time an application can have its IRQs suspended. The documentation describes it as a way to balance CPU consumption with network processing efficiency, and notes that the timeout “serves as a safety mechanism to restart IRQ driver interrupt processing if the application has stalled.”

The documented tradeoff for gro_flush_timeout is worth quoting in full because it is directional, not a recommended value:

It is important to note that choosing a large value for gro_flush_timeout will defer IRQs to allow for better batch processing, but will induce latency when the system is not fully loaded. Choosing a small value for gro_flush_timeout can cause interference of the user application which is attempting to busy poll by device IRQs and softirq processing.

Read that carefully. There is no value that is simply “better.” A large value helps batching and hurts latency at low load. A small value helps a busy-polling application and lets device IRQs and softirq processing interfere with it. The right value depends on whether the host is busy-polling, how loaded it is, and what the application is doing between epoll_wait calls.

What changes on a PREEMPT_RT kernel

If the ingest host runs PREEMPT_RT, the picture shifts again. The San Vicente Gutiérrez et al. paper on real-time Linux communications describes the relevant mechanics:

In PREEMPT-RT, most interrupt request (IRQ) handlers are forced to run in threads specifically created for that interrupt. These threads are called IRQ threads. Handling IRQs as kernel threads allows priority and CPU affinity to be managed individually.

And on softirq context:

From version 3.6.1-rt1, the soft IRQ handlers are executed in the context of the thread that raised that Soft IRQ. This means that the NET_RX soft IRQ will be normally executed in the context of the network device IRQ thread, which allows a fine control of the networking processing context.

That sounds good for determinism, and it can be. But the same paper documents the failure mode:

However, if the network IRQ thread is preempted or it exhausts its NAPI weight time slice, it is executed in the ksoftirqd/n (where n is the logical number of the CPU). Processing packets in the ksoftirqd/n context is troublesome for real-time because this thread is used by different processes for deferred work and can add latency. Also, as the ksoftirqd runs with SCHED_OTHER policy, the thread execution can be easily preempted.

This is the part that no coalescing parameter controls. Under load, softirq processing can migrate from the IRQ thread into ksoftirqd, which runs at SCHED_OTHER and can be preempted by anything. If your jitter appears only under load, and you have been tuning rx-usecs, you may be looking at the wrong layer entirely.

The paper also describes NAPI’s own adaptive behavior: “NAPI uses interrupt mitigation when high bandwidth incoming packets are detected. Then, the kernel switches to a polling-based processing, checking periodically if there are queued packets. When there is not as much load, the interrupts are re-enabled again.” And: “The Linux kernel uses the interrupt-driven mode by default and only switches to polling mode when the flow of incoming packets exceeds a certain threshold, known as the ‘weight’ of the network interface.” So NAPI itself changes mode based on load. A measurement taken at one load level may not predict behavior at another.

A diagnostic order for contribution ingest

The following is reasoning derived from the documented layering, not a benchmark result. I am not claiming any specific setting produces 60fps ingest. The point is to avoid changing a parameter at a layer that is not the one adding jitter.

Step 1: Determine whether batching is happening at the device or in software. The NAPI documentation says batching normally comes from device IRQ coalescing, but NAPI software coalescing exists and can be configured. If you disable or minimize NAPI software coalescing (gro_flush_timeout, napi_defer_hard_irqs) and the arrival pattern in your capture does not change, the batching is at the device. If it does change, you were looking at the software layer. Do this before touching ethtool -C.

Step 2: If the host runs PREEMPT_RT, check whether softirq processing is landing in ksoftirqd under load. The ar5iv paper describes this as a state change that adds latency and is not controlled by coalescing parameters. If your jitter correlates with load and with ksoftirqd activity, coalescing is not your first problem.

Step 3: Only then adjust coalescing parameters, one at a time, and re-measure. The three layers interact. A change to rx-usecs can be masked by a gro_flush_timeout that is still deferring interrupts, or amplified by a busy-polling application that is now fighting device IRQs. Change one thing, capture again, compare.

Step 4: Decide whether busy polling is appropriate for this host. The NAPI documentation notes that production uses of NAPI busy polling are not well known, and that busy polling trades CPU cycles for lower latency. On a dedicated contribution ingest host with spare cores, that trade may be acceptable. On a host also running the encoder, it may not be. This is a decision about the host’s role, not a tuning value.

What this article does not claim

It does not claim that any specific rx-usecs, rx-frames, gro_flush_timeout, or irq-suspend-timeout value produces 60fps contribution ingest. The retrieved sources do not contain such a value, and any number I gave you would be invented.

It does not claim that interrupt coalescing alone determines encode jitter. The sources describe coalescing as one layer among several, including NAPI software coalescing, IRQ suspension, busy polling, and on PREEMPT_RT the softirq context migration into ksoftirqd.

It does not claim that SRT, RIST, WebRTC, or QUIC behave differently under coalescing. No retrieved source addresses those protocols in this context. If you are choosing a transport for contribution ingest, that is a separate question from NIC tuning.

It does not claim that a particular NIC, driver, or kernel version is required or sufficient. The igb documentation is cited as an example of how one driver frames interrupt moderation, not as a recommendation.

FAQ

Does ethtool -C work on every NIC? No. The man page states that ethtool is not supported in part or whole on all network drivers. Check ethtool -c output on your specific device before assuming a parameter is settable.

What is the difference between rx-usecs and gro_flush_timeout? rx-usecs is a device-level coalescing parameter set via ethtool. gro_flush_timeout is a NAPI software coalescing parameter that controls how long NAPI waits before re-arming hardware interrupts. They operate at different layers and can both be active simultaneously.

Can I set gro_flush_timeout per queue instead of globally? Yes. The NAPI documentation states that gro_flush_timeout and napi_defer_hard_irqs can be set on a per-NAPI basis using netlink via netdev-genl, with hyphenated parameter names (gro-flush-timeout, napi-defer-hard-irqs).

What does SO_PREFER_BUSY_POLL actually do? It lets an application pledge to the kernel that it will perform busy polling periodically, and the driver should keep device IRQs permanently masked. The pledge is revoked if gro_flush_timeout passes without a busy poll call. This is a different mode from coalescing: the device is not batching, it is not interrupting.

Why does jitter appear only under load? Two documented reasons. First, NAPI switches from interrupt-driven to polling mode when incoming packet flow exceeds the interface’s weight threshold. Second, on PREEMPT_RT, if the network IRQ thread is preempted or exhausts its NAPI weight time slice, softirq processing runs in ksoftirqd, which runs at SCHED_OTHER and can be easily preempted. Neither is controlled by a coalescing value.

Is busy polling a good idea for contribution ingest? The NAPI documentation notes that production uses of NAPI busy polling are not well known, and that it trades CPU cycles for lower latency. Whether that trade is acceptable depends on whether the host has spare cores and whether the application can poll frequently enough to keep the pledge. That is a host-role decision, not a universal recommendation.