wap网站不流行,qt做网站界面,营销型企业网站建设的步骤,wordpress网站百度不收录作者 | 潇洒一剑来源 | cnblogs.com/zengjin93/p/5569556.html什么是服务器并发处理能力一台服务器在单位时间里能处理的请求越多#xff0c;服务器的能力越高#xff0c;也就是服务器并发处理能力越强有什么方法衡量服务器并发处理能力1. 吞吐率吞吐率#xff0c;单位时间里… 作者 | 潇洒一剑来源 | cnblogs.com/zengjin93/p/5569556.html什么是服务器并发处理能力一台服务器在单位时间里能处理的请求越多服务器的能力越高也就是服务器并发处理能力越强有什么方法衡量服务器并发处理能力1. 吞吐率吞吐率单位时间里服务器处理的最大请求数单位req/s从服务器角度实际并发用户数的可以理解为服务器当前维护的代表不同用户的文件描述符总数也就是并发连接数。服务器一般会限制同时服务的最多用户数比如apache的MaxClents参数。这里再深入一下对于服务器来说服务器希望支持高吞吐率对于用户来说用户只希望等待最少的时间显然双方不能满足所以双方利益的平衡点就是我们希望的最大并发用户数。2. 压力测试有一个原理一定要先搞清楚假如100个用户同时向服务器分别进行10个请求与1个用户向服务器连续进行1000次请求对服务器的压力是一样吗实际上是不一样的因对每一个用户连续发送请求实际上是指发送一个请求并接收到响应数据后再发送下一个请求。这样对于1个用户向服务器连续进行1000次请求, 任何时刻服务器的网卡接收缓冲区中只有1个请求而对于100个用户同时向服务器分别进行10个请求服务器的网卡接收缓冲区最多有100个等待处理的请求显然这时的服务器压力更大。压力测试前提考虑的条件并发用户数: 指在某一时刻同时向服务器发送请求的用户总数(HttpWatch)总请求数请求资源描述请求等待时间(用户等待时间)用户平均请求的等待时间服务器平均请求处理的时间硬件环境压力测试中关心的时间又细分以下2种:用户平均请求等待时间这里暂不把数据在网络的传输时间还有用户PC本地的计算时间计算入内服务器平均请求处理时间用户平均请求等待时间主要用于衡量服务器在一定并发用户数下单个用户的服务质量而服务器平均请求处理时间就是吞吐率的倒数。一般来说用户平均请求等待时间 服务器平均请求处理时间 * 并发用户数怎么提高服务器的并发处理能力1. 提高CPU并发计算能力服务器之所以可以同时处理多个请求在于操作系统通过多执行流体系设计使得多个任务可以轮流使用系统资源。这些资源包括CPU内存以及I/O. 这里的I/O主要指磁盘I/O, 和网络I/O。多进程 多线程多执行流的一般实现便是进程多进程的好处可以对CPU时间的轮流使用对CPU计算和IO操作重叠利用。这里的IO主要是指磁盘IO和网络IO相对CPU而言它们慢的可怜。而实际上大多数进程的时间主要消耗在I/O操作上。现代计算机的DMA技术可以让CPU不参与I/O操作的全过程比如进程通过系统调用使得CPU向网卡或者磁盘等I/O设备发出指令然后进程被挂起释放出CPU资源等待I/O设备完成工作后通过中断来通知进程重新就绪。对于单任务而言CPU大部分时间空闲这时候多进程的作用尤为重要。多进程不仅能够提高CPU的并发度。其优越性还体现在独立的内存地址空间和生命周期所带来的稳定性和健壮性其中一个进程崩溃不会影响到另一个进程。但是进程也有如下缺点fork()系统调用开销很大: prefork进程间调度和上下文切换成本: 减少进程数量庞大的内存重复共享内存IPC编程相对比较麻烦减少进程切换当硬件上下文频繁装入和移出时所消耗的时间是非常可观的。可用Nmon工具监视服务器每秒的上下文切换次数。为了尽量减少上下文切换次数最简单的做法就是减少进程数尽量使用线程并配合其它I/O模型来设计并发策略。还可以考虑使用进程绑定CPU技术增加CPU缓存的命中率。若进程不断在各CPU上切换这样旧的CPU缓存就会失效。减少使用不必要的锁服务器处理大量并发请求时多个请求处理任务时存在一些资源抢占竞争这时一般采用“锁”机制来控制资源的占用。当一个任务占用资源时我们锁住资源这时其它任务都在等待锁的释放这个现象称为锁竞争。通过锁竞争的本质我们要意识到尽量减少并发请求对于共享资源的竞争。比如在允许情况下关闭服务器访问日志这可以大大减少在锁等待时的延迟时间。要最大程度减少无辜的等待时间。这里说下无锁编程就是由内核完成这个锁机制主要是使用原子操作替代锁来实现对共享资源的访问保护。使用原子操作时在进行实际的写操作时使用了lock指令这样就可以阻止其他任务写这块内存避免出现数据竞争现象。原子操作速度比锁快一般要快一倍以上。例如fwrite(), fopen()其是使用append方式写文件其原理就是使用了无锁编程无锁编程的复杂度高但是效率快而且发生死锁概率低。考虑进程优先级进程调度器会动态调整运行队列中进程的优先级通过top观察进程的PR值考虑系统负载可在任何时刻查看/proc/loadavg, top中的load average也可看出考虑CPU使用率除了用户空间和内核空间的CPU使用率以外还要关注I/O wait,它是指CPU空闲并且等待I/O操作完成的时间比例top中查看wa的值。2. 考虑减少内存分配和释放服务器的工作过程中需要大量的内存使得内存的分配和释放工作尤为重要。可以通过改善数据结构和算法复制度来适当减少中间临时变量的内存分配及数据复制时间而服务器本身也使用了各自的策略来提高效率。例如Apache,在运行开始时一次申请大片的内存作为内存池若随后需要时就在内存池中直接获取不需要再次分配避免了频繁的内存分配和释放引起的内存整理时间。再如Nginx使用多线程来处理请求使得多个线程之间可以共享内存资源从而令它的内存总体使用量大大减少。另外nginx分阶段的内存分配策略按需分配及时释放使得内存使用量保持在很小的数量范围。另外还可以考虑共享内存。共享内存指在多处理器的计算机系统中可以被不同中央处理器CPU访问的大容量内存也可以由不同进程共享是非常快的进程通信方式。但是使用共享内存也有不好的地方就是对于多机器时数据不好统一。shell命令ipcs可用来显示系统下共享内存的状态函数shmget可以创建或打开一块共享内存区函数shmat将一个存在的共享内存段连接到本进程空间, 函数shmctl可以对共享内存段进行多种操作函数shmdt函数分离该共享内存。3. 考虑使用持久连接持久连接也为长连接它本身是TCP通信的一种普通方式即在一次TCP连接中持续发送多分数据而不断开连接。与它相反的方式称为短连接也就是建立连接后发送一份数据就断开然后再次建立连接发送下一份数据 周而复始。是否采用持久连接完全取决于应用特点。从性能角度看建立TCP连接的操作本身是一项不小的开销在允许的情况下连接次数越少越有利于性能的提升; 尤其对于密集型的图片或网页等小数据请求处理有明显的加速所用。HTTP长连接需要浏览器和web服务器的共同协作目前浏览器普遍支持长连接表现在其发出的HTTP请求数据头中包含关于长连接的声明如下Connection: Keep-Alive主流的web服务器都支持长连接比如apache中可以用KeepAlive off关闭长连接。对于长连接的有效使用还有关键一点在于长连接超时时间的设置即长连接在什么时候关闭吗Apache的默认设置为5s, 若这个时间设置过长则可能导致资源无效占有维持大量空闲进程影响服务器性能。4. 改进I/O 模型I/O操作根据设备的不同分为很多类型比如内存I/O, 网络I/O, 磁盘I/O对于网络I/O和磁盘I/O, 它们的速度要慢很多尽管使用RAID磁盘阵列可通过并行磁盘磁盘来加快磁盘I/O速度购买大连独享网络带宽以及使用高带宽网络适配器可以提高网络I/O的速度。但这些I/O操作需要内核系统调用来完成这些需要CPU来调度这使得CPU不得不浪费宝贵的时间来等待慢速I/O操作。我们希望让CPU足够少的时间在i/O操作的调度上如何让高速的CPU和慢速的I/O设备更好地协调工作是现代计算机一直探讨的话题。各种I/O模型的本质区别在于CPU的参与方式。DMA技术I/O设备和内存之间的数据传输方式由DMA控制器完成。在DMA模式下CPU只需向DMA下达命令让DMA控制器来处理数据的传送这样可以大大节省系统资源。异步I/O异步I/O指主动请求数据后便可以继续处理其它任务随后等待I/O操作的通知这样进程在数据读写时不发生阻塞。异步I/O是非阻塞的当函数返回时真正的I/O传输已经完成这让CPU处理和I/O操作达到很好的重叠。I/O多路复用epoll服务器同时处理大量的文件描述符是必不可少的若采用同步非阻塞I/O模型若同时接收TCP连接的数据就必须轮流对每个socket调用接收数据的方法不管这些socket有没有可接收的数据都要询问一次。假如大部分socket并没有数据可以接收那么进程便会浪费很多CPU时间用于检查这些socket有没有可以接收的数据。多路I/O就绪通知的出现提供了对大量文件描述符就绪检查的高性能方案它允许进程通过一种方法同时监视所有文件描述符并可以快速获得所有就绪的文件描述符然后只针对这些文件描述符进行数据访问。epoll可以同时支持水平触发和边缘触发理论上边缘触发性能更高但是代码实现复杂因为任何意外的丢失事件都会造成请求处理错误。epoll主要有2大改进epoll只告知就绪的文件描述符而且当调用epoll_wait()获得文件描述符时返回并不是实际的描述符而是一个代表就绪描述符数量的值然后只需去epoll指定的一个数组中依次取得相应数量的文件描述符即可。这里使用了内存映射(mmap)技术这样彻底省掉了这些文件描述符在系统调用时复制的开销。epoll采用基于事件的就绪通知方式。其事先通过epoll_ctrl()注册每一个文件描述符一旦某个文件描述符就绪时内核会采用类似callback的回调机制当进程调用epoll_wait()时得到通知关于IO模型可以参考笔者前面写的相关文章Java NIO.2关于epoll可以参考笔者前面写的文章select、poll和epoll简介。Sendfile大多数时候我们都向服务器请求静态文件比如图片样式表等。在处理这些请求时磁盘文件的数据先经过内核缓冲区然后到用户内存空间不需经过任何处理其又被送到网卡对应的内核缓冲区接着再被送入网卡进行发送。Linux提供sendfile()系统调用可以讲磁盘文件的特定部分直接传送到代表客户端的socket描述符加快了静态文件的请求速度同时减少CPU和内存的开销。适用场景对于请求较小的静态文件sendfile发挥的作用不那么明显因发送数据的环节在整个过程中所占时间的比例相比于大文件请求时小很多。内存映射Linux内核提供一种访问磁盘文件的特殊方式它可以将内存中某块地址空间和我们指定的磁盘文件相关联从而对这块内存的访问转换为对磁盘文件的访问。这种技术称为内存映射。多数情况下内存映射可以提高磁盘I/O的性能无须使用read()或write()等系统调用来访问文件而是通过mmap()系统调用来建立内存和磁盘文件的关联然后像访问内存一样自由访问文件。缺点在处理较大文件时内存映射会导致较大的内存开销得不偿失。直接I/O在linux 2.6中内存映射和直接访问文件没有本质差异因为数据需要经过2次复制即在磁盘与内核缓冲区之间以及在内核缓冲区与用户态内存空间。引入内核缓冲区的目的在于提高磁盘文件的访问性能然而对于一些复杂的应用比如数据库服务器它们为了进一步提高性能希望绕过内核缓冲区由自己在用户态空间实现并管理I/O缓冲区比如数据库可根据更加合理的策略来提高查询缓存命中率。另一方面绕过内核缓冲区也可以减少系统内存的开销因内核缓冲区本身就在使用系统内存。Linux在open()系统调用中增加参数选项O_DIRECT,即可绕过内核缓冲区直接访问文件,实现直接I/O。在Mysql中对于Innodb存储引擎自身进行数据和索引的缓存管理可在my.cnf配置中分配raw分区跳过内核缓冲区实现直接I/O。5. 改进服务器并发策略服务器并发策略的目的是让I/O操作和CPU计算尽量重叠进行一方面让CPU在I/O等待时不要空闲另一方面让CPU在I/O调度上尽量花最少的时间。一个进程处理一个连接非阻塞I/O这样会存在多个并发请求同时到达时服务器必然要准备多个进程来处理请求。其进程的开销限制了它的并发连接数。但从稳定性和兼容性的角度则其相对安全任何一个子进程的崩溃不会影响服务器本身父进程可以创建新的子进程这种策略典型的例子就是Apache的fork和prefork模式。对于并发数不高如150以内的站点同时依赖Apache其它功能时的应用选择Apache还是可以的。一个线程处理一个连接非阻塞IO这种方式允许在一个进程中通过多个线程来处理多个连接一个线程处理一个连接。Apache的worker模式就是这种典型例子使其可支持更多的并发连接。不过这种模式的总体性能还不如prefork所以一般不选用worker模式。一个进程处理多个连接异步I/O一个线程同时处理多个连接潜在的前提条件就是使用IO多路复用就绪通知。这种情况下将处理多个连接的进程叫做worker进程或服务进程。worker的数量可以配置如Nginx中的worker_processes 4。一个线程处理多个连接异步IO即使有高性能的IO多路复用就绪通知但磁盘IO的等待还是无法避免的。更加高效的方法是对磁盘文件使用异步IO目前很少有Web服务器真正意义上支持这种异步IO。6. 改进硬件环境还有一点要提及的是硬件环境服务器的硬件配置对应用程序的性能提升往往是最直接也是最简单的方式这就是所谓的scale up。这里不做论述。【END】近期热文 面试珍藏最常见的200多道Java面试题被一个熟悉的面试题问懵了String...面试官如何实现幂等性校验年终盘点 | 2019年Java面试题汇总篇(附答案)关注下方二维码订阅更多精彩内容朕已阅