Networking 使用静态文件扩展nginx——非持久性请求kill req/s

Networking 使用静态文件扩展nginx——非持久性请求kill req/s,networking,nginx,haproxy,g-wan,Networking,Nginx,Haproxy,G Wan,在一个项目中,我们需要为一个小的静态xml文件~40k/s提供服务器 所有传入请求都从HAProxy发送到服务器。但是,没有一个请求是持久的 问题是,当使用非持久性请求进行基准测试时,nginx实例的上限为19 114 req/s。启用持久连接后,性能将提高近一个数量级,达到168 867 req/s。结果与G-wan相似 在对非持久性请求进行基准测试时,CPU使用率最低 如何使用非持久性连接和nginx提高性能 您的两个测试类似(HTTP保持有效除外): 而使用HTTP Keep Alive

在一个项目中,我们需要为一个小的静态xml文件~40k/s提供服务器

所有传入请求都从HAProxy发送到服务器。但是,没有一个请求是持久的

问题是,当使用非持久性请求进行基准测试时,nginx实例的上限为19 114 req/s。启用持久连接后,性能将提高近一个数量级,达到168 867 req/s。结果与G-wan相似

在对非持久性请求进行基准测试时,CPU使用率最低

如何使用非持久性连接和nginx提高性能


您的两个测试类似(HTTP保持有效除外):

而使用HTTP Keep Alives的速度快了10倍:

finished in 52 sec, 19114 req/s, 5413 kbyte/s
finished in 5 sec, 168867 req/s, 48640 kbyte/s

首先,
HTTP保持有效性(持久连接)使HTTP请求运行得更快,因为:

  • 如果没有HTTP Keep Alives
,客户端必须为每个请求建立一个新的连接(由于TCP握手,这很慢)

  • 使用HTTP Keep Alives,客户端可以一次发送所有请求(使用相同的连接)。这会更快,因为要做的事情更少


  • 第二,您说静态文件XML大小是“小的”

    “小”是接近1KB还是1MB?我们不知道。但这在加速事情的可用选项方面产生了巨大的差异

    大型文件通常通过
    sendfile()
    提供,因为它在内核中工作,从而将usermode服务器从读取磁盘和缓冲的负担中解放出来

    小文件可以使用用户模式下应用程序开发人员可以使用的更灵活的选项,但在这里,文件大小也很重要(字节和千字节是不同的动物)


    第三,您在测试中使用了16个线程。您真的喜欢客户端和服务器机器上的16个物理CPU核吗

    如果不是这样,那么您只是将测试速度降低到不再测试web服务器的程度


    正如您所见,许多因素都会影响性能。操作系统调优还有更多功能(TCP堆栈选项、可用文件句柄、系统缓冲区等)


    为了充分利用系统,您需要检查所有这些参数,并为您的特定练习选择最佳参数。

    谢谢@Gil。我将分三部分作出实物答复。首先,经过你的解释,这种区别是有意义的。我对这种情况的分析是,因为nginx可以使用keepalive服务168k req/s,所以将其保持在19k的瓶颈必须在操作系统或TCP调优中。这是正确的吗?其次,XML文件是59个字节。我尝试过启用和禁用sendfile()(显然)没有效果。第三,两台服务器上都有8个超线程,而不是16个内核,这是正确的。我将调整这些设置并重新进行基准测试。最后,由于瓶颈似乎处于连接阶段,您能推荐一些资源来解决这个问题吗?我能找到的大多数页面只是简单地规定了大量的sysctl-TCP设置,没有任何解释。没有一个产生了很大的影响。再次感谢!由于TCP hanshaking是在内核中完成的,因此调优TCP堆栈(在内核中实现)是您唯一的选择,除非您认为在用户模式下可以做得更好。这种调整是通过修改sysctl配置来实现的,正式“记录”在中,但另一个参考更有用:。你能接受我的回答吗?
     ./weighttp -n 1000000 -c 100 -t 16 "http://192.168.1.40/feed.txt"
     ./weighttp -n 1000000 -c 100 -t 16 -k "http://192.168.1.40/feed.txt"
    
    finished in 52 sec, 19114 req/s, 5413 kbyte/s
    finished in 5 sec, 168867 req/s, 48640 kbyte/s