0

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

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

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

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

我可以做些什么来提高非持久连接和 nginx 的性能?


[root@spare01 lighttpd-weighttp-c24b505]# ./weighttp -n 1000000 -c 100 -t 16 "http://192.168.1.40/feed.txt"
finished in 52 sec, 315 millisec and 603 microsec, 19114 req/s, 5413 kbyte/s
requests: 1000000 total, 1000000 started, 1000000 done, 1000000 succeeded, 0 failed, 0 errored
status codes: 1000000 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 290000000 bytes total, 231000000 bytes http, 59000000 bytes data




[root@spare01 lighttpd-weighttp-c24b505]# ./weighttp -n 1000000 -c 100 -t 16 -k "http://192.168.1.40/feed.txt"
finished in 5 sec, 921 millisec and 791 microsec, 168867 req/s, 48640 kbyte/s
requests: 1000000 total, 1000000 started, 1000000 done, 1000000 succeeded, 0 failed, 0 errored
status codes: 1000000 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 294950245 bytes total, 235950245 bytes http, 59000000 bytes data
4

1 回答 1

0

您的 2 个测试类似(HTTP Keep-Alives 除外):

 ./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"

使用 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 Keep-Alives(持久连接)使 HTTP 请求运行得更快,因为:

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

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


其次,您说静态文件 XML 大小“小”。

“小”是更接近 1 KB 还是 1 MB?我们不知道。但这在加快速度的可用选项方面有很大的不同。

巨大的文件通常被提供,sendfile()因为它在内核中工作,将用户模式服务器从磁盘读取和缓冲的负担中解放出来。

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


第三,您在测试中使用了 16 个线程。你真的很喜欢客户16 PHYSICAL CPU Cores端和服务器机器吗?

如果不是这种情况,那么您只是将测试速度减慢到不再测试 Web 服务器的程度。


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

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

于 2013-05-12T08:36:29.500 回答