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

Leah发布于:2022-05-25阅读:0

服务器并发处理能力是什么?

在单位时间内处理服务器的要求越多,服务器的能力就越高,即服务器的并发处理能力就越强

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

测量服务器并发处理能力的方法是什么?

1. 吞吐率

吞吐率,单位时间服务器处理的最大要求,单位req/s。

从服务器的角度来看,实际并发用户的数量可以理解为代表服务器当前维护的不同用户的文件描述符总数,即并发连接数。服务器通常限制同时服务的最多用户数量,例如apache的MaxClents参数。

在这里,对于服务器来说,服务器希望支持高吞吐率。对于用户来说,用户只想等待最少的时间。显然,双方都不满意,所以双方利益的平衡是我们希望的最大并发用户数量。

2. 压力测试

有一个原理一定要先搞清楚,假如100个用户同时向服务器分别进行10个请求,与1个用户向服务器连续进行1000次请求,对服务器的压力是一样吗?实际上是不一样的,因对每一个用户,连续发送请求实际上是指发送一个请求并接收到响应数据后再发送下一个请求。这样对于1个用户向服务器连续进行1000次请求,任何时刻服务器的网卡接收缓冲区中只有1个请求,而对于100个用户同时向服务器分别进行10个请求,服务器的网卡接收缓冲区最多有100个等待处理的请求,显然这时的服务器压力更大。

考虑压力试前提

并发用户数: 指在某一时刻同时向服务器发送请求的用户总数(HttpWatch)

总请求数请求资源描述请求等待时间(用户等待时间)平均等待时间服务器平均请求处理时间硬件环境

压力试验中的关注时间分为以下两种:

用户平均要求等待时间(这里暂时没有网络上的数据传输时间,也没有用户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参与方式。

1. DMA技术

I/O设备与内存之间的数据传输方式DMA完成控制器DMA模式下,CPU只需向DMA下达命令,让DMA处理数据传输的控制器,可以大大节省系统资源。

2. 异步I/O

异步I/O在主动要求数据后,您可以继续处理其他任务,然后等待I/O操作通知,使数据读写过程不会堵塞。

异步I/O是非阻塞的,当函数返回时,真正的I/O传输已经完成,这让CPU处理和I/O操作可以很好地重叠。

3. I/O多路复用

epoll如果处理大量文件描述符的服务器同时处理大量的文件描述符I/O如果同时接收模型TCP必须轮流连接数据socket无论如何,调用接收数据的方法socket询问是否有可接收数据。

假如大部分socket没有数据可以接收,所以过程会浪费很多CPU用时间检查这些socket有可接收的数据吗?I/O就绪通知的出现为大量文件描述符就绪检查提供了一个高性能的方案。它允许过程同时监控所有文件描述符,并快速获得所有就绪文件描述符,然后只访问这些文件描述符。

epoll理论上,边缘触发性能较高,但代码复杂,因为任何事故丢失都会导致请求处理错误。

epoll主要有两大改进:

epoll只告知就绪文件描述符,并作为调用epoll_wait()获取文件描述符时,返回不是实际描述符,而是代表就绪描述符数量的值,然后只需要去epoll在指定的数组中依次获得相应数量的文件描述符,这里使用内存映射(mmap)该技术完全节省了系统调用时复制这些文件描述符的成本。

epoll采用基于事件的就绪通知方式。提前通过epoll_ctrl()注册每个文件的描述符,一旦某个文件的描述符准备就绪,内核用类似的方式callback当过程调用时,回调机制epoll_wait()收到通知

关于IO模型可参考前面写的相关文章Java NIO.2; 关于epoll,可以参考前面写的文章select、poll和epoll简介。

4. Sendfile

大多数时候,我们向服务器请求静态文件,如图片、样式表等。在处理这些请求时,磁盘文件的数据首先通过内核缓冲区,然后到达用户的内存空间,无需任何处理,然后发送到网卡对应的内核缓冲区,然后发送到网卡发送。

Linux提供sendfile()系统调用,可以说磁盘文件的特定部分直接传输到代表客户端socket描述符加快了静态文件的要求,同时减少了要求CPU内存费用。

适用场景: 对于要求较小的静态文件,sendfile由于发送数据的环节在整个过程中所占的时间比例远小于大文件请求,因此发送数据的作用并不明显。

5. 内存映射

Linux内核提供了一种访问磁盘文件的特殊方式,它可以将内存中的地址空间与我们指定的磁盘文件相关联,从而将内存访问转换为磁盘文件访问。该技术称为内存映射。

在大多数情况下,内存映射可以改善磁盘I/O不需要使用性能read()或write()等系统调用访问文件,但通过mmap()系统调用内存与磁盘文件之间的关联,然后像访问内存一样自由访问文件。

缺点:在处理较大文件时,内存映射会导致较大的内存费用,得不偿失。

6. 直接I/O

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

引入核心缓冲区的目的是提高磁盘文件的访问性能。然而,对于一些复杂的应用程序,如数据库服务器,为了进一步提高性能,他们希望绕过核心缓冲区,理,以进一步提高性能I/O缓冲区,如数据库,可以根据更合理的策略提高查询缓存命中率。另一方面,绕过内核缓冲区也可以降低系统内存的成本,因为内核缓冲区本身就在使用系统内存。

Linux在open()在系统调用中添加参数选项O_DIRECT,可绕过内核缓冲区直接访问文件,实现直接访问I/O。

在Mysql中,对于Innodb存储引擎,自己的数据和索引缓存管理,可以my.cnf配置中分配raw分区跳过内核缓冲区,实现直接I/O。

改进服务器并发策略

并发服务器策略的目的是让步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_processes4。

一个线程处理多个连接,异步IO

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

6. 改善硬件环境

还有一点需要提到的是硬件环境。服务器的硬件配置往往是提高应用程序性能最直接、最简单的方式,这就是所谓的scale up。这里不讨论。

微云网络部署了世界120多个国家的数据中心,为世界上许多国家提供海外服务器租赁。所有服务器都可以根据需要配置大带宽和大流量G口独享大带宽服务器,告别网络拥堵;

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:shawn.lee@vecloud.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

本站原创内容未经允许不得转载,或转载时需注明出处:https://news.kd010.com/fwqjs/10071.html

TAG标签:服务器

上一篇:租用国外服务器对SEO的影响有哪些
下一篇:电影网站服务器的配置怎么选

相关文章

返回顶部