Server Response Header Change #5673
Replies: 29 comments
-
Shamelessly pinging some folks @benaadams @sebastienros @joanhey @jcheron @zloster @bgrainger @an-tao @lpereira @amichair |
Beta Was this translation helpful? Give feedback.
-
Initially I thought (1) was a bad idea; as people will just remove the server header and some implementations may not be able to so be disadvantaged. However, in production the server header is often removed and in RFC 7231 it changed to a MAY rather than a MUST (which I think it was in the earlier HTTP specs?)
(3) likewise may cause issues for people that can't change their server header; which would be more problematic than removing the requirement as they will just fail; rather than being disadvantaged. It's mostly a major factor for So I'd err to (1) or (2) |
Beta Was this translation helpful? Give feedback.
-
These are band-aids, and I am sure we are all very sad that we have arrived at these solutions, but also maybe super glad that frameworks are now so fast that we have to talk about these kind of changes. Looking at the original issue, we are measuring the network performance with Plaintext, just that. So I really see three options right now:
These options might not match with your schedule. My opinion about your options then would be to not have any requirement. If the framework can remove the header, or optimize it, then it's all good for the performance. |
Beta Was this translation helpful? Give feedback.
-
@sebastienros I agree with everything you said, except that I'm trying to focus more on normalization across all implementations in this particular issue rather than the issue of the network being the bottleneck for the top tier implementations. I think that's a separate issue we'd also like to tackle. |
Beta Was this translation helpful? Give feedback.
-
I particularly never cared too much about the Having said that, I agree with @benaadams's points. I also think that either (1) or (2) would be fine for me. (FWIW, as it is today, you can't override/remove the As @sebastienros mentioned, the clients are often the bottleneck with these tests, especially when constrained by network I/O. Writing a new one (or modifying e.g. this weighttp fork) to take advantage of things like |
Beta Was this translation helpful? Give feedback.
-
I think we might be doing a poor job communicating that this benchmark isn't meant to reflect reality. We elude to this in the test requirements for it, but we could do a better job.
We're discussing more options for this, like using the db server as another wrk client during plaintext and json tests
Thanks for your input! Seems we definitely have some options in the lead. |
Beta Was this translation helpful? Give feedback.
-
Oh, no, it's very clear the plaintext benchmark is a "go nuts" thing. I'm just grumpy because my toy isn't in the top 10 with the cool kids. :) |
Beta Was this translation helpful? Give feedback.
-
And, BTW, I like the idea of using the db server as an additional client for the benchmarks that do not require database access. |
Beta Was this translation helpful? Give feedback.
-
I have been impressed that; whether by design or accident, each benchmark, including plaintext, has managed to push on a different weak point for improvement for the frameworks. I assume by design 😉 |
Beta Was this translation helpful? Give feedback.
-
I agree with everyone above, I'd like to choose option 1 or 2. |
Beta Was this translation helpful? Give feedback.
-
I think no matter which option, it has an impact on all tests. I think it should be applied to all tests, at least when / JSON and / plaintext. by the way I'd like to choose option 1 or 2. |
Beta Was this translation helpful? Give feedback.
-
This argument gets thrown around a lot, and over the years I have never really been able to communicate why I think
It also serves as a valuable piece of data when looking at the whole - when you look at progressively more and more business logic (json, db, queries, updates, fortunes) one gains a sense of the cost of such operations. Something at the core of the project and one of the founding questions we had when we started this project is "what does one line of code cost in performance?" I think @sebastienros makes a good point about the value of the I am personally in favor of options 1 and 3, and find that 2 is just setting a standard to which the players who are gamifying the |
Beta Was this translation helpful? Give feedback.
-
Of the options presented, option 1 is my preference. For the Plaintext test, and this test only, removing this header seems reasonable. It eliminates some potential bandwidth variability where available bandwidth has proven to be a significant driver of results, at least among the highest performance tier. |
Beta Was this translation helpful? Give feedback.
-
I am in favor of removing the Server header as a requirement for the plaintext test as well. That is the simplest way to ensure the uniformity of the response across frameworks. I would also like to make another suggestion. Since there is still resistance to fully removing the pipelining aspect of the plaintext test, what do you guys think about reducing the number of pipelined requests sent by wrk? That will allow us to actually get a true view of what top 10 performers look like relative to each other and the rest of the field. It is currently set to 16 but it could be reduced to 12, 10, 8 or whatever number works such that only the absolute fastest test can approach the bandwidth limits. If tests get even faster, we can drop the number even further, if the available bandwidth increases, we can increase it again. |
Beta Was this translation helpful? Give feedback.
-
The length of the headers and url, impact in all tests. Especially in the plaintext. I think that the minimum length server header is the correct (option 2), if we want a realistic approach. Why ?
About the HTTP pipelining the problem is that the results are mixed with and without pipeline. So you can't compare one with another. The worst is the people that arrive to see the bench, and they don't know they are mixed. They only see a big difference. |
Beta Was this translation helpful? Give feedback.
-
NGNIX violates the http spec; it should add itself to
It allows for overriding fields as an option but not by default: RFC 7230 in 5.7.2
And NGNIX isn't normally used as a transforming proxy. Other reverse proxies:
So it's quite an anomaly in doing this. This is aside from RFC 7231 in 7.4.2 saying you no longer have to bother with the server header
|
Beta Was this translation helpful? Give feedback.
-
I would be in favour of option 3, which would enforce a guideline for all frameworks to follow, or else just enforce a minimum length via option 2. |
Beta Was this translation helpful? Give feedback.
-
I think we all want a fair playground and normalize the tests between different frameworks. |
Beta Was this translation helpful? Give feedback.
-
Is a minimum going to be enforced for round 20? Or are we all going to end with a bunch of single letter server names? |
Beta Was this translation helpful? Give feedback.
-
@talawahtech a min length requirement for the routes exists in the toolset now. A test should not pass verification unless they meet that minimum. |
Beta Was this translation helpful? Give feedback.
-
@nbrady-techempower right, the requirement is clear for routes, but it is unclear for the "Server" HTTP header, will a minimum be enforced for that as well? |
Beta Was this translation helpful? Give feedback.
-
@talawahtech Those changes have not been made yet. There's still time before Round 20 closes, which frameworks do you think are getting a competitive edge from single letter server names? If you can open up an issue with listing them, I'll take a look when I can. |
Beta Was this translation helpful? Give feedback.
-
@nbrady-techempower well as an example, the Server header for the dotnet platform implementation is currently set to "K"[1] (and that is technically allowed). I assume the full header would otherwise be "Kestrel" which is 7 letters, and removing those 6 letters probably allows an extra 1-2% worth of requests to get though with the current bandwidth limit. But my question is, if you are looking at it on a cases by case basis, what is the unofficial requirement going to be? Can/Should I reduce the Server name for the libreactor implementation to 7 letters as well? |
Beta Was this translation helpful? Give feedback.
-
Exactly. We raised the issue for the routes, and it has been defined since then. For Plaintext every char matters, so we optimized it for the Platform scenarios, not the other more complex ones (MVC and Middleware). |
Beta Was this translation helpful? Give feedback.
-
@talawahtech This RFC is still open, so you're free to do that. It's not being enforced yet; the routes are. |
Beta Was this translation helpful? Give feedback.
-
My other favorite, Actix, does it too with a single |
Beta Was this translation helpful? Give feedback.
-
Ok, I guess it will be "L" for libreactor until the requirement changes. |
Beta Was this translation helpful? Give feedback.
-
After round 20, I think we're settling on a min 3 with a recommendation of |
Beta Was this translation helpful? Give feedback.
-
I think pico.v was first to use single letter server header Am fine with |
Beta Was this translation helpful? Give feedback.
-
Currently, we have this rule in the general requirements:
We are thinking about making a change here in an effort to continue normalizing across all implementations for Round 20 and beyond. With the current requirement, we have some frameworks that leave their default Server header (maybe
express
) and some that are meeting the minimum requirements using 1 character.We've come up with a few options to mitigate this, though we have not reached a consensus internally and would like to hear your thoughts.
Server: TFB
for all implementationsplaintext
test and apply one of the above options to all other tests.Let's chat!
Beta Was this translation helpful? Give feedback.
All reactions