Kazuho Oku, author of the H2O HTTP server, writes about HTTP/2 performance, parsers, sprintf optimization and libuv.
HN commenters cite him on HTTP/2 push and cache awareness, and praise his qrintf sprintf-optimizing compiler as a neat find.
That's the thing, it doesn't. HTTP2 Push is one of the big "open field" of HTTP2, and to know whether a document needs to be pushed will rely on good heuristics and black magic.
There is however a small standard that's emerging, pioneered by h2o, called casper (https://h2o.examp1e.net/configure/http2_directives.html#http2-casper). The idea is that all resources ever sent to the client are stored in a probabilistic data structure in a cookie. On every request the structure is sent back to the server, which can then check whether the resource has good chances to be already known by the browser.
By the way there are some benchmarks done by h2o's author here: http://blog.kazuhooku.com/2015/10/performance-of-http2-push-and-server.html. The conclusion is all yours.
The most interesting thing I learned from this article is the sprintf() pre-compiler (http://blog.kazuhooku.com/2014/10/announcing-qrintf-and-qrintf-gcc.html). That's awesome.
The rest, well, its a helpful check on over enthusiasm to be familiar with the shortcomings of UNIX. By dint of its popularity, diversity and long lineage, UNIX and its derivatives are particularly rich in warts. Yet, I think it must be true of all real-world operating systems with a long life that cruft, workarounds and ossified bad ideas accumulate.
The main problem with http2 push and why it’s pointless is that it’s not cache aware.
So you’re pushing unrequested data to everyone regardless.
h2o tries to solve this problem with a special cookie. More here:
http://blog.kazuhooku.com/2015/12/optimizing-performance-of-multi-tiered.html
But without something like that it’s a feature that will never really gain traction.
See also
http://blog.kazuhooku.com/2014/04/announcing-unco-undo-changes-to-files.html