iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何为高负载网络优化Nginx和Node.js
  • 707
分享到

如何为高负载网络优化Nginx和Node.js

2023-06-17 08:06:05 707人浏览 泡泡鱼
摘要

这篇文章主要介绍了如何为高负载网络优化Nginx和node.js的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何为高负载网络优化Nginx和node.js文章都会有所收获,下面我们一起来看看吧。网络调优如果不

这篇文章主要介绍了如何为高负载网络优化Nginxnode.js的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何为高负载网络优化Nginx和node.js文章都会有所收获,下面我们一起来看看吧。

网络调优
如果不先对nginx和node.js的底层传输机制有所了解,并进行针对性优化,可能对两者再细致的调优也会徒劳无功。一般情况下,nginx通过tcp Socket来连接客户端与上游应用。
我们的系统对tcp有许多门限值与限制,通过内核参数来设定。这些参数的默认值往往是为一般的用途而定的,并不能满足WEB服务器所需的高流量、短生命的要求。
这里列出了调优tcp可供候选的一些参数。为使它们生效,可以将它们放在/etc/sysctl.conf文件里,或者放入一个新配置文件,比如 /etc/sysctl.d/99-tuning.conf,然后运行sysctl -p,让内核装载它们。我们是用sysctl-cookbook来干这个体力活。
需要注意的是,这里列出来的值是可以安全使用的,但还是建议大家研究一下每个参数的含义,以便根据自己的负荷、硬件和使用情况选择一个更加合适的值。

复制代码 代码如下:

<span style="font-size: 14px; color: #009900; font-family: microsoft yahei"> net.ipv4.ip_local_port_range='1024 65000'
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='4096 87380 16777216'
net.ipv4.tcp_syn_retries='2'
net.ipv4.tcp_synack_retries='2'
net.ipv4.tcp_wmem='4096 65536 16777216'
vm.min_free_kbytes='65536' </span>

重点说明其中几个重要的。
net.ipv4.ip_local_port_range
为了替上游的应用服务下游的客户端,nginx必须打开两条tcp连接,一条连接客户端,一条连接应用。在服务器收到很多连接时,系统的可用端口将很快被耗尽。通过修改net.ipv4.ip_local_port_range参数,可以将可用端口的范围改大。如果在/var/log/syslog 中发现有这样的错误: “possible syn flooding on port 80. sending cookies”,即表明系统找不到可用端口。增大net.ipv4.ip_local_port_range参数可以减少这个错误。
net.ipv4.tcp_tw_reuse
当服务器需要在大量tcp连接之间切换时,会产生大量处于time_wait状态的连接。time_wait意味着连接本身是关闭的,但资源还没有释放。将net_ipv4_tcp_tw_reuse设置为1是让内核在安全时尽量回收连接,这比重新建立新连接要便宜得多。
net.ipv4.tcp_fin_timeout
这是处于time_wait状态的连接在回收前必须等待的最小时间。改小它可以加快回收。
如何检查连接状态
使用netstat:
netstat -tan | awk '{print $6}' | sort | uniq -c
或使用ss:
ss -s
nginx
ss -s
total: 388 (kernel 541)
tcp: 47461 (estab 311, closed 47135, orphaned 4, synrecv 0, timewait 47135/0), ports 33938
transport total ip ipv6
* 541 - -
raw 0 0 0
udp 13 10 3
tcp 326 325 1
inet 339 335 4
frag 0 0 0
随着web服务器的负载逐渐升高,我们就会开始遭遇nginx的某些奇怪限制。连接被丢弃,内核不停报syn flood。而这时,平均负荷和cpu使用率都很小,服务器明明是可以处理更多连接的状态,真令人沮丧。
经过调查,发现有非常多处于time_wait状态的连接。这是其中一个服务器的输出:
有47135个time_wait连接!而且,从ss可以看出,它们都是已经关闭的连接。这说明,服务器已经消耗了绝大部分可用端口,同时也暗示我们,服务器是为每个连接都分配了新端口。调优网络对这个问题有一点帮助,但是端口仍然不够用。
经过继续研究,我找到了一个关于上行连接keepalive指令的文档,它写道:
设置通往上游服务器的最大空闲保活连接数,这些连接会被保留在工作进程的缓存中。
有趣。理论上,这个设置是通过在缓存的连接上传递请求来尽可能减少连接的浪费。文档中还提到,我们应该把proxy_Http_version设为"1.1",并清除"connection"头部。经过进一步的研究,我发现这是一种很好的想法,因为http/1.1相比http1.0,大大优化了 tcp连接的使用率,而nginx默认用的是http/1.0。
按文档的建议修改后,我们的上行配置文件变成这样:

复制代码 代码如下:

upstream backend_nodejs {
server nodejs-3:5016 max_fails=0 fail_timeout=10s;
server nodejs-4:5016 max_fails=0 fail_timeout=10s;
server nodejs-5:5016 max_fails=0 fail_timeout=10s;
server nodejs-6:5016 max_fails=0 fail_timeout=10s;
keepalive 512;
}

我还按它的建议修改了server一节的proxy设置。同时,加了一个 p roxy_next_upstream来跳过故障的服务器,调整了客户端的 keepalive_timeout,并关闭访问日志。配置变成这样:

复制代码 代码如下:

server {
listen 80;
server_name fast.Gosquared.com;
client_max_body_size 16m;
keepalive_timeout 10;
location / {
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_set_header connection "";
proxy_http_version 1.1;
proxy_pass http://backend_nodejs;
}
access_log off;
error_log /dev/null crit;
}

采用新的配置后,我发现服务器们占用的socket 降低了90%。现在可以用少得多的连接来传输请求了。新的输出如下:
ss -s
total: 558 (kernel 604)
tcp: 4675 (estab 485, closed 4183, orphaned 0, synrecv 0, timewait 4183/0), ports 2768
transport total ip ipv6
* 604 - -
raw 0 0 0
udp 13 10 3
tcp 492 491 1
inet 505 501 4
node.js
得益于事件驱动式设计可以异步处理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,结果系统负荷就降了下来:

如何为高负载网络优化Nginx和Node.js
请注意上图,看系统负荷(蓝线)是如何降到cpu核数(红线)以下的。在其它服务器上,我们也看到了同样的情况。既然总的工作量保持不变,那么上图中的性能改善只能归功于上下文切换的减少。

排列不分先后:

当性能遇到问题时,如果能在应用层进行计算和处理,那就把它从数据库层拿出来。排序和分组就是典型的例子。在应用层做性能提升总是要比在数据库层容易的多。就像对于MySQLsqlite更容易掌控。

关于并行计算,如果能避免就尽量避免。如果无法避免,记住,能力越大,责任越大。如果有可能,尽量避免直接对线程操作。尽可能在更高的抽象层上操作。例如,在iOS中,GCD,分发和队列操作是你的好朋友。人类的大脑没有被设计成用来分析那些无穷临时状态&mdash;&mdash;这是我的惨痛教训所得。

尽可能简化状态,尽可能局部本地化。适用至上。

短小可组合的方法是你的好朋友。

代码注释是危险的,因为它们很容易更新不及时或给人误导,但这不能成为不写注释的理由。不要注释鸡毛蒜皮的事情,但如果需要,在某些特殊地方,战略性的长篇注释是需要的。你的记忆会背叛你,也许会在明天早上,也许会在一杯咖啡后。

如果你认为一个用例场景也许“不会有问题吧”,它也许就是一个月后让你在发布的产品中遭受惨痛失败的地方。做一个怀疑主义者,测试,验证。

有疑问时,和团队中所有相关人交流。

做正确的事情&mdash;&mdash;你通常会知道这指的是什么。

你的用户并不傻,他们只是没有耐心理解你的捷径。

如果一个开发人员没有被安排长期的维护你们开发的系统,对他保持警惕。80%的血、汗、泪水都是在软件发布后的时间里流的&mdash;&mdash;那时你会变成一个厌世者,但也是更聪明的“行家”。

任务清单是你的好朋友。

主动让你的工作更有乐趣,有时这需要你付出努力。

悄无声息的崩溃,我仍然会为此从噩梦中惊醒。监控,日志,警报。清楚各种的假警报和不可避免的感觉钝化。保持你的系统对故障的敏感和及时警报。

关于“如何为高负载网络优化Nginx和Node.js”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“如何为高负载网络优化Nginx和Node.js”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 如何为高负载网络优化Nginx和Node.js

本文链接: https://www.lsjlt.com/news/288024.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何为高负载网络优化Nginx和Node.js
    这篇文章主要介绍了如何为高负载网络优化Nginx和Node.js的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何为高负载网络优化Nginx和Node.js文章都会有所收获,下面我们一起来看看吧。网络调优如果不...
    99+
    2023-06-17
  • 优化Nginx负载均衡的网络性能
    引言:Nginx已经成为一个非常流行的开源反向代理服务器,它在处理高并发请求时具有非常出色的性能表现。为了进一步优化Nginx负载均衡的网络性能,本文将介绍一些具体的代码示例和配置技巧。一、配置keepalive在Nginx配置文件中加入以...
    99+
    2023-10-21
    nginx 负载均衡 优化网络性能
  • 如何优化Nginx和Node.js
    本篇内容介绍了“如何优化Nginx和Node.js”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!网络调优如果不先对nginx和node.js...
    99+
    2023-07-04
  • PHP如何优化HTTP负载?
    PHP作为一种高性能的编程语言,可以用于开发各种网站和应用程序。然而,在处理高负载HTTP请求时,PHP的性能可能会变得缓慢。这篇文章将探讨一些优化HTTP负载的方法,以提高PHP的性能。 一、使用缓存 使用缓存是优化PHP性能的最常见方法...
    99+
    2023-09-30
    http load shell
  • 如何优化Nginx负载均衡的性能与稳定性
    摘要:Nginx作为一款开源的高性能Web服务器和反向代理服务器,其负载均衡功能可以有效地分发请求以提高系统的性能和可靠性。本文将介绍如何优化Nginx负载均衡的性能和稳定性,并提供具体的代码示例。使用upstream模块配置后端服务器Ng...
    99+
    2023-10-21
    Nginx:指代Nginx服务器软件 以提高性能和稳定性。
  • PHP和HTTP负载:如何提高网站性能?
    在当今互联网时代,快速响应的网站性能对于用户体验和搜索引擎排名至关重要。PHP和HTTP负载是影响网站性能的两个重要因素。本文将介绍如何使用一些技术来提高PHP和HTTP负载,从而提高网站性能。 一、优化PHP代码 PHP是一种脚本语言,...
    99+
    2023-09-30
    http load shell
  • PHP中的HTTP负载和shell编程:如何优化网站性能?
    PHP是一种流行的服务器端编程语言,广泛应用于Web开发领域。在Web开发中,HTTP负载和shell编程是两个重要的方面,对于优化网站性能来说至关重要。 HTTP负载是指Web服务器处理客户端请求的能力,包括处理并发连接、保证响应速度等。...
    99+
    2023-09-30
    http load shell
  • ASP 函数和 NumPy:如何在高负载环境下优化并发性能?
    在现代网站开发中,高并发性能是至关重要的。ASP 函数和 NumPy 是两个可以帮助你优化高负载环境下并发性能的工具。本文将介绍这两个工具以及如何使用它们来提高并发性能。 ASP 函数 ASP(Active Server Pages)是一...
    99+
    2023-11-10
    函数 并发 numy
  • Go 日志:如何优化 Django 的负载?
    随着互联网的迅速发展,越来越多的网站和应用程序需要处理大量的数据和请求。这导致服务器的负载和响应时间成为了一个重要的问题。为了优化服务器的负载和响应时间,我们需要对服务器进行优化和调整。 在本文中,我们将介绍如何使用 Go 日志来优化 D...
    99+
    2023-11-12
    日志 load django
  • 如何在Unix Shell中优化Java负载?
    Unix Shell是一种强大的命令行工具,而Java是一种广泛使用的编程语言,很多应用程序都是基于Java构建的。在Unix Shell中优化Java负载可以帮助提高应用程序的性能和效率。本文将介绍如何在Unix Shell中优化Java...
    99+
    2023-08-02
    unix load shell
  • Shell脚本:如何优化系统负载?
    系统负载是计算机硬件的重要指标之一,它反映了系统处理任务的压力程度。当负载高时,系统的响应速度会变慢,甚至出现卡顿现象。在日常使用计算机时,我们经常会遇到负载高的情况,这时候如何优化系统负载成为了一个不可回避的问题。 本文将介绍几种常见的...
    99+
    2023-06-13
    load 面试 shell
  • 如何在Java中使用Apache和NumPy来优化负载?
    在Java中,使用Apache和NumPy来优化负载是一个非常重要的任务。这篇文章将介绍如何使用这些工具来优化负载,以便您可以更快地处理数据和执行任务。 Apache和NumPy是两个非常流行的工具,它们都可以帮助您在Java中优化负载。A...
    99+
    2023-11-14
    apache numy load
  • 面对高并发场景,如何在 Go 语言中优化负载?
    Go 语言是一个高效、轻量级的语言,具有并发处理的能力,因此在处理高并发的场景下,Go 语言可以发挥其最大的优势。但是,在高并发场景下,一些常见的问题也会随之而来,比如负载过大、内存泄漏、死锁等等。因此,本文将从优化负载的角度,介绍一些在...
    99+
    2023-10-20
    load 并发 面试
  • Windows Server 2003网络负载均衡如何实现
    一、网络负载平衡的优点   1.网络负载平衡允许你将传入的请求传播到最多达32台的服务器上,即可以使用最多32台服务器共同分担对外的网络请求服务。网络负载平衡技术保证即使是在负载很重的情况下它们也能作出快速响应。   2...
    99+
    2023-05-23
    Windows Server 2003 网络
  • 如何优化 PHP 在 Windows 上的负载能力?
    当今互联网时代,PHP作为一种常用的Web编程语言,其在Windows系统上的应用也越来越广泛。但是,由于Windows系统的不同于Linux的特殊性,PHP在Windows上的负载能力并不是很理想。在如何优化PHP在Windows上的负载...
    99+
    2023-10-08
    bash load windows
  • 如何在Linux系统中使用PHP和Bash来优化负载?
    在Linux系统中,优化负载是一个非常重要的任务。PHP和Bash是两种强大的工具,可以帮助您优化负载,提高系统的性能和稳定性。本文将介绍如何使用PHP和Bash来优化负载。 一、什么是负载? 在计算机系统中,负载是指正在运行的任务的数量。...
    99+
    2023-06-26
    bash load linux
  • SUSE系统中如何监控和优化系统负载均衡
    在SUSE系统中,可以使用以下工具来监控和优化系统负载均衡: SAR(System Activity Reporter):SAR...
    99+
    2024-04-09
    SUSE
  • win10优化网络如何设置
    本篇内容介绍了“win10优化网络如何设置”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!win10优化网络设置方法:按下“Win+R”打开运...
    99+
    2023-07-01
  • 如何进行Nginx高性能优化配置
    本篇文章为大家展示了如何进行Nginx高性能优化配置,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Nginx是Apache服务不错的替代品。其特点是占有内存少,并发能力强,事实上nginx的并发能力...
    99+
    2023-06-15
  • win7网络设置如何优化
    这篇文章主要介绍“win7网络设置如何优化”,在日常操作中,相信很多人在win7网络设置如何优化问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”win7网络设置如何优化”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-07-01
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作