热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Nginx与Apache请求切换对比

http请求在服务器处理中一般分为3段,第一段header,第二段body,第三段响应。服务器先处理header,查看有没有

http 请求在服务器处理中一般分为3段, 第一段header,第二段body,第三段响应。服务器先处理header,查看有没有content-length指明有没有body, 如果有body,继续下一个读事件,处理body,处理完body就会发送一个http响应。 如图中process中的三段处理.

                                                             apache任务切换

apache 是采用阻塞机制, 且一个进程只处理一个请求,如图如果process1 处理 header请求网络事件不满足,则切换到process2 去执行绿色请求,如果绿色请求依然不满足,就会切换到process3 去执行橙色请求. 每个进程之间切换需要消耗5ms时间,当请求并发增加时,消耗时间成指数性增加,进程之间切换的消耗就不可忽视,容易导致阻塞。                
                                                                      nginx任务切换

nginx 在时间片时间内(在5ms-800ms之间),当请求网络事件不满足时,nginx直接在当前process内切换请求直到分配的时间片消耗完毕。 所以一般我们会在nginx配置时把worker的优先级调到最高-19(优先级数字在-20~20之间,-20为最高)从而使worker 分配的时间片尽可能多,从而尽可能少的切换process,让cpu少做无用功。

 


worker_priority number 设置Worker进程的静态优先级



Syntax: worker_priority number;
Default: worker_priority 0;
Context: main#如果不设置优先级
[root@www nginx-1.16.1]# ps -le | awk 'NR==1 || $14=="nginx"'
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 18203 1 0 80 0 - 5174 sigsus ? 00:00:00 nginx
5 S 998 20923 18203 4 80 0 - 11958 ep_pol ? 00:00:00 nginx
5 S 998 20924 18203 5 80 0 - 11958 ep_pol ? 00:00:00 nginx
5 S 998 20925 18203 5 80 0 - 11958 ep_pol ? 00:00:00 nginx
5 S 998 20926 18203 3 80 0 - 11958 ep_pol ? 00:00:00 nginx#设置优先级之后
[root@www nginx-1.16.1]# ps -le | awk 'NR==1 || $14=="nginx"'
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 18203 1 0 80 0 - 5174 sigsus ? 00:00:00 nginx
5 S 998 20478 18203 0 61 -19 - 11958 ep_pol ? 00:00:00 nginx
5 S 998 20479 18203 0 61 -19 - 11958 ep_pol ? 00:00:00 nginx
5 S 998 20480 18203 0 61 -19 - 11958 ep_pol ? 00:00:00 nginx
5 S 998 20481 18203 0 61 -19 - 11958 ep_pol ? 00:00:00 nginx

在Linux和Unix中,当许多进程都处于可执行状态时,按照优先级来决定本次内核选择哪一个进程执行。进程分配的CPU时间片大小也与优先级有关,优先级越高,时间片越长。

指明worker进程的nice值 -20-19,在Nginx的worker配置上面会将worker优先级配置到最高级别,比如-19。这样静态优先级高那么操作系统往往给其分配的时间片比较大,这样Nginx才能比较好的在用户态完成请求的切换使用CPU少做无用功,减少请求切换能够使得Nginx性能更高。


推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • IT方面的论坛太多了,有综合,有专业,有行业,在各个论坛里混了几年,体会颇深,以前是论坛哪里人多 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
author-avatar
mobiledu2502924873
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有