在一个项目中,我们需要服务器一个小的静态xml文件~40k/s
所有传入的请求都是从HAProxy发送到服务器的。但是,没有一个请求是持久的。
问题是,当对非持久性请求进行基准测试时,nginx实例的上限为19 114 req/s。当启用持久连接时,性能提高了近一个数量级,达到16867 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
你的两个测试是相似的(除了HTTP keep - alive):
./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 - alive的速度快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
,客户端必须为每个请求建立一个新的连接(由于TCP握手,这很慢)。使用
HTTP Keep-Alives
,客户端可以一次发送所有请求(使用相同的连接)。
第二,你说静态文件XML的大小是"小"。
"小"是接近1kb还是1mb ?我们不知道。但这在加速的可用选项方面产生了巨大的差异。
大文件通常通过sendfile()
提供,因为它在内核中工作,将用户模式服务器从读取磁盘和缓冲的负担中解放出来。
小文件可以在用户模式下为应用程序开发人员提供更灵活的选项,但这里文件大小也很重要(字节和千字节是不同的动物)。
第三,您在测试中使用16个线程。您真的喜欢在客户机和服务器机器上同时使用 16 PHYSICAL CPU Cores
吗?
如果不是这样,那么你只是在降低测试速度,以至于你不再测试web服务器。
正如你所看到的,许多因素都会影响性能。还有更多的操作系统调优(TCP堆栈选项,可用的文件句柄,系统缓冲区等)。
为了充分利用系统,您需要检查所有这些参数,并为您的特定练习选择最佳参数。