Nginx: 性能优化之提升CPU效率以及TCP的三次握手和四次挥手

news2024/12/23 23:12:44

提升利用CPU的效率


1 )CPU的调度机制

  • 现在来看下 linux中 CPU的一个调度机制

  • 假设现在系统上有只有一颗CPU,而linux系统是一个多任务的一个操作系统

  • 它允许我们各个不同的用户允许在同一个操作系统上执行很多个进程

  • 单核CPU肯定不可能同时去执行这样一些程序

  • CPU在同一时刻只能够调度一个进程来执行,没办法并发执行多个程序

  • 从宏观上来看,多任务系统,都是能够一起执行的

  • 比如说在windows中,打开一个聊天软件,边聊天,边看电影,都可以一起来做

  • 们从这种宏观上来说,多个进程,它是一个并行执行的,但从CPU的角度,同一时刻只能干一件事

  • 比如应用程序进程:一个CPU在处理 Kafka, MQ, Nginx, ElasticSearch 进程

  • 对CPU调度的时候,它在某一个时刻,它只能有一个会被调度到CPU上

  • 比如,Kafka 进程被调度到CPU上执行,执行完了以后,会拿下来,到底它去执行多久

  • 其实这里有一个叫时间片的概念,也就是说每一个进程都会被首先分配一个时间片

  • 那这个时间片它就是我们在CPU上去执行的时候的一个时间长度

  • 这个时间片它可能是不一样的,是由我们CPU调度算法来决定的

  • 在不同的操作系统中,可能CPU调度算法是不一致的

  • 有一个大的原则,比如,某一个进程的优先级是最高的

  • 如果说,这个进程的优先级是比较高的话,它相应的得到的CPU的执行的时间片就会多一些

  • 还有一个前提,就是说这个进程在执行的过程中不会陷入阻塞状态

  • 也就是说它自身程序在执行的过程中,如果遇到阻塞比如读取磁盘(读取效率远远小于cpu执行效率)

  • 如果陷入这样一个阻塞状态的话,CPU会把当前进程从时间片上拿下来,

  • 即使当前程序被分配了 100ms, 只执行了20ms, 也会被扯下来,CPU会执行下一个进程

  • 整个CPU就是在循环往复的去执行每一个进程,在操作系统中,所有进程都会被分配一些时间片

2 ) 原则 和 优化策略

  • 整个优化进程使用CPU遵循的一些原则,如下
    • 尽可能占有全部的这个CPU资源
    • 尽可能占用更大的CPU时间片、减少进程间切换
  • 有以下几项优化策略
    • 指定 worker 子进程个数
      • 如果不知道个数,则 woker_processes auto; 设定为 auto
    • 将worker子进程与每个CPU进行绑定
      • worker_cpu_affinity 01 10 01 10 通过掩码来绑定
      • 这样可以有效利用cpu缓存
    • 提高worker子进程的进程优先级
      • worker_priority -20; 优先级越高越优先
      • 默认值 120, -20 ~ 19
      • 数字越小,优先级越高
    • 延迟处理新链接
      • listen 80 deferred 延迟Nginx处理并发连接
      • 建立连接完成之后,用户没有发送Http请求,Nginx自身不会被激活唤醒
      • 从而提升Nginx处理能力

TCP的三次握手和四次挥手

  • 不参考网络七层模型,按照我们实际使用的四层模型来说

1 )四层模型封包拆包过程

  • 最高层的一个应用层, 在下面是传输层
  • 之后是网络层,最下面是一个数据链路层和物理层
  • 来看一下整个数据报文通信的过程中,在每一层都做了哪些事情
  • 首先,在应用中,发送的就是 HTTP 的报文,比如说,请求某一个URL的时候
  • 这个时候其实对我的应用层来说,中间的数据都是HTTP的一些具体数据
  • 我不能够把应用层的数据直接发送给接收端的服务器上
  • 必须要把这个数据报文进行层层的封装
  • 比如,HTTP数据报文发送到这个传输层的时候,它需要封装一个TCP的报文
  • 其实到传输层,这个报文其实就变成了TCP报文
  • 传输层继续往下层,经过网络层的时候,它又会封装了一个IP首部的一个报文
  • 包括到最下面的一链链路层的时候,又会去封装一个以太网首部的一个报文
  • 其实我们真正的数据就HTTP这么一小块, 可能是只有几十个字节
  • 为了发送的几十个字节的数据,需要给它封上一层一层的报文
  • 其实这就是性能上的一些开销,但是这也是不可避免的
  • 那其实对某一些应用进行深度优化的时候,在某些程度上甚至可以去修改整个TCP协议
    • 依据RFC的规范,现在整个TCP/IP协议发展已经越来越越好了,这种场景是比较少的
    • 但是在一些极致场景下,比如 Google 他可能认为这个TCP/IP协议不太好
    • 他就会去写一些第三方的协议来优化这样一个协议,当然它不是整个推翻再重写
    • 它只是根据它自己的一些应用对某一个一些细节进行优化
  • 到最底层的链路层的时候,我的报文其实已经被封装了好几层了
  • 在我真正的HTTP数据上封装了一层TCP报文又抹上了一层这个IP报文
  • 最后最外层抹了一个以太网这样一个报文
  • 对这样一个整体报文,就会通过网线,通过数据链路在网络上进行寻址
  • 比如说,要过运营商的路由器,层层过了很多网络设备之后,到达我的服务器
  • 这个时候到达服务器的网卡上之后,网卡自身会逐层的拆包
  • 网卡首先会拆去这个以太网首部,拆完会去看一下这个以太网首部中可能有一些地址
  • 比如说有我原服务器的一个MAC地址(对应物理网卡的一个地址)
  • 假如说, 他发现这个目的网卡的地址就是他自己这台机器上的对应这块网卡的地址
  • 它这个时候就知道这个数据报文原来是发给自己的
  • 这个时候它就会把这个以太网首部报文给拆掉
  • 拆掉之后,会把里面这样一个报文交给上层的一个网络层,就由网络层再去处理
  • 这个时候,网络层会拆去这个IP首部报文
  • 它会在IP首部报文中对比,着重核实一下这个目的IP是不是自己这台服务器的一个IP地址
  • 如果不是本机配置的IP地址,它会直接扔掉这个包了,如果它发现这个目的IP地址是本机配置的IP地址
  • 这个时候它会继续把这个报文往上一层交,继续交给传输层
  • 当然在网络层会把这个报文拆掉,把里面TCP报文包裹的这个数据给整体发到传输层
  • 传输层其实会看一下TCP首部,里面都知道对应的是端口,着重看下目的端口是多少
  • 比如说,这儿有一台web服务器,上面部署了HTTPS的这样一个web服务
  • 这个时候,会发现目的端口是 443, 他就知道需要发到上层的应用层里进行处理
  • 这个时候传输层的任务就做完了,继续把这个包中的就整个HTTP的数据发给
  • 应用层的HTTPS服务进程去处理,它发现请求了某个URL
  • 这时候,进程会去构建 HTTP 响应包,比如把整个网页编码之后封装成HTTP报文
  • 这时候,要准备响应给我们的发送端了,之后,它同样会逐层封装报文,怎么拆的,怎么封回去
    • 最后通过网络发送给客户端,客户端拿到之后也是自下而上,逐层拆包
  • 最后拆到我们这个响应的HTTP报文, 最后在浏览器中在展示
  • 其实,在整个TCP连接连接建立和数据传输的过程中,其实我们知道最多的只有TCP的三次握手和四次挥手
  • 因为我们能对这个网络层,包括这个链路层能优化的事情是其实是比较少的
  • 因为这个跟我们这个硬件设备是极其相关的,尤其是我们这个数据链路层
  • 其实,比如说对内核层的一个TCP连接的建立和断开这样一个过程,我们可以做一些优化

2 ) TCP三次握手和四次挥手的过程

2.1 三次握手

  • 三次握手,其实通常是由客户端发起的
  • 比如说, 现在有一个客户端浏览器,输入了某一个URL,回车之后
  • 那其实这个时候我们的浏览器会向服务器端发送一个TCP连接建立的请求
  • 我们的客户端会首先发送一个 SYN 这样一个标志位
  • 它发送SYN这样一个包的时候,服务器端接收到这个包之后,就知道客户端要建立一个新的TCP连接
  • 假定,客户端发送的 SYN的包的序号是 x
  • 服务器在收到以后,服务器首先需要对收到客户端的 x序号 的包进行一个响应
  • 它会有一个ACK的这样一个标志位,ACK的序号是 x + 1, 将这个包发送给客户端
  • 客户端接收到以后,查看发现 ACK的序号是 x + 1,它就知道上次发送的 x 包已经被服务器接收了
  • TCP是需要确认的,是一个面向可靠连接的协议
    那这个时候我们其实在生测过程的过程中,
  • 服务端在第一次响应的时候 除了会发送 ACK=x+1,它也会发送一个SYS包, 序号是 y
  • 客户端在收到这个包后,也需要对序号为y包进行确认,发出 ACK=y+1 进行确认
  • 服务端收到后,至此,TCP的整个连接就建立了,这时,客户端和服务器之间就可以发送数据
  • 比如说,客户端请求某一个URL,服务端构建响应请求把数据返回给客户端
  • 客户端进行页面展示,中间再不停的发数据,接数据,发数据,接数据 …
  • 在整个过程中,假如说, 客户端想要断开连接,或者服务器处理性能已经达到了
  • 不能够再满足客户端的新请求了, 这个时候都要去断开已有的连接

2.2 四次挥手

  • 在四次挥手过程中,客户端和服务器端两个都可以主动的去断开连接
  • 三次握手,通常是由客户端发起的,四次挥手(断开连接)的过程,两端都可以发起
  • 假定客户端断开这样一个连接,我们的客户端中间发送了很多数据,当不需要再请求数据就要断开了
  • 客户端会发送一个 FIN 标志位的包给服务器,同时也会有一个ACK的包,建立时客户端接收到的是y
  • 客户端发送了一个FIN标志位的包,也就意味着我的客户端要断开连接
  • 注意,客户端在建立连接时,最后收到服务端响应的的 是 x + 1 和 y,
  • 所以,客户端在封包的时候会自动加上1,即:FIN seq=x+2 ACK=y+1
  • 之后,服务器端在收到这样一个断开链接的请求之后,他会首先发送一个ACK,即:x+2+1=x+3
  • 这个意思是,服务端已经了解客户端要断开连接的需求了
  • 客户端再次接收到以后,其连接请求可能并不能立刻断开
  • TCP是一个全双工的这么一个协议,客户端和服务器利用这样的通信通道的过程中
  • 客户端可以给我的服务器端发送数据,同时服务器端也可以给客户端返送数据
  • 也就是说,他们两个可以同时发送的数据,对于此场景,客户端发起了断开请求
  • 客户端肯定没有数据发送给我的服务端,但是服务端可能还在发送数据,客户端还没有接受完的状态
  • 为了应对TCP连接过程这个全双工的场景, 必须要两次断开
    • 服务端确认可以断开
    • 服务端还在发送数据,客户端不会立即断开,等待服务器发送完成
    • 服务端会发送 FIN seq = y + 1 的包给客户端
    • 客户端进行确认 ACK = y+2
    • 至此,TCP才可以彻底断开
  • 这里还有一个问题,服务器端发送给客户端 FIN seq=y+1 之后,客户端进入TIME_WAIT的状态
  • 在这个 TIME_WAIT 的状态中,后面需要去等待两个MSL的时间
  • MSL是在RFC中规定的一个时间, 全称是 Max Segment Lifetime
  • 可以理解为断开前的最大生存时间
  • 其实也就是意味着,如果一个MSL 在整个网络中传输中
  • 如果超过了两个MSL的时间,这个报文会失效的
  • 这种场景是,TCP协议在设计之处考虑到整个网络传输是不可靠的
  • 因为网络传输可能需要经过很多的中间节点,因为中间的可能有路由器有交换机等等
  • 中间任何一个节点出现故障不可靠的话,那TCP的报文都是需要在超时重传的
  • 因此, 为了保证客户端回送的这个ACK的报文能够正确的到达服务器端
  • 必须等待两个MSL这样一段时间,即使没有传输到服务器端,连接也已经断开了
  • 如果超过了两个MSL时间又发送给了服务端,那时,因为失效会被丢弃

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2095081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5.图论.题目2

5.图论.题目2 题目8.字符串接龙9.有向图的完全可达性10.岛屿的周长11.寻找存在的路径12.冗余连接113.冗余连接214.寻宝 题目 8.字符串接龙 题目链接 本题的直观思路如下图所示;但该题有两个问题:1.图中的线是如何连接起来的 2.如何确定起点到终点的最…

《JavaEE进阶》----4.<SpringMVC①简介、基本操作(各种postman请求)>

本篇博客讲解 MVC思想、及Spring MVC(是对MVC思想的一种实现)。 Spring MVC的基本操作、学习了六个注解 RestController注解 RequestMappering注解 RequestParam注解 RequestBody注解 PathVariable注解 RequestPart注解 MVC View(视图) 指在应⽤程序中…

数据同步的艺术:探索PostgreSQL和Redis的一致性策略

作者:后端小肥肠 🍇 我写过的文章中的相关代码放到了gitee,地址:xfc-fdw-cloud: 公共解决方案 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 1. 前言 在当今高度数字化的世界中,应用程…

ACL学习笔记

1.ACL快速配置 需求:拒绝PC 1访问PC 3 (1)配置PC PC 1: PC 2: PC 3: (2)配置R1的接口IP信息 sys sysname R1 undo info-center enable interface GigabitEthernet0/0/0 ip address 192.168.1.1 255.255.255.0 qui…

超声波智能水表多少钱一个?

超声波智能水表的价格因品牌、功能、规格等因素而异,就拿深圳合众致达科技有限公司智能水电表厂家的超声波智能水表DN15口径产品举例,价格为399元起。具体价格需根据实际需求来确定。 一、影响价格的主要因素 -技术含量:具备远程数据传输、…

DSOJ-id12

1.保留几位小数 #include <iostream>#include <iomanip> //必须包含这个头文件using namespace std;void main( ){ double a 3.141596;cout<<fixed<<setprecision(3)<<a<<endl; //输出小数点后3位 2. 使用了未初始化的局部变量 Point* …

如何使用小乌龟清除认证缓存、还原版本、定位及常用开发工具集成

&#x1f600;前言 本篇博文是关于如何使用小乌龟清除认证缓存、还原版本、定位及常用开发工具集成&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大…

openGuass之CTE Reuse

一. 前言 ​ CTE 是指with的公共表达式&#xff0c;如下所示是个CTE样例&#xff1a; ​ CTE表达式往往在同一条sql中多次被重复引用&#xff0c;如上图所示的cte被引用了两次&#xff08;c1 和 c2&#xff09;&#xff0c;我们称为2个CTE实例。 ​ 本文只要…

Windows系统Nginx下载安装配置 运行错误处理

Nginx是一款轻量级的web 服务器/反向代理 服务器。本篇文章主要是nginx的下载安装&#xff0c;处理运行中遇到的问题&#xff0c;配置反向代理。主要分为两部分&#xff1a;下载安装和配置。 目录 1.下载安装 2.nginx配置反向代理 1.下载安装 nginx官网&#xff1a;nginx: …

新160个crackme -044-tsrh-crackme

运行分析 提示去除NAG 不去除NAG也能进入主窗口&#xff0c;需要破解Name和Serial PE分析 ASM程序&#xff0c;32位&#xff0c;壳未知 去除NAG ida搜索字符串&#xff0c;发现NAG弹窗标题字符串&#xff0c;双击进入函数 找到了messagebox&#xff0c;即NAG位置00401079 打开x…

网络压缩之动态计算(dynamic computation)

动态计算希望网络可以自由 地调整它需要的计算量。为什么期待网络可以自由地调整它需要的计算量呢? 因为有时候我 们可能同样的模型会想要跑在不同的设备上面&#xff0c;而不同的设备上面的计算资源是不太一样的。所以期待训练好一个网络以后&#xff0c;放到新的设备上面&am…

Python编程基础知识,让编程基础更加扎实(输出个人简介)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

考研--数学(相关公式)

解析几何 知识点1 A(x1,y1) B(x2,y2) 则AB长度 |AB| A、B中点的坐标 &#xff08;&#xff0c;) 知识点2 方程求解 ①点斜式&#xff1a; y-y0k(x0-x) ②斜率式&#xff1a; ykxb ③两点式&#xff1a; …

【笔记篇】Davinci Configurator CanNm模块

目录 1 简介1.1 架构概览2 功能描述2.1 特性2.2 初始化2.3 状态机2.3.1 网络模式2.3.1.1 重复报文状态2.3.1.2 正常状态2.3.1.3 准备休眠状态2.3.2 预休眠模式2.3.3 总线休眠模式2.4 被动模式(对于被动节点)2.5 NM报文格式2.6 NM报文发送2.6.1 重试第一次报文请求2.7 降低总线…

集成电路学习:什么是I2C内部集成电路总线

I2C&#xff1a;内部集成电路总线 I2C&#xff0c;全称Inter-Integrated Circuit&#xff0c;即内部集成电路总线&#xff0c;是由飞利浦公司&#xff08;现为恩智浦半导体&#xff09;在上世纪八十年代初开发的一种同步的串行通信总线。它以其接线简单、硬件实现容易、可扩展性…

Mysql8利用binlog实现数据恢复

文章目录 1binlog基本概念2 binlog相关常用命令3 binlog工具mysqlbinlog4 测试数据准备&导入数据5 模拟误删表6 数据恢复方式说明7 数据恢复分析(偏移量方式恢复)8 数据恢复9 验证10 数据恢复的局限性11 总结 1binlog基本概念 binlog即binary log&#xff0c;二进制日志文件…

【React原理 - 任务调度之中断恢复】

概览 本文紧接上文介绍React调度的时间分片中任务中断和恢复&#xff0c;由于篇幅过长&#xff0c;所以拆成了两篇。上文主要介绍了调度器中的优先级和调度任务的触发、注册和调度循环。本文主要从任务调度入手介绍调度任务之后发送了什么&#xff0c;即在协调器中如何进行到f…

【matlab】数组操作:寻找最大值和最小值及其位置ind2sub函数

【matlab】数组操作&#xff1a;寻找最大值和最小值及其位置ind2sub函数 本文将介绍如何在MATLAB环境中使用内置函数来创建数组&#xff0c;以及如何找到数组中的最大值和最小值及其对应的位置。通过示例代码&#xff0c;我们将一步步展示这一过程&#xff0c;帮助读者更好地理…

探索Python的测试之道:unittest库的奥秘

文章目录 探索Python的测试之道&#xff1a;unittest库的奥秘背景&#xff1a;为何选择unittest&#xff1f;什么是unittest库&#xff1f;如何安装unittest库&#xff1f;简单库函数使用方法场景应用场景一&#xff1a;测试数学运算场景二&#xff1a;测试异常处理场景三&…