Skip to content
HomeVideosBooksBlogs
AllTop postsTopics
Podcasts
HistoryListsWatch laterLiked videosFollowing

The videos, books, blogs and podcasts Hacker News keeps recommending, all in one place.

VideosBooksBlogsPodcastsAboutPrivacySettings

Data from Hacker News, HackerTube, HackerBooks, HackerBlogs and Open Library. Credits · Not affiliated with Y Combinator.

HomeVideosBooksBlogsPodcasts
Ctrl K
    S

    Shuveb Hussain

    unixism.net · Personal blog · on HN since 2019

    Shuveb Hussain writes Linux performance tutorials, including io_uring guides, example web servers, and deep dives on Firecracker and PSI.

    Visit blogHN submissions
    Systems & PerformanceOpen Source & Linux
    What HN says

    Commenters point to his io_uring tutorial as fantastic learning material, with examples such as the SQ polling demo using BPF.

    Stats for nerds
    28HN people shared it
    29linked in comments
    1.9Kstory points
    Apr 2026last shared
    2020people per year2026

    Top posts on HN

    1. 1
      Show HN: ZeroHTTPd: A web server to teach Linux performance, with benchmarks
      6 people · 521 points · first shared 2019 · 57 comments on HN
    2. 2
      Lord of the io_uring: io_uring tutorial, examples and reference
      6 people · 318 points · first shared 2020 · 74 comments on HN
    3. 3
      A Manager’s Guide to Kubernetes Adoption
      1 person · 214 points · first shared 2019 · 102 comments on HN
    4. 4
      Gocker: Docker implemented in 1.3k lines of Go
      1 person · 192 points · first shared 2020 · 85 comments on HN
    5. 5
      Io_uring By Example: cat, cp and a web server with io_uring
      2 people · 190 points · first shared 2020 · 37 comments on HN
    6. 6
      Lord of the Io_uring (2020)
      3 people · 175 points · first shared 2022 · 62 comments on HN
    7. 7
      Linux Pressure Stall Information (PSI) by Example
      2 people · 132 points · first shared 2019 · 18 comments on HN
    8. 8
      Show HN: Sparkler – A KVM-Based Virtual Machine Manager
      1 person · 108 points · first shared 2019 · 8 comments on HN
    9. 9
      How AWS Firecracker works: A deep dive (2019)
      2 people · 13 points · first shared 2019 · Discussion on HN
    10. 10
      Io_uring by Example
      1 person · 4 points · first shared 2025 · Discussion on HN

    What HN people wrote when they linked it

    • LargoLasskhyfvJul 2025

      Depends on your usage patterns. On 8GB I gave it (ZRAM) between 512MB to 768MB RAM, and later on just using whatever values for the relevant sysctls AntiX was using(or their scripts created dynamically during setup/startup) at the time. It isn't just vm.swappiness, there are others, and they changed, or got removed, and replaced by others, over the years. And all of them sort of interwoven, influencing each other via what's happening in vm-subsystem. Can have bad feedback loops if you do it wrong, and be counterproductive. So you have to experiment, and measure with different settings, for what you're running.

      Where measure can be anything from htop/atop over https://github.com/cdown/psi-notify , to https://github.com/noiseonwires/memory-pressure and so on.

      To understand what these sysctls are about, how they are related to each other, and to ZRAM, I'd recommend reading, or at least skimming https://chrisdown.name/2018/01/02/in-defence-of-swap.html , https://chrisdown.name/2019/07/18/linux-memory-management-at-scale.html , https://linuxblog.io/linux-performance-almost-always-add-swap-space , https://linuxblog.io/linux-performance-almost-always-add-swap-part2-zram , https://linuxblog.io/linux-performance-no-swap-space , https://linuxblog.io/running-out-of-ram-linux-add-zram , https://github.com/ValveSoftware/SteamOS/issues/899 , https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio , https://github.com/CachyOS/CachyOS-Settings/pull/19 ,…

    • lelanthranJan 2022

      > Interesting CGI content linked on there.

      >

      >I've been reading about / hacking on CGI recently, and it's been kinda fun!

      >

      >Question: One thing I keep reading is how inefficient it is to start a new process for each incoming connection. Could someone explain to me why that's such a bottleneck? I imagine it being an issue back when CGI was used everywhere, people moving away from CGI, and forgetting about it. But hasn't there been improvements in the meantime? Computers from today can run circles around those from a few decades back. Has everything improved except the speed / efficiency of starting a new process?

      >

      It's not as bad as you think it is; just change the webserver to pre-fork. From this link[1], and the nice summary table in this link[2] - I note the following:

      1. pre-forked servers perform very consistently (the variation before being overwhelmed) and appears at a glance to only be less consistent than epoll.

      2. For up to 2000 concurrent requests, the pre-forked server performed either within a negligible margin against the best performer, or was the best performer itself.

      3. The threaded solution had the best graceful degradation; if a script was monitoring the ratio of successfull responses, it would know well beforehand that an imminent failure was coming.

      4. The epoll solution is objectively the best, providing both graceful degradation as well as managing to keep up with 15k concurrent requests without complete failure.

      With all of the above…

    • Tuna-FishSep 2024

      > That's not all, though, right? Unless you're using the dubious kernel-driven polling thread, which I gather is uncommon, you _also_ have to make a submit system call of some kind after you've finished appending stuff to your submit queue. Otherwise, how would the kernel know you'd done it?

      Correct, the "check for new entries" system call is called io_uring_enter(). (0)

      > Some system calls are not especially asynchronous: they perform some amount of work that isn't asynchronously submitted to some hardware in quite the same way as, say, a disk write may be. What thread is actually performing that work? Does it occur immediately during the submit system call, and is completed by the time that call returns? Is some other thread co-opted to perform the work?

      A kernel thread. The submit system call can be optionally made to wait for completion, but by default it will always immediately return.

      > Whose scheduling quantum is consumed by this?

      That's a good question. The IO scheduler correctly sees them as belonging to the submitting thread, but if you issue a bunch of computation-heavy syscalls, I would not be surprised if they were not correctly accounted for.

      (0) https://unixism.net/loti/ref-iouring/io_uring_enter.html#c.io_uring_enter

    • jauntywundrkindMar 2025

      I've been super curious to see what was at stake here! This sounds better than I'd dared to hope for.

      I kind of thought this was just gonna be some kind of deferred texture loading thing, help with streaming assets.

      If it actually allows inter-warp sequencing, it sounds like it might possibly solve the chief complains supreme GUI master Raph Levien recently had in I want a good parallel computer, which so that even though we can dynamically add shaders & construct a dynamic workgraph (largely thanks to VK_AMDX_shader_enqueue?), there isn't any sequencing/fencing/barrier-ing between the sections. https://raphlinus.github.io/gpu/2025/03/21/good-parallel-computer.html https://news.ycombinator.com/item?id=43440174

      Not applicable to GPUs, but since I ran into it recently, it's interesting to see how io_uring handles sequenced submissions. Here's Lord of io_uring's write-up, https://unixism.net/loti/tutorial/link_liburing.html#link-liburing

      Edit: having read the article more fully, I'm not sure this is about waves depending on each other. Maybe more about them trying to access memory. Apologies. Hopefully someday!

    • KirillPanovApr 2021

      > The security credentials of an io_uring are established at creation time.

      Well, the security credentials of a file descriptor are established at ```open()``` time. Is this really so different?

      Running through the list of io_uring opcodes, only two of them work on ```char*``` paths: IORING_OP_OPENAT and IORING_OP_OPENAT2, which were added to io_uring after it was introduced. All the rest operate solely upon already-opened file descriptors, and POSIX doesn't do any permission checks for operations on already-open descriptors anyways.

      It sounds like the issue you mention was an oversight when IORING_OP_OPENAT(2) were added. The easy, and retroactively safe, fix is to forbid these opcodes on submission queues by default, unless the submission queue was opened with a special flag whose name includes a scary warning -- something like IOURING_I_WILL_NOT_SETUID_WITHOUT_CLOSING_THIS_RING_FIRST.

      https://unixism.net/loti/ref-iouring/io_uring_enter.html

    • Const-meOct 2020

      Good article. However, it would be interesting to compare these two things against better system calls.

      > the data referred to by these pointers must be copied into the kernel

      Modern OS kernels avoid that when they can. The article is about Linux, modern ones have io_uring: https://unixism.net/loti/what_is_io_uring.html

      In short, that thing allows to setup these pointers in advance, and make the memory visible to both user-mode code and OS kernel at the same time. This way no need to copy the data.

      Unfortunately, implementing that thing is way more complicated than calling read() or setting up memory mapping. For optimal performance you gonna need to zero-copy all the way up to whatever code is consuming the data read from these files.

    Related

    Chips and Cheesechipsandcheese.com185 people

    Google's Liquid Cooling

    Chips and Cheese
    Publication · last shared 2026
    Apfelmusapfelmus.nfshost.com22 people

    How Does Lazy Evaluation Work in Haskell? (2014)

    Apfelmus
    Personal · last shared 2023
    purplesyringapurplesyringa.moe39 people

    WebP: The WebPage Compression Format

    purplesyringa
    Personal · last shared 2026
    Mattobox.matto.nl15 people

    We Must Revive Gopherspace (2017)

    Matto
    Personal · last shared 2025
    NetBSD Blogblog.netbsd.org66 people

    NetBSD fully reproducible builds

    NetBSD Blog
    Company · last shared 2026
    Tyler Langloisblog.tjll.net46 people

    SSH Kung Fu

    Tyler Langlois
    Personal · last shared 2026
    Scott Loweblog.scottlowe.org27 people

    Conditional Git Configuration

    Scott Lowe
    Personal · last shared 2025
    ScyllaDB Blogscylladb.com167 people

    How io_uring and eBPF Will Revolutionize Programming in Linux

    ScyllaDB Blog
    Company · last shared 2026