Ubuntu 服务器 10.04.1 x86
我有一台在 nginx 后面带有 FCGI HTTP 服务的机器,它为许多不同的客户端提供许多小的 HTTP 请求。(高峰时段每秒大约 230 个请求,平均响应大小为 650 字节,每天有数百万个不同的客户端。)
结果,我有很多套接字,挂在 TIME_WAIT 中(使用下面的 TCP 设置捕获图表):
我想减少套接字的数量。
除了这个我还能做什么?
$ cat /proc/sys/net/ipv4/tcp_fin_timeout 1 $ cat /proc/sys/net/ipv4/tcp_tw_recycle 1 $ cat /proc/sys/net/ipv4/tcp_tw_reuse 1
更新:有关机器上实际服务布局的一些详细信息:
客户端-----TCP-socket--> nginx(负载均衡器反向代理) -----TCP-socket--> nginx (worker) --domain-socket--> fcgi-software --single-persistent-TCP-socket--> Redis --single-persistent-TCP-socket--> MySQL (其他机器)
我可能应该切换负载平衡器 --> 工作线程连接到域套接字,但关于 TIME_WAIT 套接字的问题仍然存在——我计划很快在单独的机器上添加第二个工作线程。在这种情况下将无法使用域套接字。
我在配置文件中将 tcp_tw_recycle/reuse 都设置为 1。
这样做的后果是什么?
如果重复使用 tcp 套接字,是否会带来安全风险?即 2 个不同的连接都可能能够发送数据?
它适用于重新连接机会很小的短期连接吗?
我正在使用Virtualbox 4.1.8 虚拟化的 Debian Squeeze 6.0.4 x64 上运行的小型 Java EE 1.7.0 / Tomcat 7.0.26 应用程序进行 HTTP 负载测试基准测试(使用Apache Benchmark和Siege)。计算机主机是 Ubuntu 11.10 x64。
我在 Tomcat 中修改了这些参数server.xml
:
<Connector
port="8080"
protocol="HTTP/1.1"
connectionTimeout="200000"
redirectPort="8443"
acceptCount="2000"
maxThreads="150"
minSpareThreads="50" />
Run Code Online (Sandbox Code Playgroud)
在服务器上执行的应用程序大约需要 300 毫秒。
这个应用程序运行良好,直到达到一定数量的并发连接,例如:
ab -n 500 -c 150 http://xx.xx.xx.xx:8080/myapp/
ab -n 1000 -c 50 http://xx.xx.xx.xx:8080/myapp/
siege -b -c 100 -r 20 http://xx.xx.xx.xx:8080/myapp/
Run Code Online (Sandbox Code Playgroud)
socket connection timed out
发生了很多事情,这使主机处理器完全过载(但 VM 内的 CPU 负载是正常的)。
htop
在主机上执行一个操作,我可以看到 Virtualbox 进程在 300% CPU 下运行,并且即使在负载测试完成后也 …
ubuntu ×2
debian ×1
high-load ×1
java ×1
load-testing ×1
nginx ×1
socket ×1
tcp ×1
tomcat ×1
virtualbox ×1