[问题] Ningx High Concurrent求解

楼主: b60413 (None)   2014-10-17 10:57:58
手边有一台Server, 设备大概是16G, 16 Core CPU,
打算拿来建置一台Backend Web Server(只跑PHP),
套件部分使用Nginx(0.8.6)、PHP-fpm,
希望可以达到每秒钟并发数在200~500之间,
实际架设后并使用ApacheBench测试(-n10000 -c200)的结果是,
只要当系统的TIME_WAIT达到6000(net.ipv4.tcp_max_tw_buckets)之后,
服务器的反应开始下降(使用tshark观察), 并且就卡住了,
最后ab会发出apr_socket_recv: Connection timed out (110)的讯息,
尤其反复测试后, 在先前的TIME_WAIT释放之前, Server都会处于非常慢的状况,
请问有哪些细节是没有注意到还可以持续优化的吗?
还是这台机器的等级, 没有办法处理这么高并发的数量?
中间, 有使用ss去观察TIME_WAIT的timer倒数,
发现每次都是从60秒开始倒数,
请问有办法降低这个数值吗?
或者让Nginx的连接在client关闭后,
直接将该资源回收掉吗?
目前一直着眼在TIME_WAIT的问题,
是否我思考的方向有错?
还请有经验的指点迷津,
感谢.
kernel参数调整如下,
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_mem = 786432 10485760 15728640
net.ipv4.tcp_wmem = 4096 10485760 20971520
net.core.wmem_max = 20971520
net.ipv4.tcp_rmem = 4096 10485760 20971520
net.core.rmem_max = 20971520
/etc/limits.conf调整如下,
* soft nofile 65535
* hard nofile 65535
Ningx的主要相关设定如下,
worker_processes 8;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 51200;
}
PHP-fpm的主要相关设定如下,
backlog = 8192
max_children = 256(static)
rlimit_files = 65535
作者: danny8376 (钓到一只猴子@_@)   2014-10-17 14:33:00
MSL是写死在kernel的 这值除非重新compile不然调不了不过可以调整减轻状况 net.ipv4.tcp_tw_recyclenet.ipv4.tcp_tw_reuse 这两个设成 1看来已经调整了XD然后tcp_max_tw_buckets不该调低这会让TIME_WAIT允许数量严重不足疴... 说错 tcp_max_tw_buckets 还不够高
楼主: b60413 (None)   2014-10-17 15:29:00
有试着将tcp_max_tw_buckets调整到10000发现服务器回应的时间变长了, ab还是无法送完一万个请求并且发送成功的请求数量降低了
作者: danny8376 (钓到一只猴子@_@)   2014-10-17 16:04:00
不过我自己-c1000都能正常过-n10000了不管kernel还是nginx参数都没调过...
楼主: b60413 (None)   2014-10-17 16:10:00
如果是这样的话, 会跟软、硬件防火墙有比较大的关系吗?已经在网络上查过各式的调整法, 也都实际试过, 一直无解..
作者: kenduest (小州)   2014-10-17 16:13:00
手上几台商用 web 提供大量连线对外方式,一般作法不是一台撑起全部服务,大多会分散提供大量存取有考虑虚拟化技术方式分散吗?高档 server 不用这个东西其实 cpu 算是相当闲置没有被大量利用到虚拟化之后 os 本身这类网络负荷问题也可以得以舒缓
楼主: b60413 (None)   2014-10-17 16:20:00
愿意试看看, kenduest可以提供相关简易的资讯吗? 谢谢
作者: kenduest (小州)   2014-10-17 16:22:00
你可以网络上爬文一下,目前 linux 都用 kvm 虚拟化技术ubuntu or rh-based 等 linux 版本网络上都很多资讯不过后续你要搭配其他方式来 loading balance跑 bridge 网络架构,透过其他硬件平衡负载器分散存取或者是 nat 模式你还要搭配 iptables nat 设定功能
楼主: b60413 (None)   2014-10-17 16:24:00
目前是希望可以先将单台服务器设置好, 才会去做附载平衡原本以为设备比较好的机器, 应该有办法负载这么大的请求
作者: kenduest (小州)   2014-10-17 16:25:00
或者是搭配 nginx 的 proxy 方式提供分散到多台虚拟机
楼主: b60413 (None)   2014-10-17 16:25:00
所以才希望试看看, 是否可以单纯修改设定就达到一定的成果
楼主: b60413 (None)   2014-10-17 16:27:00
目前测试时, 都是使用Virtual Box创建测试机请问这算是你说的KVM技术吗?
作者: kenduest (小州)   2014-10-17 16:30:00
virtualbox 是一个 vm 实作的软件,商业的 server 服务没会去用这个提供实际服务,linux kvm 比较可靠
作者: danny8376 (钓到一只猴子@_@)   2014-10-17 17:39:00
楼上... 你用iptables nginx都不重要现在问题是他的kernel就是吃不下那连线数后端分散了 负责分散的前端连线问题还是在啊
作者: kenduest (小州)   2014-10-17 18:19:00
问个问题,有没有想过是 client 端自己的问题若你测试端都是固定一台机器的话,那 client 端也会导致因为过多的 TIME_WAIT 会导致无法正常连线存取至于平衡负载架构,前端是有所谓瓶颈问题,但是NAT 那边是另外一个处理单纯自己连线的谕时问题分散可以先减低单一台 WEB server 本身 TIME_WAIT 问题分散还有其他方式,像是 DNS 分散架构所以 dns balance + l4 balancer + multi server 分散不过好像与原贴问题已经没很直接关系了这篇另外也讨论到相关议题: http://goo.gl/wllY3P
作者: newsp (戴面具的人)   2014-10-20 09:44:00
ab 自己要打到那么高也不是件容易的事

Links booklink

Contact Us: admin [ a t ] ucptt.com