网络调优如果不先对nginx和node.js的底层传输机制有所了解,并进行针对性优化,可能对两者再细致的调优也会徒劳无功。一般情况下,nginx通过tcpsocket来连接客户端与上游应用。我们的系统对tcp有许多门限值与限制,通过内核参数来设定。这些参数的默认值往往是为一般的用途而定的,并不能满足web服务器所需的高流量、短生命的要求。这里列出了调优tcp可供候选的一些参数。为使它们生效,可以将它们放在/etc/sysctl.conf文件里,或者放入一个新配置文件,比如/etc/sysctl.d/99-tuning.conf,然后运行sysctl-p,让内核装载它们。我们是用sysctl-cookbook来干这个体力活。需要注意的是,这里列出来的值是可以安全使用的,但还是建议大家研究一下每个参数的含义,以便根据自己的负荷、硬件和使用情况选择一个更加合适的值。
<spanstyle="font-size:14px;color:#009900;font-family:microsoftyahei">net.ipv4.ip_local_port_range='102465000'
net.ipv4.tcp_tw_reuse='1'
net.ipv4.tcp_fin_timeout='15'
net.core.netdev_max_backlog='4096'
net.core.rmem_max='16777216'
net.core.somaxconn='4096'
net.core.wmem_max='16777216'
net.ipv4.tcp_max_syn_backlog='20480'
net.ipv4.tcp_max_tw_buckets='400000'
net.ipv4.tcp_no_metrics_save='1'
net.ipv4.tcp_rmem='40968738016777216'
net.ipv4.tcp_syn_retries='2'
net.ipv4.tcp_synack_retries='2'
net.ipv4.tcp_wmem='40966553616777216'
vm.min_free_kbytes='65536'</span>
重点说明其中几个重要的。
net.ipv4.ip_local_port_range
为了替上游的应用服务下游的客户端,nginx必须打开两条tcp连接,一条连接客户端,一条连接应用。在服务器收到很多连接时,系统的可用端口将很快被耗尽。通过修改net.ipv4.ip_local_port_range参数,可以将可用端口的范围改大。如果在/var/log/syslog中发现有这样的错误:“possiblesynfloodingonport80.sendingcookies”,即表明系统找不到可用端口。增大net.ipv4.ip_local_port_range参数可以减少这个错误。
net.ipv4.tcp_tw_reuse
net.ipv4.tcp_fin_timeout
这是处于time_wait状态的连接在回收前必须等待的最小时间。改小它可以加快回收。如何检查连接状态
netstat-tan|awk'{print$6}'|sort|uniq-c
或使用ss:
tcp:47461(estab311,closed47135,orphaned4,synrecv0,timewait47135/0),ports33938
frag000
upstreambackend_nodejs{
servernodejs-3:5016max_fails=0fail_timeout=10s;
servernodejs-4:5016max_fails=0fail_timeout=10s;
servernodejs-5:5016max_fails=0fail_timeout=10s;
servernodejs-6:5016max_fails=0fail_timeout=10s;
}
我还按它的建议修改了server一节的proxy设置。同时,加了一个proxy_next_upstream来跳过故障的服务器,调整了客户端的keepalive_timeout,并关闭访问日志。配置变成这样:
server_namefast.gosquared.com;
proxy_next_upstreamerrortimeouthttp_500http_502http_503http_504;
proxy_set_headerconnection"";
proxy_passhttp://backend_nodejs;
}
采用新的配置后,我发现服务器们占用的socket降低了90%。现在可以用少得多的连接来传输请求了。新的输出如下:
tcp:4675(estab485,closed4183,orphaned0,synrecv0,timewait4183/0),ports2768
inet5055014
得益于事件驱动式设计可以异步处理i/o,node.js开箱即可处理大量的连接和请求。虽然有其它一些调优手段,但这篇文章将主要关注node.js的进程方面。node是单线程的,不会自动使用多核。也就是说,应用不能自动获得服务器的全部能力。实现node进程的集群化我们可以修改应用,让它fork多个线程,在同一个端口上接收数据,从而实现负载的跨越多核。node有一个cluster模块,提供了实现这个目标所必需的所有工具,但要将它们加入应用中还需要很多体力活。如果你用的是express,ebay有一个叫cluster2的模块可以用。防止上下文切换当运行多个进程时,应该确保每个cpu核同一时间只忙于一个进程。一般来说,如果cpu有n个核,我们应该生成n-1个应用进程。这样可以确保每个进程都能得到合理的时间片,而剩下的一个核留给内核调度程序运行其它任务。我们还要确保服务器上基本不执行除node.js外的其它任务,防止出现cpu的争用。我们曾经犯过一个错误,在服务器上部署了两个node.js应用,然后每个应用都开了n-1个进程。结果,它们互相之间抢夺cpu,导致系统的负荷急升。虽然我们的服务器都是8核的机器,但仍然可以明显地感觉到由上下文切换引起的性能开销。上下文切换是指cpu为了执行其它任务而挂起当前任务的现象。在切换时,内核必须挂起当前进程的所有状态,然后装载和执行另一个进程。为了解决这个问题,我们减少了每个应用开启的进程数,让它们公平地分享cpu,结果系统负荷就降了下来:请注意上图,看系统负荷(蓝线)是如何降到cpu核数(红线)以下的。在其它服务器上,我们也看到了同样的情况。既然总的工作量保持不变,那么上图中的性能改善只能归功于上下文切换的减少。
以上就是如何优化Nginx和Node.js的详细内容,更多请关注主机测评网其它相关文章!
本文来源:国外服务器--如何优化Nginx和Nodejs(nginx调优和优化)
本文地址:https://www.idcbaba.com/guowai/2917.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 1919100645@qq.com 举报,一经查实,本站将立刻删除。



