热点诠释态度
分享彰显美德

如何提高服务器并发处理能力

什么是服务器并发处理:在服务器上的多个请求单位时间内处理,更高容量的服务器,也就是越强的服务器的并发处理能力

       有什么方法进行衡量服务器并发处理技术能力

       一,吞吐率

       吞吐量,服务器每单位时间处理的最大请求数,以及单元req/s,从服务器的角度来看,并发用户的实际数量可以理解为服务器当前维护的代表不同用户的文件描述符的总数,即并发连接的数量。 服务器通常限制同时服务的最大用户数,例如apacheMaxClents参数。

       再进一步,对于服务器,服务器想要支持高吞吐量,对于用户,用户只想等待最短的时间,显然,双方都不能满足,所以双方利益的平衡,是我们想要的最大并发用户数。

       二,压力测试

       有一个原则,我们首先要搞清楚,如果100个用户同时分别请求发送到服务器10,和用户请求到服务器1000倍成一排,在服务器上的压力是一样的吗?它实际上是不一样的,因为每个用户连续地发送一个请求实际上指的是一个发送的请求,并接收发送的数据请求后的响应。对于一行中的这种用户请求到服务器1000中,任何时候NIC接收到请求服务器只缓冲器,以及用于100个用户同时请求至服务器10,分别为服务器NIC接收缓冲区高达100个请求等待被处理,那么很明显在服务器上更大的压力。

       压力进行测试前提需要考虑的条件并发用户数: 指在企业某一时刻可以同时向服务器发送数据请求的用户总数(HttpWatch)总请求数-请求资源管理描述-请求等待工作时间(用户选择等待一段时间)-用户使用平均请求的等待时间-服务器平均请求方式处理的时间

       三,硬件环境

       时间压力测试关注和以下两个部分:

       用户进行平均请求等待时间(这里暂不把数据在网络的传输系统时间,还有一个用户PC本地的计算教学时间成本计算入内)

       平均服务器请求处理时间

       平均请求等待时间用来衡量在一定数量的并发用户下单个用户的服务质量,服务器的平均请求处理时间是吞吐量的倒数。

       一般情况下,一个用户请求的平均等待时间=时间平均处理服务器的并发用户请求*

       四,要怎样可以提高服务器的并发处理技术能力

       1,同时增加CPU的计算能力

       服务器之所以可以通过同时进行处理多个请求,在于操作管理系统通过多执行流体系结构设计使得多个任务可以轮流使用信息系统实现资源。

       其中包括CPU、内存以及I/O。 这里的I/O主要是指磁盘I/O和网络I/O

       2,多进程 & 多线程

       多执行流的一般实现是进程的多进程优势,可以依次利用 cpu 时间的多进程优势,对 cpu 计算和 io 操作进行重叠。 这里 i / o 主要是指磁盘 i / o 和网络 i / o,相对于 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 缓存将失效。

       减少使用不必要的锁

       当服务器处理大量并发请求的,也有一些更多的资源来应对竞争的任务抢占请求,则一般采用“锁”机制来控制资源的使用。

       当一个重要任务占用企业资源时,我们可以锁住资源,这时其它工作任务都在等待锁的释放,这个社会现象称为锁竞争。

       通过锁争的性质,我们必须认识到并发请求,以尽量减少对共享资源的竞争。

       比如在允许这种情况下进行关闭服务器访问日志,这可以得到大大减少在锁等待时的延迟时间。要最大不同程度不断减少无辜的等待一个时间。

       这里,无锁编程是由内核完成的,主要是用原子操作代替锁实现共享资源的访问保护。

       当你实际的写入操作过程中使用原子操作,使用锁定命令,这样就可以防止其他任务写这篇内存中,避免数据竞争现象。原子操作比锁定更快,一般快一倍多。

       例如fwrite()将,fopen()函数,其是使用所述附加模式写文件,其原理是利用无锁编程,高复杂性和无锁编程的,但效率是快速的,并且发生的概率低的僵局。

       1,考虑进程优先级

       进程进行调度器会动态结构调整经济运行队列中进程的优先级,通过top观察研究进程的PR值

       考虑系统负载

       视图的/ proc / loadavg在任何时间,平均负载顶部也可以看到

       考虑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请求的性能包含关于长连接语句,如下所示:连接:保持活动

       大多数主流 web 服务器都支持长连接,比如 apache,可以关闭 keepalive。

       为了有效地使用长连接,以及关键的一点是,长连接设置超时时间,即长在连接关闭它?

        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操作。

       我们希望在I/O操作的调度中使CPU减少时间,如何使高速CPU和慢速I/O设备更好地协调工作,是现代计算机一直在讨论的话题。 各种I/O模型的本质区别在于CPU参与的方式。

       DMA技术

       输入输出设备与存储器之间的数据传输由 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并没有进行数据分析可以通过接收,那么发展进程便会浪费很多CPU时间主要用于检查这些socket有没有可以根据接收的数据。

        多路复用I/O就绪通知提供了一种高性能的方案,用于大量文件描述符就绪检查,允许进程以一种方式同时监视所有文件描述符,并且可以快速获得所有就绪文件描述符,然后仅对这些文件描述符进行数据访问。

       Epoll 可以同时支持水平触发器和边缘触发器,边缘触发器理论上更有效,但代码实现非常复杂,因为任何意外的丢失事件都会导致请求处理错误。

       epoll的主要有两大改进:

       epoll只告知就绪的文件描述符,而且当调用epoll_wait()获得相关文件描述符时,返回学生并不是企业实际的描述符,而是通过一个重要代表就绪描述符数量的值,然后我们只需去epoll指定的一个学习数组中依次可以取得一些相应人员数量的文件描述符即可。这里使用了大量内存空间映射(mmap)技术,这样才能彻底省掉了所有这些政策文件描述符在系统调用时需要复制的开销。

       EPOLL的事件通知基础准备。通过epoll_ctrl()为每个注册的文件描述符其前进,一旦文件描述符准备就绪,内核将使用回调机制类似的回调时得到通知的进程调用epoll_wait()

     关于IO模型,可以通过参考文献笔者根据前面写的相关研究文章Java NIO.2;关于epoll,可以提供参考依据笔者认为前面写的文章select、poll和epoll简介。

       Sendfile

        大多数时候,我们向服务器询问静态文件,如图片、样式表等。

       在处理这些请求时,首先将磁盘文件的数据发送到内核缓冲区,然后发送到用户内存空间,不进行任何处理,然后再发送到相应的网卡内核缓冲区,再发送到网卡。

       Linux提供的sendfile()系统调用,特定的部分可以直接针对代表客户端套接字描述符的一个磁盘文件传输,加速静态文件请求的速度,同时降低CPU和存储器开销。

       适用不同场景:对于一个请求较小的静态管理文件,sendfile发挥的作用不那么具有明显,因发送信息数据的环节在整个教学过程中企业所占时间的比例进行相比于大文件请求时小很多。

       内存映射

       Linux内核提供了一种特殊的方式访问磁盘文件,它可以是一块内存地址空间,我们命名的磁盘文件相关联,使访问该存储到磁盘文件访问。这种技术被称为内存映射。

       多数这种情况下,内存映射我们可以有效提高管理磁盘I/O的性能,无须使用read()或write()等系统需要调用来访问文件,而是学生通过mmap()系统调用来研究建立一个内存和磁盘文件的关联,然后像访问内存一样能够自由访问相关文件。

       缺点:内存映射在处理较大文件时会导致较大的内存开销。

       直接I/O

       在 linux 2.6中,内存映射和直接访问文件之间没有本质区别,因为数据需要两次复制,在磁盘和内核缓冲区之间,在内核缓冲区和用户模式内存空间之间。

       引入内核缓冲区的目的是为了提高访问性能的磁盘文件,但是对于一些复杂的应用,如数据库服务器,以进一步提高其性能,希望绕过内核缓冲区,实施和管理用户I / O通过自己的空间缓冲,如数据库查询可以缓存的命中率是基于一个更合理的策略来改善。

       另一重要方面,绕过内核缓冲区也可以通过减少管理系统内存的开销,因内核缓冲区本身就在我们使用信息系统内存。

       Linux的参数选项O_DIRECT开放()系统调用增加,绕过了内核缓冲区直接访问文件,直接I / O。

       在Mysql中,对于Innodb存储技术引擎,自身发展进行分析数据和索引的缓存信息管理,可在my.cnf配置中分配raw分区可以跳过一个内核通过缓冲区,实现企业直接I/O。

        5. 改进的服务器并发策略

       服务器并发策略的目标是使 i / o 操作和 cpu 计算尽可能重叠,这样当 i / o 等待时 cpu 不会空闲,并且 cpu 花在 i / o 调度上的时间尽可能少。

       连接到过程的手柄,一个非阻塞I / O

       这样会存在问题多个并发请求可以同时我们到达时,服务器必然要准备进行多个发展进程来处理数据请求。其进程的开销限制了它的并发连接数。

       但是从稳定性和兼容性的角度来看,这是比较安全的,孩子过程中的任何一个都不会影响服务器本身,父进程可以创建一个新的子进程的崩溃;这种策略典型的例子是叉和Apache prefork的模式。

       对于一个并发数不高(如150以内)的站点进行同时需要依赖Apache其它系统功能时的应用研究选择Apache还是我们可以的。

       线程处理连接,非阻塞IO

       这种方法允许多个线程在一个进程中处理多个连接,一个线程处理一个连接。 Apache 的工作者模式就是一个很好的例子,它支持更多的并发连接。 但是,这种模式的总体性能不如 prefork 模式,因此通常不选择辅助模式。

       处理多个连接的过程中,异步I / O

       一个线程同时进行处理多个连接,潜在的前提基础条件之一就是我们使用IO多路复用就绪通知。

       在这种情况下,连接将处理多个进程称为工作进程或服务的过程。工人的数量可以被配置,如在Nginx的worker_processes 4。

       一个线程进行处理多个网络连接,异步IO

       有高性能IO复用就绪通知,但磁盘IO等待无法避免。 更有效的方法是使用异步IO,磁盘文件Web目前很少有服务器实际支持这种异步IO。

       6. 改进硬件环境

       另一个要提到的是硬件环境。 服务器的硬件配置通常是提高应用程序性能的最直接和最简单的方法。 这就是所谓的放大。 没什么好讨论的。

文章来源:http://www.idcredian.com/h31.html

未经允许不得转载:IDC热点 » 如何提高服务器并发处理能力

分享到: 生成海报

idc热点|国外服务器资讯_国外服务器热点_国外服务器新闻

热点资讯